搭建CAS SERVER
这里使用cas-overlay-template搭建cas服务器,overlay可以把多个项目war合并成为一个项目,并且如果项目存在同名文件,那么主项目中的文件将覆盖掉其他项目的同名文件。
apereo提供了一个基于层结构的框架,可以帮助开发者快速引入cas server的代码,然后实现自由配置或代码覆盖,打包方式也非常简单。
Github地址:https://github.com/apereo/cas-overlay-template
导入后的初始结构如下:
我们构建如下的主项目结构,其实overlays\org.apereo.cas.cas-server-webapp-tomcat-5.2.3\WEB-INF\classes 目录下已经有模板结构,我们在主项目配置定制化信息,就可以覆盖上面的模板文件。
导入
整个项目是基于spring boot的,所以在application.properties中配置相关信息即可启动。
设置服务端的端口、路径、https秘钥(暂时可不配)相关配置
server.context-path=/cas
server.port=8443
设置jdbc连接配置,这样服务端启动时会从数据库里去进行用户登录认证
##jdbc认证
#Query Database Authentication 数据库查询校验用户名开始
#查询账号密码sql,必须包含密码字段
cas.authn.jdbc.query[0].sql=select * from tbl_user where username=?
#指定上面的sql查询字段名(必须)
cas.authn.jdbc.query[0].fieldPassword=password
#指定过期字段,1为过期,若过期需要修改密码
cas.authn.jdbc.query[0].fieldExpired=expired
#为不可用字段段,1为不可用,
cas.authn.jdbc.query[0].fieldDisabled=disabled
#数据库方言hibernate的知识
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect
#数据库驱动
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
#数据库连接
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/zheng?useUnicode=true&characterEncoding=UTF-8
#数据库用户名
cas.authn.jdbc.query[0].user=root
#数据库密码
cas.authn.jdbc.query[0].password=root
#默认加密策略,通过encodingAlgorithm来指定算法,默认NONE不加密
cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5
启动项目,出现登录界面,用数据库里配置的用户登录即可。
至此,cas server端,也就是单点登录的统一认证中心,搭建好了。
搭建CAS CLIENT
官方提供了一个简单的客户端项目.
Github地址:https://github.com/cas-projects/cas-sample-java-webapp
下载好后 添加tomcat依赖
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8088</port>
<path>/</path>
</configuration>
</plugin>
修改web.xml配置 主要是配置统一认证中心地址和本项目地址
<!--单点登出过滤器-->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://localhost:8443/cas</param-value><!--认证中心地址-->
</init-param>
</filter>
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!--cas认证过滤器-->
<filter>
<filter-name>CAS Authentication Filter</filter-name>
<!--<filter-class>org.jasig.cas.client.authentication.Saml11AuthenticationFilter</filter-class>-->
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://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>
<filter>
<filter-name>CAS Validation Filter</filter-name>
<!--<filter-class>org.jasig.cas.client.validation.Saml11TicketValidationFilter</filter-class>-->
<filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://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>
<init-param>
<param-name>useSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>authn_method</param-name>
<param-value>mfa-duo</param-value>
</init-param>
</filter>
启动此客户端,访问http://localhost:8080/
因为这时候没登录,会先跳到http://localhost:8443/cas/login?service=http%3A%2F%2Flocalhost%3A8080%2F这个认证中心的登录页
如果出现如下错误,是因为此时对接的是http服务,服务端未开启http的支持
解决方法:
第一步、修改services\HTTPSandIMAPS-10000001.json文件,增加http支持
第二步、 在application.properties文件中添加:
cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true
这时重新访问、登录,可以发现认证中心通过后,重定向到了子项目的首页。
如果在启一个子系统2,只要简单改下web.xml里的项目路径就可以。这时在子系统1登录的情况下,再去访问子系统2,可以发现不同登录,就直接跳到了子系统2的首页。这就是单点登录。
单点登出:https://localhost:8443/cas/logout?service=http://localhost:8080
子系统1想要登出的话,直接掉如上的接口即可,service= 后面跟的就是子系统1的地址
登出成功的话,再去访问子系统2,发现需要重新登录了。说明该用户在子系统2里也已经登出了。
如上,就是搭建cas 客户端的步骤,可以发现现有项目想要集成进CAS,只要配置好web.xml里相关过滤器就好。