Shiro集成CAS是在1.2版本里新增的功能。
Shiro-cas模块将应用作为CAS客户端与CAS SSO服务器一起保护web应用。
CAS协议的一个基本理解:
1. 如果你想访问一个被CAS客户端保护的应用,而你还没有进行认证。你讲被重定向到CAS服务端的登录页面。在应用中你需要配置CAS的登录url地址。
http://application.examples.com/protected/index.jsp → HTTP 302 → https://server.cas.com/login?service=http://application.examples.com/shiro-cas |
2. 当你填上登录名和密码在CAS服务端进行认证后,你就被重定向到一个带有服务端票据的应用URL。服务端票据是一次性使用的令牌,可在CAS服务端标识用户的唯一性(或用户属性)。
https://server.cas.com/login?service=http://application.examples.com/shiro-cas → HTTP 302 → http://application.examples.com/shiro-cas?ticket=ST-4545454542121-cas |
3. 应用去CAS服务端询问票据的有效性,CAS服务端响应经过认证的用户唯一标识。CAS客户端将页面转发到受保护的页面。
http://application.examples.com/shiro-cas?ticket=ST-4545454542121-cas → HTTP 302 → http://application.examples.com/protected/index.jsp |
如何配置shiro与CAS服务器工作?
在你的应用中添加shiro-cas Maven依赖
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-cas</artifactId> <version>version</version> </dependency> |
在你的应用中添加服务端url,这个url被用来接收CAS服务端票据。
在Shiro配置中定义CasFilter:
[main] casFilter = org.apache.shiro.cas.CasFilter casFilter.failureUrl = /error.jsp |
定义过滤器对应的url:
[urls] /shiro-cas = casFilter |
这样一来,当用户经过CAS服务端的有效票据认证后被重定向到应用的服务地址(/shiro-cas),这个过滤器接收服务端票据并创建一个可以被CasRealm使用的CasToken。
CasRealm使用被CasFilter创建的CasToken来验证用户的合法性。在你的shiro配置中添加CasRealm:
[main] casRealm = org.apache.shiro.cas.CasRealm casRealm.defaultRoles = ROLE_USER #casRealm.defaultPermissions #casRealm.roleAttributeNames #casRealm.permissionAttributeNames #casRealm.validationProtocol = SAML casRealm.casServerUrlPrefix = https://server.cas.com/ casRealm.casService = http://application.examples.com/shiro-cas |
casServerUrlPrefix是CAS服务端地址。
casService是应用服务地址,用来接收CAS服务端票据。
validationProcol值为SAML or CAS,默认是CAS。它依赖于CAS服务器的版本,SAML协议只能使用在CAS server version >= 3.1。
defaultRoles是认证通过后默认角色。
defaultPermissions是认证通过后默认权限。
roleAttributeNames是认证通过的用户的角色属性名称,用逗号分隔。
permissionAttributeNames是认证通过的用户的权限属性名称,用逗号分隔。
CAS服务端可以支持 ‘remember me’ 功能,这个信息通过SAML验证或CAS定制验证发布。你需要在Shiro配置中定义CasSubjectFactory:
[main] casSubjectFactory = org.apache.shiro.cas.CasSubjectFactory securityManager.subjectFactory = $casSubjectFactory |
最后,为你的应用增加安全控制。定义需要保护的url地址和需要进行认证的CAS服务端地址:
[main] roles.loginUrl = https://server.cas.com/login?service=http://application.examples.com/shiro-cas
[urls] /protected/** = roles[ROLE_USER] /** = anon |
一个完整的配置例子:
[main] casFilter = org.apache.shiro.cas.CasFilter casFilter.failureUrl = /error.jsp
casRealm = org.apache.shiro.cas.CasRealm casRealm.defaultRoles = ROLE_USER casRealm.casServerUrlPrefix = https://server.cas.com/ casRealm.casService = http://application.examples.com/shiro-cas
casSubjectFactory = org.apache.shiro.cas.CasSubjectFactory securityManager.subjectFactory = $casSubjectFactory
roles.loginUrl = https://server.cas.com/login?service=http://application.examples.com/shiro-cas
[urls] /shiro-cas = casFilter /protected/** = roles[ROLE_USER] /** = anon |