面向读者
部署CAS服务器端供应商、单点登录方案实施者。
cas单点登录简介
CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:
- 开源的企业级单点登录解决方案。
- CAS Server 为需要独立部署的 Web 应用。
- CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
CAS 原理和协议
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受?;ぷ试吹姆梦是肭?,需要登录时,重定向到 CAS Server。
CAS 最基本的协议过程
详细协议参考: https://apereo.github.io/cas/4.2.x/protocol/CAS-Protocol-Specification.html
第一次登陆APP1应用
登陆APP1后登陆app2
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 官方网站上的相关文档。
cas-server部署(以数据库用户名密码认证为例)
下载源代码:
https://github.com/apereo/cas/releases/tag/v4.0.0
增加数据库认证maven依赖
找到cas-server-webapp\pom.xml,增加
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-webapp-support</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
修改数据源配置
找到
\cas-server-4.0.0\cas-server-webapp\src\main\webapp\WEB-INF\deployerConfigContext.xml
文件添加一个数据源
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://XX.XX.XXX.XXX:3307/database1?characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
找到bean id="authenticationManager"结点,增加自己的密码校验处理规则MyQueryDatabaseAuthenticationHandler,实现个性化实现密码校验规则,修改这个配置。
<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
<constructor-arg>
<bean id='queryDatabaseAuthenticationHandler' class="com.ztesoft.sso.authenticationHandler.MyQueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="dataSource" />
<property name="sql" value="select password,CONCAT(LOGIN_NAME,salt) salt from sys_users where LOGIN_NAME = ?" />
<property name="passwordEncoder" ref="passwordEncoder"/>
</bean>
</constructor-arg>
<property name="authenticationPolicy">
<bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
</property>
</bean>
去除https校验(如有需要)
修改 cas\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml 配置文件,将 p:cookieSecure="true” 改为 p:cookieSecure="false"
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="CASTGC"
p:cookiePath="/cas" />
修改 cas\WEB-INF\spring-configuration\warnCookieGenerator.xml 配置文件,将 p:cookieSecure="true” 改为 p:cookieSecure="false" ,改完后如下:
<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />
修改 deployerConfigContext.xml: 找到"HttpBasedServiceCredentialsAuthenticationHandler" bean 添加:p:requireSecure="false", 改完后如下:
<bean class="org.jasig.cas.authentication.handler.support. HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient"
p:requireSecure="false"/>
打成war包###
对cas-server-webapp执行 clean package maven命令