1 单点登录与CAS
单点登录(Single Sign On,SSO)是一种登录管理机制,主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录。常见的例子就是,当我们在淘宝网上登录了之后,如果再访问天猫网的话是不需要再次登录的。
CAS是SSO的一种实现方式,CAS系统分为服务端与客户端,服务端提供登录认证的功能,客户端需要跳转到服务端进行登录认证,大体流程如下(图转自 官网 ):
关于SSO和CAS,这里有一篇详细的 文章
2 CAS 服务端搭建
2.1 SSL配置
CAS 服务端登录需要使用https,在本地我们可以使用 JDK 自带的 keytool 工具生成数字证书,具体流程和配置如下:
a 修改hosts文件,将要配置的CAS服务端域名映射到本地:
127.0.0.1 www.laixiaoming.com
b 生成密钥库文件,这里设置密钥库口令,名字与姓氏处填写单点登录服务器的域名(这里是 www.laixiaoming.com),其余项可随便填写。654321,设置密钥口令:654321,两者须相同:
keytool -genkey -alias localhost -keyalg RSA -keysize 2048 -validity 3660 -keystore localhost.keystore
c 查看生成的密钥库,输入密钥库密码654321:
keytool -list -keystore localhost.keystore
d 生成crt证书文件,输入密钥库密码654321:
keytool -export -alias localhost -keystore localhost.keystore -file localhost.crt
e 客户端信任证书,这里需要输入的密码是changeit:
keytool -import -keystore "D:\Program Files\Java\jdk1.8.0_66\jre\lib\security\cacerts" -file localhost.crt -alias localhost
f tomcat配置,server.xml配置:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="200"
SSLEnabled="true"
scheme="https"
secure="true"
clientAuth="false"
sslProtocol="TLS"
keystoreFile="D:\dev\localhost.keystore"keystorePass="654321" />
2.2 新建项目
CAS已经提供了服务端的基本war包实现,我们只需在其基础上作修改即可,使用maven 的oerlay配置可以通过覆盖的方式来进行修改。
a 新建Maven webapp项目,这里命名为cas-server-demo,引入依赖:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>gdou.laixiaoming</groupId>
<artifactId>cas-server-demo</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>cas-server-demo Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<cas.version>5.2.5</cas.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-webapp</artifactId>
<version>${cas.version}</version>
<type>war</type>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<finalName>cas</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<warName>cas</warName>
<overlays>
<overlay>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-webapp</artifactId>
</overlay>
</overlays>
</configuration>
</plugin>
</plugins>
</build>
</project>
b 打包,选择上面我们配置的tomcat,启动:
浏览器打开https://www.laixiaoming.com:8443/cas/login,默认登录名和密码是casuser
和Mellon
,输入后可成功登录
2.3 配置数据库认证
上面我们成功搭建了CAS Server,但是只能使用默认的用户名和密码进行登录,如果我们的用户名和密码是存储在数据库的话,需要引入 JDBC的支持并进行配置:
a 首先,pom.xml配置文件中增加依赖:
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>${cas.version}</version>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc-drivers</artifactId>
<version>${cas.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
b 创建用户密码表:
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`userName` varchar(15) DEFAULT NULL,
`password` char(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
c 将war包中的的application.properties复制出来:
放到项目如下位置,这里的路径需要对应(确保部署后的application.properties可以对原文件进行覆盖),才能实现更新:
d 修改application.properties,关于JDBC这里的更详细的配置,可以访问官网 database-authentication部分:
#数据库连接配置
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=mysql
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/cas_auth
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect
##从数据库中获取用户名和密码进行匹配登录
cas.authn.jdbc.query[0].sql=SELECT * FROM `user` WHERE userName=?
cas.authn.jdbc.query[0].fieldPassword=password
e 重新构建项目并启动,输入数据库中存在的用户名和密码,是可以成功登录的;
完整项目见GitHub
参考:
https://blog.csdn.net/qq_34021712/article/category/8004639/1