Shiro集成CAS是在1.2版本里新增的功能。
Shiro-cas模块将应用作为CAS客户端与CAS SSO服务器一起保护web应用。
CAS协议的一个基本理解:
1. 如果你想访问一个被CAS客户端保护的应用,而你还没有进行认证。你讲被重定向到CAS服务端的登录页面。在应用中你需要配置CAS的登录url地址。
http://application./protected/index.jsp → HTTP 302
→ https://server./login?service=http://application./shiro-cas
|
2. 当你填上登录名和密码在CAS服务端进行认证后,你就被重定向到一个带有服务端票据的应用URL。服务端票据是一次性使用的令牌,可在CAS服务端标识用户的唯一性(或用户属性)。
https://server./login?service=http://application./shiro-cas → HTTP 302
→ http://application./shiro-cas?ticket=ST-4545454542121-cas
|
3. 应用去CAS服务端询问票据的有效性,CAS服务端响应经过认证的用户唯一标识。CAS客户端将页面转发到受保护的页面。
http://application./shiro-cas?ticket=ST-4545454542121-cas → HTTP 302
→ http://application./protected/index.jsp
|
如何配置shiro与CAS服务器工作?
我是用maven管理项目的,先引入shiro的jar包 - <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-cas</artifactId>
- <version>1.2.0</version>
- </dependency>
配置web.xml,添加shiro过滤器 - <filter>
- <filter-name>shiroFilter</filter-name>
- <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
- <init-param>
- <param-name>configPath</param-name>
- <param-value>classpath:META-INF/shiro/shiro.ini</param-value>
- </init-param>
- </filter>
-
- <filter-mapping>
- <filter-name>shiroFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
其中shiro.ini为shiro配置文件,可以根据具体情况指定其路径。 shiro.ini配置 - [main]
- casFilter = org.apache.shiro.cas.CasFilter
- #配置验证错误时的失败页面
- casFilter.failureUrl = /error.jsp
-
- #配置casRealm
- casRealm = org.apache.shiro.cas.CasRealm
- casRealm.defaultRoles = ROLE_USER
- casRealm.casServerUrlPrefix = https://www.
- #客户端的回调地址设置,必须和下面的shiro-cas过滤器拦截的地址一致
- casRealm.casService = http://www./shiro-cas
-
- #如果要实现cas的remember me的功能,需要引入下面两个配置
- casSubjectFactory = org.apache.shiro.cas.CasSubjectFactory
- securityManager.subjectFactory = $casSubjectFactory
-
- #设定角色的登录链接,这里为cas登录页面的链接可配置回调地址
- roles.loginUrl = https://www.<span style="color:#000000;">cas</span>.com/login?service=http://shop.:8080/cshop/shiro-cas
-
- [urls]
- #设定shiro-cas过滤器拦截的地址
- /shiro-cas = casFilter
- /admin/** = roles[ROLE_USER]
- /** = anon
这里需要注意的是casRealm.casService设置的回调地址必须和下面casFilter的地址保持一致,否则无法验证成功。
这样一来,当用户经过CAS服务端的有效票据认证后被重定向到应用的服务地址(/shiro-cas),这个过滤器接收服务端票据并创建一个可以被CasRealm使用的CasToken。CasRealm使用被CasFilter创建的CasToken来验证用户的合法性。
casServerUrlPrefix是CAS服务端地址。
casService是应用服务地址,用来接收CAS服务端票据。
validationProcol值为SAML or CAS,默认是CAS。它依赖于CAS服务器的版本,SAML协议只能使用在CAS server version >= 3.1。
defaultRoles是认证通过后默认角色。
defaultPermissions是认证通过后默认权限。
roleAttributeNames是认证通过的用户的角色属性名称,用逗号分隔。
permissionAttributeNames是认证通过的用户的权限属性名称,用逗号分隔。
如果想获得cas返回的更多用户的信息,比如:用户名,用户id,用户邮箱等,可以添加一个过滤器,这个过滤器必须在shiro的过滤器后面,否则获取不到相关的信息。过滤器代码如下: - public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException {
-
- PrincipalCollection principalCollection = SecurityUtils.getSubject()
- .getPrincipals();
-
- if (principalCollection != null) {
- List principals = principalCollection.asList();
-
-
-
-
- Map<String,String> attributes = (Map<String,String>) principals.get(1);
- if (principals != null) {
- String email = attributes.get("email");
- String username = attributes.get("username");
- String uid = attributes.get("uid");
-
- }
- }
- chain.doFilter(request, response);
- }
获取到信息就可以把它设置到session或怎样由你定。
|