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