Spring security3 整合CAS.

Similar presentations


Presentation on theme: "Spring security3 整合CAS."— Presentation transcript:

1 Spring security3 整合CAS

2 一CAS介绍 1、CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点: 2、开源的企业级单点登录解决方案。 3、CAS Server 为需要独立部署的 Web 应用。 4、CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

3 二CAS原理及协议 从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图是 CAS 最基本的协议

4 1、CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。 2、在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的

5 三 https 配置 1、生成 server key 进入cmd转到E:\下输入
keytool -genkey -alias casserver -keyalg RSA -keypass changeit -storepass changeit -keystore server.keystore -validity 3600 注:参数 -validity 指证书的有效期(天),缺省有效期很短,只有90天。 生成证书时,您的名字与姓氏是什么,必须添域名或cas server机器名,否则SSL将不能取得TGC信息。(证书至关重要,直接影响CAS是否能正常工作) RSA 生成证书的方式 Changeit 证书密码

6 2、将证书导入到JDK的证书信任库中 第一步是导出证书,命令如下: keytool -export -trustcacerts -alias casserver -file server.cer -keystore server.keystore -storepass changeit 第二步是导入到证书信任库,命令如下: keytool -import -trustcacerts -alias casserver -file server.cer -keystore D:\Java\jre1.6.0_02\lib\security\cacerts -storepass changeit 注:根据不同的JDK版本证书需要导入jdk/jre中。

7 四 cas-server 配置 1、配置服务端tomcate
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8443" minSpareThreads="5" maxSpareThreads="75" enableLookups="true" disableUploadTimeout="true" acceptCount="100" maxThreads="200" scheme="https" secure="true" SSLEnabled="true" clientAuth="false" sslProtocol="TLS" keystoreFile=“../servercas1.keystore" keystorePass="changeit"/> keystoreFile为已经生成的服务器证书的地址 keystorePass为自定义的服务器证书的密码

8 2、部署CAS Server 到CAS网站上下载server程序,将cas-server-webapp-<版本号>
2、部署CAS Server    到CAS网站上下载server程序,将cas-server-webapp-<版本号>.war 拷贝到 tomcat的 webapps 目录,并更名为 cas.war。由于前面已配置好 tomcat 的 https 协议,可以重新启动 tomcat,然后访问: ,如果能出现正常的 CAS 登录页面,则说明 CAS Server 已经部署成功。 3、此时cas-server 端默认的账号验证方式为用户名与密码相同即可,若需改为连接数据库形式则需 1)修改cas/WEB-INF/deployerConfigContext.xml     添加DataSource <bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"><value>……</value></property> <property name=“url”><value>……</value></property> <property name="username"><value>……</value></property> <property name="password"><value>……</value></property> </bean> 2)替换AuthenticationHandler   注释掉原来的     <!-- <bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /> -->

9 <!-- 用sql形式验证 -->
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <property name="sql" value="select password from t_user where username=?" /> <property name="dataSource" ref="dataSource" /> </bean> <!-- 指定表或字段 --> <!-- <bean class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler" abstract="false" lazy-init="default" autowire="default"> <property name=“tableUsers” value=“t_user” /> (表名) <property name="fieldUser" value="username"/> <property name="fieldPassword" value="password"/> </bean> --> <!-- 在用户验证中加入 --> <property name="sql" value="select password from users where username=?" /> <property name=“passwordEncoder” ref=“mypasswordEncoder”/> (自定义加密方式 ,此时需增加加mypasswordEncoder bean)

10 此类默认支持MD5 与SHA1两种加密方式,若不满足需求则可自定义加密方式,需实现PasswordEncoder 接口
<bean id="mypasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"> <constructor-arg value="MD5"/> </bean> 此类默认支持MD5 与SHA1两种加密方式,若不满足需求则可自定义加密方式,需实现PasswordEncoder 接口 4)cas 取消https验证配置 4.1、修改cas server下\WEB-INF\deployerConfigContext.xml文件 <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient" p:requireSecure="false"/> 增加参数p:requireSecure="false",是否需要安全验证,即HTTPS,false为不采用。 4.2 、修改cas server下 WEB-INF\springconfiguration\ticketGrantingTicketCookieGenerator.xml文件 <bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator" p:cookieSecure="false" p:cookieMaxAge="-1" p:cookieName="CASTGC" p:cookiePath="/cas" /> </beans>

11 参数p:cookieSecure="true",TRUE为采用HTTPS验证,与deployerConfigContext
参数p:cookieMaxAge="-1",简单说是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的IE窗口有效,IE关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意IE窗口,都不需要验证。 修改cas server下\WEB-INF\spring-configuration\warnCookieGenerator.xml文件 <bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator" p:cookieSecure="true" p:cookieMaxAge="-1" p:cookieName="CASPRIVACY" p:cookiePath="/cas" /> 两个参数与上面同理。

12 5 返回更多用户信息 1 注释掉 bean <bean id="attributeRepository" class="org.jasig.services.persondir.support.StubPersonAttributeDao"> <property name="backingMap"> <map> <entry key="uid" value="uid" /> <entry key="eduPersonAffiliation" value="eduPersonAffiliation" /> <entry key="groupMembership" value="groupMembership" /> </map> </property> </bean> 重新配置attributeRepository class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao"> <constructor-arg index="0" ref="dataSource"/> <constructor-arg index="1" value="select username, password, enabled from users where {0}"/> <property name="queryAttributeMapping"> <entry key="username" value="username"></entry> <property name="resultAttributeMapping"> <entry key="name" value="enabled"></entry>

13 同时在VIEW-INF/jsp/protocal/2.0/casServiceValidationSuccess.jsp中增加
<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}"> <cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)} </cas:${fn:escapeXml(attr.key)}> </c:forEach> </cas:attributes> </c:if> 在server验证成功后,这个页面负责生成与客户端交互的xml信息,在默认的casServiceValidationSuccess.jsp中,只包括用户名,并不提供其他的属性信息,因此需要对页面进行扩展,以上为新添加部分 客户端获取: AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal(); Map attributes = principal.getAttributes(); String name=attributes .get(“name");

14 四 cas-client配置 1、导入服务端生成证书 复制cas服务端生成证书server.cer 到客户端,将证书导入JDK中
keytool -import -trustcacerts -alias casserver -file server.cer -keystore D:\Java\jre1.6.0_02\lib\security\cacerts -storepass changeit 注 此处的jre必须为JDK路劲下的jre 2、在基于spring security 项目中加入 cas相应的依赖jar包

15 3 设置相应的切入点与filter casEntryPoint 定义为
<http auto-config=“false" entry-point-ref="casEntryPoint" > …………. <custom-filter position="CAS_FILTER" ref="casFilter"/> <custom-filter before="LOGOUT_FILTER" ref="requestSingleLogoutFilter"/> <custom-filter before=“CAS_FILTER” ref=“singleLogoutFilter”/> </http> casEntryPoint 定义为 <beans:bean id="casEntryPoint" class="org.springframework.security.cas.web.CasAuthenticationEntryPoint"> <beans:property name="loginUrl" value=" <beans:property name="serviceProperties" ref="serviceProperties"/> </beans:bean> 声明cas服务器端登录的地址,此处写IP或主机名均可 不使用http的自动配置。 *entry-point-ref="casEntryPoint"作用是认证的入口,是一个实现 AuthenticationEntryPoint接口的类。为ExceptionTranslationFilter类提供认证依据。 <custom-filter position="CAS_FILTER" ref="casFilter"/>使用自定义的Filter,放置在过滤器链的CAS_FILTER的位置

16 <beans:bean id="serviceProperties"
class="org.springframework.security.cas.ServiceProperties"> <beans:property name="service" value=" <beans:property name="sendRenew" value="false"/> serviceProperties 为认证成功后服务端返回的地址. 该地址将作为参数传递到服务端 此处不能写为IP 的形式。需写为主机名(证书生成时写的计算机全名)或域名 sendRenew 为boolean类型 当为true时每新打开窗口则需重新登录 casFilter 配置如下: <!-- cas 认证过滤器 -->   <beans:bean id="casFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter"> <beans:property name="authenticationManager" ref="casAuthenticationManager"/> <beans:property name="authenticationSuccessHandler" ref="authenticationSuccessHandler" /> </beans:bean> 为cas的过滤器当server返回Ticket后 client 需再次将ticket发送到server进行校验,此处可配置成功的Handler与失败的Handler

17 <!-- cas 认证成功控制器 -->
<beans:bean id="authenticationSuccessHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler"> <beans:property name="alwaysUseDefaultTargetUrl" value="true"/> <beans:property name="defaultTargetUrl" value="/welcome/choose" /> </beans:bean> <!-- cas 认证失败控制器 -->       <beans:bean id=“authenticationFailureHandler”           class=“org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler”>           <beans:property name=“defaultFailureUrl” value=“**.jsp" />       </beans:bean>      <!-- 在认证管理器中注册cas认证提供器 -->   <authentication-manager alias="casAuthenticationManager"> <authentication-provider ref="casAuthenticationProvider"/> </authentication-manager>

18 <!-- cas认证提供器,定义客户端的验证方式 -->  
<beans:bean id="casAuthenticationProvider" class="org.springframework.security.cas.authentication.CasAuthenticationProvider">  <!-- 客户端只验证用户名是否合法 -->   <beans:property name="userDetailsService" ref="userService"/> <beans:property name="serviceProperties" ref="serviceProperties" /> <beans:property name="ticketValidator"> <beans:bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator"> <beans:constructor-arg index=“0” value=“ /> <!– 此处必须写主机名或域名,不能写IP 且注意此处的地址不能加login.jsp--> </beans:bean> </beans:property> <beans:property name="key" value="an_id_for_this_auth_provider_only"/>

19 Filter 为 requestSingleLogoutFilter, singleLogoutFilter
Cas 单点注销 Filter 为 requestSingleLogoutFilter, singleLogoutFilter   <!-- 注销客户端 -->         <beans:bean id="singleLogoutFilter"                 class="org.jasig.cas.client.session.SingleSignOutFilter" /> <!-- 注销服务器 --> <beans:bean id="requestSingleLogoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter" > <beans:constructor-arg value=" /> <beans:constructor-arg> <beans:bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler" /> </beans:constructor-arg> <beans:property name="filterProcessesUrl" value="/boda_security_logout" /> </beans:bean>

20 filterProcessesUrl 为注销的filter触发的链接
退出后显示登录页面,并且登录成功后还是会进入到之前的业务系统,那么可以修改cas-servlet.xml文件,在“logoutController”的bean配置中增加属性“followServiceRedirects”,设置为“true”,然后在业务系统的注销连接中加入“service参数”,值为业务系统的绝对URL如: 如果Client要注销,需在Client先注销,之后让Server注销提供的ticket。 如果不这样,不论是只注销Client还是Server,注销后,系统仍然还是可以访问的 注销所连接的url需与login时写的url一致,及要么都是Ip、域名或本地时的主机名,两个链接应对应,否则在注销时服务端无法找到cookie进行注销


Download ppt "Spring security3 整合CAS."

Similar presentations


Ads by Google