将 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 *模块的第一个版本。