将 Apache Shiro 与 CAS SSO 服务器集成
NOTE:
Shiro-CAS 支持已弃用,支持已移至基于 Apache Shiro 的buji-pac4j项目。
- shiro-cas *模块用于保护具有Jasig CAS SSO 服务器的 Web 应用程序。它使启用 Shiro 的应用程序成为 CASClient 端。
对 CAS 协议的基本了解
- 如果要访问受 CASClient 端保护的应用程序,并且未在此应用程序中进行身份验证,则 CASClient 端会将您重定向到 CAS 服务器登录页面。 CAS 登录 URL 中的服务参数定义了用户要登录的应用程序。
http://application.examples.com/protected/index.jsp → HTTP 302 → https://server.cas.com/login?service=http://application.examples.com/shiro-cas
- 您填写登录名和密码,并在 CAS 服务器中进行身份验证,然后 CAS 服务器使用 URL 中的服务凭单将用户重定向到应用程序(服务 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
- 应用程序直接询问 CAS 服务器服务票证是否有效,并且 CAS 服务器通过已验证用户的身份进行响应。通常,CASClient 端会将用户转发到最初调用的受保护页面。
http://application.examples.com/shiro-cas?ticket=ST-4545454542121-cas → HTTP 302 → http://application.examples.com/protected/index.jsp
如何配置 shiro 以与 CAS 服务器一起使用?
Dependency
您需要在应用程序中添加* shiro-cas * Maven 依赖项:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-cas</artifactId>
<version>version</version>
</dependency>
(version> = 1.2.0)。
CasFilter
您必须定义应用程序的服务 URL(必须也在 CAS 服务器中声明)。该 URL 将用于接收 CAS 服务凭单。例如:http://application.examples.com/shiro-cas
在 shiro 配置中,您必须定义CasFilter
:
[main]
casFilter = org.apache.shiro.cas.CasFilter
casFilter.failureUrl = /error.jsp
(当服务票证验证失败时,将调用失败 url)。
以及可以使用的网址:
[urls]
/shiro-cas = casFilter
这样,当 CAS 服务器使用有效的服务票证(认证后)将用户重定向到应用程序服务 URL(/shiro-cas)时,此过滤器将接收服务票证并创建一个CasToken
,供用户使用CasRealm
。
CasRealm
CasRealm
使用CasFilter
创建的CasToken
通过针对 CAS 服务器验证 CAS 服务票证来认证用户。
在 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 服务器的 URL(例如:https://server.cas.com)。
- casService *是应用程序服务 URL,应用程序接收 URL 的 URL 将接收 CAS 服务票证(例如:http://application.examples.com/shiro-cas)。
- validationProcol *可以是 SAML 或 CAS(默认):属性和“记住我”的信息仅通过 SAML 验证协议提供(特定的自定义除外)。它取决于 CAS 服务器的版本:SAML 协议可以与 CAS 服务器版本> = 3.1 一起使用。
NOTE:
如果选择 SAML 验证,则需要一些更具体的依赖项:
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>org.opensaml</groupId>
<artifactId>opensaml</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.apache.santuario</groupId>
<artifactId>xmlsec</artifactId>
<version>1.4.3</version>
</dependency>
- defaultRoles *是 CAS 身份验证成功后赋予身份验证用户的默认角色。
- defaultPermissions *是 CAS 身份验证成功后赋予已身份验证用户的默认权限。
- roleAttributeNames *定义了从 CAS 响应接收到的属性的名称,这些属性定义了要提供给已认证用户的角色(角色以逗号分隔)。
- permissionAttributeNames *定义了从 CAS 响应中接收到的属性的名称,这些属性定义了赋予自定义用户的权限(权限以逗号分隔)。
CasSubjectFactory
在 CAS 服务器中,您可以具有“记住我”的支持。通过 SAML 验证或 CAS 定制验证来推送此信息。
要在 Shiro 中反映 CAS 记住我的状态,您必须在 Shiro 配置中定义一个特定的CasSubjectFactory
:
[main]
casSubjectFactory = org.apache.shiro.cas.CasSubjectFactory
securityManager.subjectFactory = $casSubjectFactory
应用程序的安全性
最后,您必须定义应用程序的安全性。
在您的 Shiro 配置中,您必须使用角色来保护 url(例如):
[urls]
/protected/** = roles[ROLE_USER]
/** = anon
如果用户未通过身份验证,则登录 URL 将在 CAS 服务器上使用应用程序服务 URL 进行定义:
[main]
roles.loginUrl = https://server.cas.com/login?service=http://application.examples.com/shiro-cas
这样,如果未通过身份验证并尝试访问*/protected/*** url,则会将您重定向到 CAS 服务器以进行身份验证。
完整的配置 samples
[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
History
*版本 1.2.0 : shiro-cas *模块的第一个版本。