在eclipse+maven中搭建cas-server环境
单点登录系统的使用还是很广泛的,在之前在微信公众号的开发中就有使用过,但是那时使用的客户端,对服务端的部署,二次开发没有实践。在这里记录下搭建过程。
ps:环境是cas-server-4.2.7
1.单点登录的一般流程
我接触过的单点登录(sso)的流程基本都一致,这里不拘泥于cas,大致记录一下单点登录的登录流程:
1. 用户访问接入sso的应用中需要授权的url地址;
2. 应用拦截到这个请求,发现没有登录,通知客户浏览器重定向到sso地址,同时将原始访问地址当参数用于回调(ps:互联网公司提供的sso可能会要求同意的回调地址,在这种情况下一般会提供一个stge参数,可以用来保存当前状态)。
3. sso收到请求(注意是由客户浏览器发起的),先检查该用户是否已经登陆了sso:已登陆的,直接生成票据回调;未登陆的展示登陆页。
4. 用户登陆成功后在cookies中写入登陆信息,通知客户浏览器重定向到应用服务器的回调地址,附加票据参数。
5. 应用系统收到回调的请求(分统一回调地址和直接原始地址,原始地址的需要增加拦截器实现登陆流程),应用系统访问sso的登陆验证接口,验证票据的有效性,并获取用户信息,并与本应用的用户做关联。
6. 应用服务器返回原始访问地址的内容,对于统一回调地址的,通过stge差数,获取缓存的实际地址,通知客户浏览器重定向,否则自己拦截器放行即可。
2.cas-server的搭建过程
2.1.创建项目
创建一个基于maven的web项目,不在详细介绍,主要我们来看pom.xml
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-webapp</artifactId>
<version>4.2.7</version>
<type>war</type>
<scope>runtime</scope>
</dependency>
加入这一句,这样这个项目就可以执行了,但是cas是限定https访问的,我们需要为tomcat服务器分配证书:
1. 首先获取到一个ssl证书,不管是自己生成,还是从机构申请。
2. 在eclipse的servers项目中找到对应tomcat的配置文件,在server.xml中将这段代码的注释去掉,并配置上证书的路径及密码,以支持https访问
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" keystoreFile="conf/cas.fyuhome.com.jks" keystorePass="yu137267">
</Connector>
好了,现在可以启动项目,通过https和域名访问,发现已经可以展示登陆页面了,效果是这样的。
默认用户为casuser Mellon
2.3使用数据库管理用户
现在的用户是在配置文件中写死的,在真正使用的时候肯定不能用配置文件管理用户,现在让我们将其改成使用数据库进行用户验证。
cas-server已经提供了一套组件实现了基本的数据库用户验证,只需要改些配置文件即可。
到maven的本地库路径找到cas-server的war包,将war包web-inf目录下的配置文件复制一份到项目resources目录下,只需要拷贝需要修改的,需要拷贝的代码如图所示:
注意这里有个坑 这些配置文件的根是web-info,而resources的默认部署文件夹是web-inf/classes,所以需要修改一下部署配置:
现在修改配置文件deployerConfigContext.xml,增加如下配置,用于注册jdbc处理组件:
<bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">
<constructor-arg value="MD5"/>
</bean>
<bean id="queryDatabaseAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="passwordEncoder" ref="MD5PasswordEncoder"/>
</bean>
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="org.postgresql.Driver"
p:jdbcUrl="jdbc:postgresql://127.0.0.1:5432/cas"
p:user="cas"
p:password="123456"
p:initialPoolSize="6"
p:minPoolSize="6"
p:maxPoolSize="18"
p:maxIdleTimeExcessConnections="120"
p:checkoutTimeout="10000"
p:acquireIncrement="6"
p:acquireRetryAttempts="5"
p:acquireRetryDelay="2000"
p:idleConnectionTestPeriod="30"
p:preferredTestQuery="select 1"/>
数据库配置根据自己的数据库进行修改,这里使用的是postgresql,密码加密规则是md5。
修改deployerConfigContext.xml,将
<alias name="acceptUsersAuthenticationHandler" alias="primaryAuthenticationHandler" />
修改为
<alias name="queryDatabaseAuthenticationHandler" alias="primaryAuthenticationHandler" />
使之前新加的配置生效
另外修改一下cas.properties,增加查询使用的sql
cas.jdbc.authn.query.sql=select passwd from "sampleUser" where "userName"=?
现在登陆数据库,建立相应的表,确保sql可以正常执行,在表中行政一个用户,注意密码需要md5加密后的。
现在,重启项目,应该已经可以使用数据库中的账号进行登陆。
这里插入一句,cas高版本客户端也需要支持https,如果需要支持http需要修改HTTPSandIMAPS-10000001.json
改为
"serviceId" : "^(https|imaps|http)://.*",
3.自定义实现用户验证
要自定义验证用户名密码,只需要参考org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler 实现AbstractUsernamePasswordAuthenticationHandler接口,再修改下配置文件即可。