CAS4.2.7单点登录

单点登录控制多个应用统一从一个登录界面进行登录。
准备材料:
Intellij,jdk1.8,maven
Maven的CAS服务端模板,在这个基础上修改配置文件,作为CAS的服务端
https://codeload.github.com/apereo/cas-overlay-template/zip/master
cas使用数据库读取用户信息
https://apereo.github.io/cas/4.2.x/installation/Database-Authentication.html#database-components

cas单点登录服务器默认使用HTTPS协议(可以自己修改配置改为HTTP协议),所以服务器要绑定证书,客户端要在jre内导入证书,服务器注册客户端服务器(未认证授权的服务,不允许使用CAS来认证您访问的目标应用),从数据库内读取用户信息,修改cas登录界面

配置流程

1.修改host文件
根据演示需求,用修改hosts 文件的方法添加域名最简单方便(这个非常重要),
在文件 C:\Windows\System32\drivers\etc\hosts 文件中添加三条

1
2
3
127.0.0.1   server.iwooto.com
127.0.0.1 app1.iwooto.com
127.0.0.1 app2.iwooto.com

2.生成证书

1
keytool -validity 3650 -genkey -v -alias tomcat -keyalg RSA -keystore D:/tomcat.keystore -dname "CN=server.iwooto.com,OU=iwooto,O=iwooto,L=shanghai,ST=shanghai,C=CN" -storepass 123456 -keypass 123456

3.导出crt证书

1
keytool -export -alias tomcat -keystore D:\tomcat.keystore -storepass 123456 -rfc -file D:\tomcat.crt

4.客户端jre导入证书

1
2
//先进入到%JAVA_HOME%\jre\lib\security\目录下-storepass为jre秘钥库的默认密码(changeit)
keytool -import -keystore cacerts -file D:\tomcat.crt -alias tomcat -storepass changeit

5.tomcat配置HTTPS
在tomcat文件 conf/server.xml文件找到:

1
2
3
4
5
<!--
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->

修改成如下:

1
2
3
4
5
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="D:\tomcat.keystore" keystorePass="123456"
URIEncoding="UTF-8"/>

参数说明:
keystoreFile 创建证书的路径
keystorePass 创建证书的密码
6.验证HTTPS配置
其他按照默认配置不作修改,双击%TOMCAT_HOME%\bin\startup.bat 启动tomcat-cas 验证https访问配置.
7.客户端应用的web.xml配置
在web.xml中添加以下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<!-- ======================== 单点登录开始 ======================== -->
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
<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-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 该过滤器负责用户的认证工作,必须启用它 -->
<filter>
<filter-name>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://server.iwooto.com:8443/cas/login</param-value>
<!--这里的server是服务端的IP-->
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://app1.iwooto.com:8070</param-value><!--客户端-->
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://server.iwooto.com:8443/cas/</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://app1.iwooto.com:8070</param-value><!--客户端-->
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

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

<!--
该过滤器使得开发者可以通过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 Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- ======================== 单点登录结束 ======================== -->

8.下载并修改CAS服务端模板
https://codeload.github.com/apereo/cas-overlay-template/zip/master
8.1把WEB-INF/classes/services/HTTPSandIMAPS-10000001.json中的

1
"serviceId" : "^(https|imaps)://.*",

修改为

1
"serviceId" : "^(https|imaps|http)://.*",

或者在WEB-INF/classes/services/下新建一个json文件添加客户端信息,为客户端授权。
8.2配置服务端模板读取数据库用户
服务端模板的pom.xml添加依赖

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>${cas.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>

修改WEB-INF/deployerConfigContext.xml

1
<alias name="acceptUsersAuthenticationHandler" alias="primaryAuthenticationHandler" />

修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!-- 
<alias name="acceptUsersAuthenticationHandler" alias="primaryAuthenticationHandler" /> -->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull"
p:user="root"
p:password="root"
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" />
<alias name="queryDatabaseAuthenticationHandler" alias="primaryAuthenticationHandler" />
<alias name="dataSource" alias="queryDatabaseDataSource" />

修改WEB-INF/cas.properties文件

1
#cas.jdbc.authn.query.sql=

修改为:

1
cas.jdbc.authn.query.sql=select password from app_user where username=?

备注:cas-server-webapp的4.2.0版本读取数据用户本身有bug,建议使用4.2.7版本
更多cas用户信息读取数据库参照
https://apereo.github.io/cas/4.2.x/installation/Database-Authentication.html#database-components