1.背景介绍 什么是CAS

单点登录(SSO),在多系统之间用户只需要登录一次就可以访问所有互相信任的系统

SSO基础的访问流程:

1. 访问服务: SSO 客户端发送请求访问应用系统提供的服务资源。

2. 定向认证: SSO 客户端会重定向用户请求到 SSO 服务器。

3. 用户认证:用户身份认证。

4. 发放票据: SSO 服务器会产生一个随机的 Service Ticket 。

5. 验证票据: SSO 服务器验证票据 Service Ticket 的合法性,验证通过后,允许客户端访问服务。

6. 传输用户信息: SSO 服务器验证票据通过后,传输用户认证结果信息给客户端

CAS是一个应用实例,基础流程如下:

springboot免密单点登录接口设计_客户端

CAS分为Server和Client端,Cas Server需要独立部署,主要负责对用户的认证;CAS client 负责处理对客户端受保护资源的访问请求,需要登录的时候重定向到server 端

2.搭建CAS5.3

采用JAVA1.8,则建议采用基于CAS5.3版本的,使用Maven工程构建,CAS5.X之后使用的是基于SpringBoot的,模版引擎使用Thymeleaf.

2.1下载地址

CAS Server5.3版本,可以下载ZIP包,并解压至自己的目录下
2.2打包成服务端的war包

在解压目录下进入cmd,执行 mvn package (前提保证自己的环境有maven),即可在target下生成cas.war包

2.3WAR包在tomcat下启动,然后修改一些可选的参数

在2.2复制步骤完成后,即可启动tomcat,启动后在即可在tomcat的webapps目录下看到解压后的cas目录

修改参数:

1.由于CAS默认使用https,为了方便springboot搭建的客户端采用http访问,需要改为兼容使用http协议

在webapps\cas\WEB-INF\classes目录的application,properties添加如下的内容

springboot免密单点登录接口设计_单点登录_02

2.在webapps\cas\WEB-INF\classes\services目录下的HTTPSandIMAPS-10000001.json ,修改以兼容https

springboot免密单点登录接口设计_客户端_03

3.也可以修改端口,默认是https协议8443端口,

可在webapps\cas\WEB-INF\classes目录的application,properties添加如下的内容

springboot免密单点登录接口设计_springboot_04

4.修改默认的登录账号和密码

在webapps\cas\WEB-INF\classes目录的application,properties的最后面修改密码为如下

springboot免密单点登录接口设计_cas_05

5.保存修改,直接重启tomcat,修改就会生效

3.采用Springboot搭建客户端

1.在pom.xml中加入以下关键的依赖

<!-- 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>

2.在application.yml中添加以下配置,应该还是比较好理解

springboot免密单点登录接口设计_springboot_06

ValidationType源码中的定义,有三种类型,CAS\CAS3\SAML,协议方面没有太多研究

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package net.unicon.cas.client.configuration;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Import;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({CasClientConfiguration.class})
public @interface EnableCasClient {
    public static enum ValidationType {
        CAS,
        CAS3,
        SAML;

        private ValidationType() {
        }
    }
}

3.添加@EnableCasClient

@EnableCasClient
@SpringBootApplication
public class CasClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(CasClientApplication.class, args);
    }

}

4.controller层写测试controller

@RestController
public class TestController {

    @GetMapping("/castest")
    public String casTest(){
        return "cas success";
    }

}

5.启动springboot项目,访问 localhost:9100/castest

则会跳转至登录页面

springboot免密单点登录接口设计_java_07

输入用户名和密码 admin/admin即可访问当前访问的资源.

4.访问dashboard

可能你会发现访问登录页面下的dashboard会提示没有权限之类的错误,解决办法:需要加新的配置信息.

1.在application.properties中修改如下信息

springboot免密单点登录接口设计_springboot_08

2.在application.properties中新增如下信息

cas.adminPagesSecurity.ip=.+
cas.monitor.endpoints.dashboard.enabled=true 
 cas.monitor.endpoints.dashboard.sensitive=falsecas.monitor.endpoints.discovery.enabled=true 
 cas.monitor.endpoints.discovery.sensitive=falsecas.monitor.endpoints.auditEvents.enabled=true 
 cas.monitor.endpoints.auditEvents.sensitive=falsecas.monitor.endpoints.authenticationEvents.enabled=true 
 cas.monitor.endpoints.authenticationEvents.sensitive=falsecas.monitor.endpoints.configurationState.enabled=true 
 cas.monitor.endpoints.configurationState.sensitive=falsecas.monitor.endpoints.healthCheck.enabled=true 
 cas.monitor.endpoints.healthCheck.sensitive=falsecas.monitor.endpoints.loggingConfig.enabled=true 
 cas.monitor.endpoints.loggingConfig.sensitive=falsecas.monitor.endpoints.metrics.enabled=true 
 cas.monitor.endpoints.metrics.sensitive=falsecas.monitor.endpoints.attributeResolution.enabled=true 
 cas.monitor.endpoints.attributeResolution.sensitive=falsecas.monitor.endpoints.singleSignOnReport.enabled=true 
 cas.monitor.endpoints.singleSignOnReport.sensitive=falsecas.monitor.endpoints.statistics.enabled=true 
 cas.monitor.endpoints.statistics.sensitive=falsecas.monitor.endpoints.trustedDevices.enabled=true 
 cas.monitor.endpoints.trustedDevices.sensitive=falsecas.monitor.endpoints.status.enabled=true 
 cas.monitor.endpoints.status.sensitive=falsecas.monitor.endpoints.singleSignOnStatus.enabled=true 
 cas.monitor.endpoints.singleSignOnStatus.sensitive=falsecas.monitor.endpoints.springWebflowReport.enabled=true 
 cas.monitor.endpoints.springWebflowReport.sensitive=falsecas.monitor.endpoints.registeredServicesReport.enabled=true 
 cas.monitor.endpoints.registeredServicesReport.sensitive=falsecas.monitor.endpoints.configurationMetadata.enabled=true 
 cas.monitor.endpoints.configurationMetadata.sensitive=false

3.另外在user-detail.properties里面新增管理员的账号信息,只有这里的账号可以访问status

springboot免密单点登录接口设计_springboot_09

4.直接重启tomcat即可访问dashboard

springboot免密单点登录接口设计_java_10