CAS SSO 4.0 用户数据库验证

1. 概述 
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 
耶鲁大学(yale)开发的单点登录(Single Sign On)系统称为CAS(Central Authentication Service)被设计成一个独立的Web应用程序(cas.war)。 
CAS在2004年12月成为Jasig项目,所以也叫JA-SIG CAS。 
本文中服务器版本基于4.0.0版本,对应的客户端版本为3.3.3;
官网:http://jasig.github.io/cas/4.0.0/index.html 
2. CAS 原理和协议 
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。图1 是 CAS 最基本的协议过程:
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 的合法性。 
在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。 
另外,CAS 协议中还提供了 Proxy (代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考 CAS 官方网站上的相关文档。 
3. 环境 
    • Tomcat 8.x 本文中安装目录为: D:\tool\apache-tomcat-8.0.21
    • JDK 8 本文中安装目录为: D:\tool\Java\jdk1.8.0_45
    • CAS Server版本: cas-server-4.0.0
    • CAS Client版本: cas-client-3.3.3
关于CAS SSO的证书配置以及简单的验证可以到博主之前的博文 : CAS SSO 简介
4 .CAS Server 用户认证定制 
首先,打开 D:\tool\apache-tomcat-8.0.21\webapps\cas\WEB-INFdeployerConfigContext.xml

注释掉默认的用户验证,注释的代码如下:

    <bean id="primaryAuthenticationHandler"
          class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
        <property name="users">
            <map>
                <entry key="casuser" value="Mellon"/>
            </map>
        </property>
    </bean>

添加JDBC验证方式如下:

	<!-- 数据库连接 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
		<property name="driverClass" value="com.mysql.jdbc.Driver"/>    
		<property name="jdbcUrl" value="jdbc:mysql://192.168.0.10:3306/college?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"/>    
		<property name="user" value="root"/>
		<property name="password" value="root 1"/>
		<!-- 博主遇到的MySQL8小时问题 -->
		<property name="preferredTestQuery" value="SELECT 1"/>    
		<property name="idleConnectionTestPeriod" value="18000"/>    
		<property name="testConnectionOnCheckout" value="true"/>
	</bean>
	<!-- 可选配置:数据库加密方式 -->
	<bean id="passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"
		c:encodingAlgorithm="SHA1"
		p:characterEncoding="UTF-8" />
	
	<bean id="dbAuthHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
		p:dataSource-ref="dataSource"
		p:sql="select password from t_user_login where username=? and type='1'"
		p:passwordEncoder-ref="passwordEncoder" />

找到bean的id为authenticationManager做以下修改.

	<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
        <constructor-arg>
            <map>
                <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
                <!--<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" /> -->
				<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>
            </map>
        </constructor-arg>
		<property name="authenticationPolicy">
            <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
        </property>
    </bean>

根据上述配置,我们需要在D:\apache-tomcat-8.0.21\webapps\cas\WEB-INF\lib中加入c3p0-0.9.1.2.jar包、mysql-connector-java-5.1.21.jar包和cas-server-support-jdbc-4.0.0.jar包。

5、CAS Client 配置

	<!-- 单点登出监听器 -->
	<listener>
		<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
	</listener>
	<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
	<filter>
	   <filter-name>CAS Single Sign Out Filter</filter-name>
	   <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
	</filter>

	<!-- 该过滤器负责用户的认证工作,必须启用它 -->
	<filter>
	  <filter-name>CAS Authentication Filter</filter-name>
	  <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
	  <init-param>
		<param-name>casServerLoginUrl</param-name>
		<param-value>https://localhost:8443/cas/login</param-value>
	  </init-param>
	  <init-param>
		<param-name>serverName</param-name>
		<param-value>http://localhost:8080</param-value>
	  </init-param>
	</filter>

	<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
	<filter>
		<filter-name>CAS Validation Filter</filter-name>
		<filter-class>org.jasig.cas.client.validation.Cas10TicketValidationFilter</filter-class>
		<init-param>
			<param-name>casServerUrlPrefix</param-name>
			<param-value>https://localhost:8443/cas</param-value>
		</init-param>
		<init-param>
			<param-name>serverName</param-name>
			<param-value>http://localhost:8080</param-value>
		</init-param>
		<init-param>
			<param-name>redirectAfterValidation</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>

	<!-- 
		该过滤器负责实现HttpServletRequest请求的包裹,
		比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 
	-->
	<filter>
	  <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
	  <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
	</filter>

	<!-- 
		该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
		比如AssertionHolder.getAssertion().getPrincipal().getName().
	 -->
	<filter>
	  <filter-name>CAS Assertion Thread Local Filter</filter-name>
	  <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
	</filter>

	<filter-mapping>
	   <filter-name>CAS Single Sign Out Filter</filter-name>
	   <url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>CAS Authentication Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>CAS Validation Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>CAS Assertion Thread Local Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

转载地址: http://itindex.net/detail/51110-cas-4.0-登录

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值