网站首页 > java教程 正文
特别说明:jdk使用1.8 tomcat使用8
什么是单点登录?
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。
SSO单点登录访问流程
主要有以下步骤:
- 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
- 定向认证:SSO客户端会重定向用户请求到SSO服务器。
- 用户认证:用户身份认证。
- 发放票据:SSO服务器会产生一个随机的Service Ticket。
- 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
- 传输用户信息: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=admin::123456
cas服务器端搭建完毕,重启tomcat 进行测试,在浏览器中输入下面地址,进行访问
http://localhost:8080/cas/login
注销系统:http://localhost:8080/cas/logout
服务端就已经搭好了,并且可以通过登录退出了。
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=8081
#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启动类上添加注解
package com.example.demo;
import net.unicon.cas.client.configuration.EnableCasClient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//启用cas
@EnableCasClient
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
第一个客户端的controller
package com.example.demo.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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import static org.jasig.cas.client.util.AbstractCasFilter.CONST_CAS_ASSERTION;
@RestController
public class IndexController {
@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
package com.example.demo.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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import static org.jasig.cas.client.util.AbstractCasFilter.CONST_CAS_ASSERTION;
@RestController
public class IndexController {
@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-test2,当前登录账户"+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<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+CAS Client 实现单点登录
- 下一篇: CAS 单点登录简介
猜你喜欢
- 2024-11-20 后端开发之多应用之间单点登录
- 2024-11-20 单点登陆常用的方式Oauth认证登录
- 2024-11-20 Python Web:如何通过JWT实现单点登录?
- 2024-11-20 4000字长文,带你了解单点登录
- 2024-11-20 SSO单点登录(三种实现方式)
- 2024-11-20 一次登录、便捷访问所有?聊聊CAS单点登录是如何实现的
- 2024-11-20 SpringBoot集成xxl-sso实现单点登录
- 2024-11-20 连环画解析“单点登录”原理,保证你能看懂
- 2024-11-20 CAS 单点登录简介
- 2024-11-20 ASP.NET中的单点登录
你 发表评论:
欢迎- 最近发表
-
- Java内存溢出紧急处理:10个必知的Linux命令快速定位OOM
- 面试常问的 25+ 个 Linux 命令(linux面试命令大全)
- Java堆外内存溢出紧急处理实战:Linux命令定位与Spring Boot解决
- java开发常用的Linux命令,高频的没你想象的多
- Java 应用 CPU 飙升?8 个 Linux 命令组合拳快速锁定异常线程
- Java 开发者线上问题排查常用的 15 个 Linux 命令
- Java程序员必备的Linux命令:让你的工作效率翻倍
- Java程序员必备的Linux命令全解析
- [超全整理] Java 程序员必备的 100 条 Linux 命令大全
- SAP ABAP资源导航(sap aatp)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)