`
coconut_zhang
  • 浏览: 543543 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

CAS 与 Spring Security 3.1整合配置详解

 
阅读更多

一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。

对于上面提到的两种应用情景,Spring Security 框架都有很好的支持。在用户认证方面,Spring Security 框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID 和 LDAP 等。在用户授权方面,Spring Security 提供了基于角色的访问控制和访问控制列表(Access Control List,ACL),可以对应用中的领域对象进行细粒度的控制。

若Spring Security 整合 CAS单点登录 ,使用CAS进行认证和获取授权信息,使用Spring Security验证权限,则可以很好的把公共的认证和授权与具体应用剥离开来,同时简化应用的配置。本文就Spring Security 与 CAS的整合进行说明。

 

一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。

对于上面提到的两种应用情景,Spring Security 框架都有很好的支持。在用户认证方面,Spring Security 框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID 和 LDAP 等。在用户授权方面,Spring Security 提供了基于角色的访问控制和访问控制列表(Access Control List,ACL),可以对应用中的领域对象进行细粒度的控制。

若Spring Security 整合 CAS单点登录 ,使用CAS进行认证和获取授权信息,使用Spring Security验证权限,则可以很好的把公共的认证和授权与具体应用剥离开来,同时简化应用的配置。本文就Spring Security 与 CAS的整合进行说明。

一 、 基本需求
1. jdk 5.0
2. tomcat 6
3. Spring 3.0.5.RELEASE
4. Spring Security 3.1.0.RELEASE
5. CAS cas-server-3.4.7, cas-client-3.2.0
6. 使用http协议进行传输
7. 通过jdbc进行用户验证,需要通过casserver提供除登录用户名以外的附加信息(用于Spring Security 进行验证权限)

二、搭建CAS Server
1. 把从 http://www.jasig.org/cas/download 上下载cas解压找到 cas-server-3.4.7-releasecas-server-3.4.7modulescas-server-webapp-3.4.7.war , 解压cas-server-webapp-3.4.7.war ,部署在至tomcat上端口为 8080的server上,如部署路径为 http://localhost:8080/cas 。为了达到需求目的,我们主要需要对 /WEB-INF/deployerConfigContext.xml 文件进行修改。

2. 使用jdbc数据源进行用户认证,需要修改deployerConfigContext.xml 的authenticationHandlers方式
<property name="authenticationHandlers">
<list>
<!--
| This is the authentication handler that authenticates services by means of callback via SSL, thereby validating
| a server side SSL certificate.
+-->
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient" />
<!--
| This is the authentication handler declaration that every CAS deployer will need to change before deploying CAS
| into production. The default SimpleTestUsernamePasswordAuthenticationHandler authenticates UsernamePasswordCredentials
| where the username equals the password. You will need to replace this with an AuthenticationHandler that implements your
| local authentication strategy. You might accomplish this by coding a new such handler and declaring
| edu.someschool.its.cas.MySpecialHandler here, or you might use one of the handlers provided in the adaptors modules.
+-->
//注释掉,否则只要用户名和密码一致的话都可以得到认证
<!-- bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" / -->

//数据库认证方式
<!--DATABASE -- >
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="dataSource" />
<property name="sql" value="select password from t_admin_user where login_name=?" />
</bean>

</list>
<property name="authenticationHandlers">

<!-- DATABASE 增加数据源配置 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
<property name="url"><value>jdbc:mysql:///cas?useUnicode=true&amp;characterEncoding=utf-8</value></property>
<property name="username"><value>root</value></property>
</bean>

3.通过casserver提供除登录用户名以外的附加信息(用于Spring Security 进行验证权限),修改/WEB-INF/deployerConfigContext.xml
3.1 修改credentialsToPrincipalResolvers
<property name="credentialsToPrincipalResolvers">
<list>
<bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver" >
<property name="attributeRepository" ref="attributeRepository" /> //增加此属性,为认证过的用户的Principal添加属性
</bean>
<bean class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver" />
</list>
</property>

3.2 修改该文件中默认的 attributeRepositorybean配置
<!-- 使用SingleRowJdbcPersonAttributeDao 获取更多用户的信息 -->
<bean id="attributeRepository" class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao">
<constructor-arg index="0" ref="dataSource"/>
<constructor-arg index="1" value="select role_name,group_name from role where login_name = ?"/>
<!--这里的key需写username,value对应数据库用户名字段 -->
<property name="queryAttributeMapping">
<map>
<entry key="username" value="login_name"/>
</map>
</property>
<!--key对应数据库字段,value对应客户端获取参数 -->
<property name="resultAttributeMapping">
<map>
<entry key="role_name" value="authorities"/> //这个从数据库中获取的角色,用于在应用中security的权限验证
</map>
</property>
</bean>

3.3 修改该文件中最默认的serviceRegistryDao中的属性全部注释掉
这个bean中的RegisteredServiceImpl的ignoreAttributes属性将决定是否添加attributes属性内容,默认为false:不添加,只有去掉这个配置,cas server才会将获取的用户的附加属性添加到认证用的Principal的attributes中去。
<bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl"></bean>

3.4 若采用CAS的 Cas20ServiceTicketValidator 认证,则需要修改WEB-INFviewjspprotocol2.0casServiceValidationSuccess.jsp文件,才能把获取的属性传递至客户端
<%@ page session="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
<cas:authenticationSuccess>
<cas:user>${fn:escapeXml(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.id)}</cas:user>

<c:if test="${not empty pgtIou}">
<cas:proxyGrantingTicket>${pgtIou}</cas:proxyGrantingTicket>
</c:if>
<c:if test="${fn:length(assertion.chainedAuthentications) > 1}">
<cas:proxies>
<c:forEach var="proxy" items="${assertion.chainedAuthentications}" varStatus="loopStatus" begin="0" end="${fn:length(assertion.chainedAuthentications)-2}" step="1">
<cas:proxy>${fn:escapeXml(proxy.principal.id)}</cas:proxy>
</c:forEach>
</cas:proxies>
</c:if>
<!-- 增加如下内容 -->
<c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes)> 0}">
<cas:attributes>
<c:forEach
var="attr"
items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}"
varStatus="loopStatus"
begin="0"
end="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes)-1}"
step="1">
<cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>
</c:forEach>
</cas:attributes>
</c:if>
</cas:authenticationSuccess>
</cas:serviceResponse>

至此,CAS Server 搭建完毕。

三、搭建CAS Client (即Spring Security)应用

1. CAS Client 下需要把spring-security-cas-3.1.0.M2.jar等Spring Security 相关的jar引入,把cas-client-core-3.2.0.jar引入,用于从cas server上获取相关认证与授权信息。

2. CAS Client应用的 web.xml , 增加如下
<!-- spring 配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-security-ns.xml</param-value>
</context-param>

<!-- spring security filter -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- spring 默认侦听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

3. spring security 文件的配置 applicationContext-security-ns.xml

<?xml version="1.0"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">

<!--
Enable security, let the casAuthenticationEntryPoint handle all intercepted urls.
The CAS_FILTER needs to be in the right position within the filter chain.
-->
<security:http entry-point-ref="casAuthenticationEntryPoint" auto-config="true">
<security:intercept-url pattern="/**" access="ROLE_USER"></security:intercept-url>
<security:custom-filter position="CAS_FILTER" ref="casAuthenticationFilter"></security:custom-filter>
</security:http>

<!--
Required for the casProcessingFilter, so define it explicitly set and
specify an Id Even though the authenticationManager is created by
default when namespace based config is used.
-->
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider ref="casAuthenticationProvider"></security:authentication-provider>
</security:authentication-manager>

<!--
This section is used to configure CAS. The service is the
actual redirect that will be triggered after the CAS login sequence.
-->
<bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties">
//http://localhost:8088/SpringSecurity 具体应用
// j_spring_cas_security_check spring的虚拟URL,此标志标识使用 CAS authentication upon return from CAS SSO login.
<property name="service" value="http://localhost:8088/SpringSecurity/j_spring_cas_security_check"></property>
<property name="sendRenew" value="false"></property>
</bean>

<!--
The CAS filter handles the redirect from the CAS server and starts the ticket validation.
-->
<bean id="casAuthenticationFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter">
<property name="authenticationManager" ref="authenticationManager"></property>
</bean>

<!--
The entryPoint intercepts all the CAS authentication requests.
It redirects to the CAS loginUrl for the CAS login page.
-->
<bean id="casAuthenticationEntryPoint" class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">
<property name="loginUrl" value="http://localhost:8080/cas/login"></property> //SSO登录地址
<property name="serviceProperties" ref="serviceProperties"></property>
</bean>

<!--
Handles the CAS ticket processing.
-->
<bean id="casAuthenticationProvider" class="org.springframework.security.cas.authentication.CasAuthenticationProvider">
<property name="authenticationUserDetailsService" ref="authenticationUserDetailsService"/>
<property name="serviceProperties" ref="serviceProperties"></property>
<property name="ticketValidator">
<bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
<constructor-arg index="0" value="http://localhost:8080/cas" /> //SSO验证地址
</bean>
</property>
<property name="key" value="cas"></property>

</bean>
<!-- authorities对应 CAS server的 登录属性, 在此设置到spirng security中,用于spring security的验证 -->
<bean id="authenticationUserDetailsService" class="org.springframework.security.cas.userdetails.GrantedAuthorityFromAssertionAttributesUserDetailsService">
<constructor-arg>
<array>
<value>authorities</value>
</array>
</constructor-arg>
</bean>
</beans>

至此,CAS客户端搭建完毕。

四、总结

通过上述的配置,则具体应用在使用的时候,用户认证和授权则无需过问,只需在应用中配置相关的角色访问权限即可。即,只需对下面的红色部分进行修改,即可以完成应用的认证和授权工作。大大简化了应用和认证与授权的剥离工作

<security:http entry-point-ref="casAuthenticationEntryPoint" auto-config="true">
<security:intercept-url pattern="/**" access="ROLE_USER"></security:intercept-url>
<security:custom-filter position="CAS_FILTER" ref="casAuthenticationFilter"></security:custom-filter>
</security:http>

五、扩展

若在同一SSO下有多个应用,同一户在不同应用下有不同的角色,则考虑扩展获取用户权限的环节;资源和角色在数据库中进行配置等等。

分享到:
评论
1 楼 bewithme 2013-08-09  
哥,你就不能上传点配置文件什么的吗?加我QQ 359709421有事请教呀

相关推荐

    spring-security-3.1.x.zip 源码下载

    这个"spring-security-3.1.x.zip"压缩包包含的是Spring Security 3.1版本的源代码,这对于开发者深入理解其工作原理、自定义功能或者排查问题非常有帮助。下面将详细探讨Spring Security的核心概念、主要组件以及3.1...

    springsecurity整合cas全程

    ### Spring Security 整合 CAS 全程详解 #### 一、引言 ##### 1.1 概述 ###### 1.1.1 单点登录介绍 单点登录(Single Sign-On,简称 SSO)是一种流行的解决方案,用于简化用户在多个相互信任的应用系统之间的身份...

    springsecurity官方文档3.2

    - **命名空间更新**: 介绍了 Spring Security 3.1 中对 XML 命名空间配置所做的改进和新增选项。 #### 3. 安全命名空间配置 - **介绍**: 详细介绍了 Spring Security 提供的 XML 命名空间配置方法。 - **命名空间...

    springsecurity电子书

    在 SpringSecurity电子书中,作者Ben Alex和Luke Taylor提供了对Spring Security的全面介绍,涵盖了从基本概念到高级特性以及如何配置和使用Spring Security的详细指南。 知识点一:Spring Security基础 1. Spring ...

    SSO单点登录Spring-Security & CAS

    - **配置CAS Filter**:Spring Security中有一个专门的CAS Filter,用于处理与CAS Server之间的通信。 - **配置登录和登出逻辑**:定义用户登录和登出的行为。 ##### 3.3 Spring-Security 子系统API Spring ...

    spring security3.1.3 和 spring security3.0.0

    接下来,Spring Security 3.1.3是3.1.x系列的一个维护版本,它在3.0.0的基础上做了进一步优化和bug修复,以提高稳定性和性能。这个版本的一些亮点包括: 1. **Remember Me服务增强**:提供了更多的选项来管理“记住...

    spring security 参考文档.pdf

    #### 一、Spring Security 概念与入门 ##### 1.1 Spring Security 是什么? Spring Security 是一款基于 Spring 框架的安全插件,提供了完整的安全性解决方案,包括身份认证(authentication)、授权...

    spring security reference 3.1.6 使用指南

    Spring Security 3.1版本的更新主要集中在高级更新和命名空间配置更新两个方面。其中,高级更新包括了对Spring 3.1的支持、对SAML的支持以及其他改进。命名空间配置更新则是为了简化配置,使得开发者可以更加容易地...

    spring security 安全权限管理手册

    通过配置 Spring Security,可以与 LDAP 服务器集成,从而利用 LDAP 的用户管理功能。 --- ##### 第22章:通过 OpenID 进行登录 OpenID 是一种开放标准,允许用户使用单一的凭证在多个网站上进行登录。 --- ###...

    Spring security 官网说明文档(英文版)

    - **CAS (spring-security-cas.jar)**: 支持 CAS 单点登录协议。 - **OpenID (spring-security-openid.jar)**: 支持 OpenID 身份验证。 ##### 2.1 新特性 Spring Security 4.0 引入了多项新特性,包括但不限于: - ...

    Spring security

    ### Spring Security 知识点详解 #### 一、Spring Security 概览 ##### 1.1 什么是 Spring Security? Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架。它为 Java 应用程序提供了保护机制,...

    Spring Security 2.0.x完全中文参考文档

    本文档旨在为用户提供一份详尽且全面的Spring Security 2.0.x版本的中文指南,它不仅覆盖了核心概念、配置方法以及实际应用案例,还深入探讨了安全框架的内部工作原理和技术细节。无论是初学者还是有一定经验的安全...

    spring security 参考手册中文版

    CAS - spring-security-cas.jar 26 OpenID - spring-security-openid.jar 26 测试 - spring-security-test.jar 26 2.4.4检出来源 26 3. Spring Security 4.2的新特性 27 3.1 Web改进 27 3.2配置改进 28 3.3杂项 28 4...

    Spring Security 安全权限管理手册.pdf

    - 讨论如何在自定义登录页面中正确配置各种参数,确保与Spring Security的良好交互。 - **4.4 测试一下** - 提供一个测试流程,以验证自定义登录页面的功能是否正常。 **5. 使用数据库管理资源** - **5.1 数据库...

    Spring security 4 帮助文档(英文版)

    ### Spring Security 4 帮助文档核心知识点详解 #### 一、Spring Security 简介 ##### 1.1 什么是 Spring Security? Spring Security 是一个功能强大的安全框架,为基于 Java 的应用程序提供了认证...

    springsecurity.pdf

    ### Spring Security核心知识点详解 #### 一、Spring Security概述与整体架构 ##### 1.1 什么是Acegi Security? Acegi Security(后更名为Spring Security)是Spring框架中的一个子项目,专注于提供强大的安全性...

    Spring Security LDAP 全选管理框架 中文版

    ### Spring Security LDAP全选管理框架知识点详解 #### 一、Spring Security简介 Spring Security是一款用于保护基于Java的应用程序的安全框架,它可以为Web和非Web应用提供认证(Authentication)、授权...

    Spring Security 3.0.1 pdf 中文参考文档

    - **内容:** 包含了一个简单的 Spring Security 应用程序示例,用于演示如何配置和使用 Spring Security。 **3.2 Contacts** - **内容:** 介绍如何在 Spring Security 中配置联系人管理功能。 **3.3 LDAP 例子**...

    SpringSecurity 3.0.1.RELEASE.CHM

    CAS - spring-security-cas-client.jar 1.4.1.7. OpenID - spring-security-openid.jar 1.4.2. 获得源代码 2. Security命名空间配置 2.1. 介绍 2.1.1. 命名空间的设计 2.2. 开始使用安全命名空间配置 2.2.1....

    spring security

    ### Spring Security核心知识点详解 #### 一、Spring Security概述 ##### 1.1 什么是Spring Security? Spring Security是Spring框架中的一个子项目,它为基于Java的应用程序提供了一整套全面的安全服务。Spring ...

Global site tag (gtag.js) - Google Analytics