欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

springboot 集成cas5.3 实现sso单点登录详细流程

程序员文章站 2022-06-19 15:11:55
什么是单点登录?单点登录(single sign on),简称为 sso,是目前比较流行的企业业务整合的解决方案之一。sso的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统...

什么是单点登录?

单点登录(single sign on),简称为 sso,是目前比较流行的企业业务整合的解决方案之一。sso的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。

sso单点登录访问流程主要有以下步骤:

  • 访问服务:sso客户端发送请求访问应用系统提供的服务资源。
  • 定向认证:sso客户端会重定向用户请求到sso服务器。
  • 用户认证:用户身份认证。
  • 发放票据:sso服务器会产生一个随机的service ticket。
  • 验证票据:sso服务器验证票据service ticket的合法性,验证通过后,允许客户端访问服务。
  • 传输用户信息:sso服务器验证票据通过后,传输用户认证结果信息给客户端。

springboot 集成cas5.3 实现sso单点登录详细流程
(作者补充:其实简单来说,cas就是*认证服务,就是单点登录,单点登录简称为sso!)

cas服务端部署

地址:https://github.com/apereo/cas-overlay-template/tree/5.3
1、解压下载的zip压缩包
2、解压后使用maven命令打包

mvn package

3、把target下生成的war包重命名为cas.war放到tomcat下
4、启动tomcat
5、找到解压的文件

由于cas默认使用的是基于https协议,需要改为兼容使用http协议,打开对应你的目录文件:

d:\tomcat8\webapps\cas\web-inf\classes\application.properties

修改application.properties文件,添加下面配置,使用http

#使用http协议
cas.tgc.secure=false
cas.serviceregistry.initfromjson=true

#由于https协议默认使用的端口为8443,还需我们修改为tomcat的8080端口
server.port=8080

修改httpsandimaps-10000001.json文件

d:\tomcat8\webapps\cas\web-inf\classes\services目录下的httpsandimaps-10000001.json

把原来的serviceid内容改成如下

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

兼容http修改完毕。

修改配置中的登录用户名密码

cas.authn.accept.users=yyh::123456

cas服务器端搭建完毕,重启tomcat 进行测试,在浏览器中输入下面地址,进行访问

http://localhost:8080/cas/login

springboot 集成cas5.3 实现sso单点登录详细流程
springboot 集成cas5.3 实现sso单点登录详细流程
springboot 集成cas5.3 实现sso单点登录详细流程

服务端就已经搭好了,并且可以通过登录退出了。

cas客户端搭建

在新建的springboot项目的pom.xml添加如下依赖(匹配对应的版本)

<dependency>
    <groupid>net.unicon.cas</groupid>
    <artifactid>cas-client-autoconfig-support</artifactid>
    <version>2.3.0-ga</version>
</dependency>

在resources下新建application.properties

server.port=8088
#cas服务端的地址
cas.server-url-prefix=http://localhost:8080/cas
#cas服务端的登录地址
cas.server-login-url=http://localhost:8080/cas/login
#当前服务器的地址(客户端)
cas.client-host-url=http://localhost:8081
#ticket校验器使用cas30proxyreceivingticketvalidationfilter
cas.validation-type=cas3

application启动类上添加注解

import net.unicon.cas.client.configuration.enablecasclient;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
//启用cas
@enablecasclient
@springbootapplication
public class casclient2application {

    public static void main(string[] args) {
        springapplication.run(casclient2application.class, args);
    }

}

第一个客户端的controller

import org.jasig.cas.client.authentication.attributeprincipal;
import org.jasig.cas.client.validation.assertion;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.restcontroller;

import javax.servlet.http.httpsession;

import static org.jasig.cas.client.util.abstractcasfilter.const_cas_assertion;

@restcontroller
public class controller {

    @requestmapping("/sso-test1")
    public string test1(httpsession session){

        assertion assertion = (assertion)session.getattribute(const_cas_assertion);
        attributeprincipal principal = assertion.getprincipal();
        string loginname = principal.getname();

        return "sso-test1,当前登录账户"+loginname;
    }
}

一个客户端就添加好了,添加另一个客户端出端口其他基本也是一样

第二个客户端的controller

import org.jasig.cas.client.authentication.attributeprincipal;
import org.jasig.cas.client.validation.assertion;
import org.springframework.boot.autoconfigure.enableautoconfiguration;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.restcontroller;

import javax.servlet.http.httpsession;

import static org.jasig.cas.client.util.abstractcasfilter.const_cas_assertion;

@restcontroller
public class controller {

    @requestmapping("/sso-test2")
    public string test1(httpsession session){

        assertion assertion = (assertion)session.getattribute(const_cas_assertion);
        attributeprincipal principal = assertion.getprincipal();
        string loginname = principal.getname();
        return "sso-test222222,当前登录账户"+loginname;
    }
}

效果

在没有登录的情况下访问 http://localhost:8081/sso-test1

springboot 集成cas5.3 实现sso单点登录详细流程

直接跳到了登录界面,并且把回调地址也带上了

访问第二个客户端 http://localhost:8082/sso-test2

springboot 集成cas5.3 实现sso单点登录详细流程

跟第一个也是一样,这次我们随便登录一个

springboot 集成cas5.3 实现sso单点登录详细流程

登录后,执行了回调接口,刷新一下第一个客户端的地址

springboot 集成cas5.3 实现sso单点登录详细流程

也登录成功了。

配置统一登出

添加登出接口controller

/**
 * 退出 后自动重定向自定义接口
 * @param request
 * @return
 */
@requestmapping("/system/logout1")
public string logout1(httpservletrequest request) {
    httpsession session = request.getsession();
    session.invalidate();
    return "redirect:http://localhost:8080/cas/logout?service=http://localhost:8081/system/logoutsuccess";

}

/**
 * 退出成功页
 * @return
 */
@requestmapping("/system/logoutsuccess")
@responsebody
public string logoutsuccess() {
    return "test1成功退出!";
}

设置cas认证中心允许重定向跳转

打开你的cas认证中心里的 application.properties 文件,添加如下配置

#退出登录后允许跳转
cas.logout.followserviceredirects=true

新建config配置文件

import org.jasig.cas.client.authentication.authenticationfilter;
import org.jasig.cas.client.session.singlesignoutfilter;
import org.jasig.cas.client.session.singlesignouthttpsessionlistener;
import org.jasig.cas.client.util.httpservletrequestwrapperfilter;
import org.jasig.cas.client.validation.cas30proxyreceivingticketvalidationfilter;
import org.springframework.boot.web.servlet.filterregistrationbean;
import org.springframework.boot.web.servlet.servletlistenerregistrationbean;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;

import java.util.eventlistener;
import java.util.hashmap;
import java.util.map;

@configuration
public class config {

    //cas认证服务中心地址
    private static final string cas_server_url_prefix = "http://localhost:8080/cas/";

    //cas认证服务中心   系统登录地址
    private static final string cas_server_url_login = "http://localhost:8080/cas/login";

    //你自己的客户端1的地址
    private static final string server_name = "http://localhost:8081/";

    /**
     * description: 登录过滤器
     * @param: []
     * @return: org.springframework.boot.web.servlet.filterregistrationbean
     */
    @bean
    public filterregistrationbean filtersingleregistration() {
        filterregistrationbean registration = new filterregistrationbean();
        registration.setfilter(new singlesignoutfilter());
        // 设定匹配的路径
        registration.addurlpatterns("/*");
        map<string,string> initparameters = new hashmap<string, string>();
        initparameters.put("casserverurlprefix", cas_server_url_prefix);
        registration.setinitparameters(initparameters);
        // 设定加载的顺序
        registration.setorder(1);
        return registration;
    }


    /**
     * description:过滤验证器
     *     * @param: []
     * @return: org.springframework.boot.web.servlet.filterregistrationbean
     */
    @bean
    public filterregistrationbean filtervalidationregistration() {
        filterregistrationbean registration = new filterregistrationbean();
        registration.setfilter(new cas30proxyreceivingticketvalidationfilter());
        // 设定匹配的路径
        registration.addurlpatterns("/*");
        map<string,string>  initparameters = new hashmap<string, string>();
        initparameters.put("casserverurlprefix", cas_server_url_prefix);
        initparameters.put("servername", server_name);
        initparameters.put("usesession", "true");
        registration.setinitparameters(initparameters);
        // 设定加载的顺序
        registration.setorder(1);
        return registration;
    }


    /**
     * description:授权过滤器
     * @param: []
     * @return: org.springframework.boot.web.servlet.filterregistrationbean
     */
    @bean
    public filterregistrationbean filterauthenticationregistration() {
        filterregistrationbean registration = new filterregistrationbean();
        registration.setfilter(new authenticationfilter());
        // 设定匹配的路径
        registration.addurlpatterns("/*");

        map<string,string>  initparameters = new hashmap<string, string>();
        initparameters.put("casserverloginurl", cas_server_url_login);
        initparameters.put("servername", server_name);


        //设置忽略  退出登录不用登录
        initparameters.put("ignorepattern", "/system/*");

        registration.setinitparameters(initparameters);
        // 设定加载的顺序
        registration.setorder(1);
        return registration;
    }


    /**
     * wraper过滤器
     * @return
     */
    @bean
    public filterregistrationbean filterwrapperregistration() {
        filterregistrationbean registration = new filterregistrationbean();
        registration.setfilter(new httpservletrequestwrapperfilter());
        // 设定匹配的路径
        registration.addurlpatterns("/*");
        // 设定加载的顺序
        registration.setorder(1);
        return registration;
    }

    /**
     * 添加监听器
     * @return
     */
    @bean
    public servletlistenerregistrationbean<eventlistener> singlesignoutlistenerregistration(){
        servletlistenerregistrationbean<eventlistener> registrationbean = new servletlistenerregistrationbean<eventlistener>();
        registrationbean.setlistener(new singlesignouthttpsessionlistener());
        registrationbean.setorder(1);
        return registrationbean;
    }
}

客户端2跟客户端1的大似相同,这样就可以实现登出一个系统,所有系统全部登出。

到此这篇关于springboot 集成cas5.3 实现sso单点登录详细流程的文章就介绍到这了,更多相关springboot sso单点登录内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!