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

网友投稿 297 2022-11-29

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

什么是单点登录?

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

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

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

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

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

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

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

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

传输用户信息: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\casHLVMlhlHAb\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

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

cas客户端搭建

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

net.unicon.cas

cas-client-autoconfig-support

2.3.0-GA

在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

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

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

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

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

也登录成功了。

配置统一登出

添加登出接口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 initParameters = new HashMap();

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 initParameters = new HashMap();

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 initParameters = new HashMap();

initParameters.put("casServerLoginUrl", CAS_SERVER_URL_LOGIN);

initParameters.put("serverName", SERVER_NAME);

//设置忽略 退出登录不用登录

initParameters.put("ignorePattern", "/system/*");

registration.setInitParameters(http://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 singleSignOutListenerRegistration(){

ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean();

registrationBean.setListener(new SingleSignOutHttpSessionListener());

registrationBean.setOrder(1);

return registrationBean;

}

}

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:介绍几个有趣的网站(十三)
下一篇:萝卜爆肝Python自学学习路线
相关文章

 发表评论

暂时没有评论,来抢沙发吧~