CAS单点登录
1、CAS介绍
首先我们来说一下CAS,CAS全称为Central Authentication Service即中央认证服务,是一个企业多语言单点登录的解决方案,并努力去成为一个身份验证和授权需求的综合平台。
CAS是由Yale大学发起的一个企业级的、开源的项目,旨在为Web应用系统提供一种可靠的单点登录解决方法(属于 Web SSO )。
CAS协议至少涉及三方:客户端Web浏览器,请求身份验证的Web应用程序和CAS服务器。
它也可能涉及后端服务,如数据库服务器,它没有自己的HTTP接口,但与Web应用程序进行通信。
github地址:1、https://github.com/apereo/cas
2、原理
3、java实现方法
3.1、服务器端(http方式)
目前使用最多的的是apereo的cas-overdelay-template模板实现cas服务器端,地址为https://github.com/apereo/cas-overlay-template,其中的版本分为最新版master和6.0.x版本,这两种版本需要jdk11可以使用,并且使用gradle控制;建议使用5.3.x版本,其源码是由spring boot框架编写;4.2.x版本的源码是利用spring mvc编写,使用时可各取所需,本人使用5.3.x版本进行记录。
下载完成之后可直接对其打包,将其放入:(tomcat路径)\webapps下,启动tomcat即可。(若使用IDE测试,可以更改overlay的包)
在此之前需要更改部分配置:
由于CAS默认使用的是基于https协议,需要改善兼容性因此使用http协议
1、到apache-tomcat-9.0.13\webapps\cas\WEB-INF\classes目录的application,properties添加如下的内容
cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true
2、到apache-tomcat-9.0.13\webapps\cas\WEB-INF\classes\services目录下的HTTPSandIMAPS-10000001.json 修改内容如下,即添加http
"serviceId" : "^(https|http|imaps)://.*",
3、兼容http修改完毕,由于https协议默认使用的端口为8443,我们修改为tomcat的8080端口 到apache-tomcat-9.0.13\webapps\cas\WEB-INF\classes目录的application,properties添加如下的内容
server.port=8080
4、由于使用的静态密码为casuser::Mellon不好记忆, 故而修改密码 到apache-tomcat-9.0.13\webapps\cas\WEB-INF\classes目录的application,properties的最后面修改密码为如下
cas.authn.accept.users=admin::admin//可选配置选项
5、至此,配置完成,浏览器打开项目出现如图,即可成功:
3.2、服务器端指定数据库
在pom文件中加入以下三个包:
<!--数据库认证相关 start-->
<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>${mysql.driver.version}</version>
</dependency>
<!--数据库认证相关 end-->
在此处加入mysql.driver:
<properties>
<cas.version>5.3.9</cas.version>
<springboot.version>1.5.18.RELEASE</springboot.version>
<!-- app.server could be -jetty, -undertow, -tomcat, or blank if you plan to provide appserver -->
<app.server>-tomcat</app.server>
<mainClassName>org.springframework.boot.loader.WarLauncher</mainClassName>
<isExecutable>false</isExecutable>
<manifestFileToUse>${project.build.directory}/war/work/org.apereo.cas/cas-server-webapp${app.server}/META-INF/MANIFEST.MF</manifestFileToUse>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<mysql.driver.version>5.1.46</mysql.driver.version><!--把我加在这里-->
</properties>
打开application.properties:
将最后一行cas.authn.accept.users=casuser::Mellon加井号注释掉,再加入以下内容
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/badmin?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=211314
cas.authn.jdbc.query[0].sql=select * from sys_user where account=?
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
重启Tomcat大功告成。
3.3、客户端(spring boot)
在新建的springboot的pom文件中加入:
<!-- https://mvnrepository.com/artifact/net.unicon.cas/cas-client-autoconfig-support -->
<dependency>
<groupId>net.unicon.cas</groupId>
<artifactId>cas-client-autoconfig-support</artifactId>
<version>1.7.0-GA</version>
</dependency>
在pom.xml做如下配置,配置内容意思很简单,配置内容的原理上面也说到,当访问分布式系统的资源时,会检验有没有ticket,没有ticket的话会跳转到登录界面,登录成功后要跳转回来当前访问的资源。
application .properties添加如下:
cas:
server-url-prefix: http://localhost:8080/cas
server-login-url: http://localhost:8080/cas/login
client-host-url: http://localhost:9100
validation-type: cas
server:
port: 9100
主类中加入@EnableCasClient:
@EnableCasClient
@SpringBootApplication
public class CasStarterApplication {
public static void main(String[] args) {
SpringApplication.run(CasStarterApplication.class, args);
}
}
接口测试:
@RestController
public class TestController {
@GetMapping("/test")
public String get(){
return "test success";
}
}
未授权的服务错误解决方案:
在服务端application.properties加入:
#开启识别json文件,默认false
cas.serviceRegistry.initFromJson=true
访问localhost:9100/test
跳转到登录界面
参考地址:
https://segmentfault.com/a/1190000013728604?utm_source=tag-newest
MVC版本的客户端:
https://segmentfault.com/a/1190000013844049