详解spring boot配置单点登录
发布时间 - 2026-01-11 00:19:57 点击率:次概述

企业内部一般都有一套单点登录系统(常用的实现有apereo cas),所有的内部系统的登录认证都对接它。本文介绍spring boot的程序如何对接CAS服务。
常用的安全框架有spring security和apache shiro。shiro的配置和使用相对简单,本文使用shrio对接CAS服务。
配置
新增依赖
pom.xml新增:
<properties>
<shiro.version>1.2.4</shiro.version>
</properties>
<dependencies>
<!--Apache Shiro -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-cas</artifactId>
<version>${shiro.version}</version>
</dependency>
</dependencies>
spring boot配置
application.properties
shiro.cas=https://cas.xxx.com # 这是CAS服务的地址 shiro.server=http://127.0.0.1:8080 # 自己应用的地址,测试使用127即可
应用配置
初始化shiro bean,将文件放到任意子包下即可,比如xxx.config,spring boot会自动扫描加载
@Configuration
public class ShiroCasConfiguration {
private static final String casFilterUrlPattern = "/shiro-cas";
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
filterRegistration.setFilter(new DelegatingFilterProxy("shiroFilter"));
filterRegistration.addInitParameter("targetFilterLifecycle", "true");
filterRegistration.setEnabled(true);
filterRegistration.addUrlPatterns("/*");
return filterRegistration;
}
@Bean(name = "lifecycleBeanPostProcessor")
public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Value("${shiro.cas}") String casServerUrlPrefix,
@Value("${shiro.server}") String shiroServerUrlPrefix) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
CasRealm casRealm = new CasRealm();
casRealm.setDefaultRoles("ROLE_USER");
casRealm.setCasServerUrlPrefix(casServerUrlPrefix);
casRealm.setCasService(shiroServerUrlPrefix + casFilterUrlPattern);
securityManager.setRealm(casRealm);
securityManager.setCacheManager(new MemoryConstrainedCacheManager());
securityManager.setSubjectFactory(new CasSubjectFactory());
return securityManager;
}
private void loadShiroFilterChain(ShiroFilterFactoryBean shiroFilterFactoryBean) {
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put(casFilterUrlPattern, "casFilter");
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/bower_components/**", "anon");//可以将不需要拦截的静态文件目录加进去
filterChainDefinitionMap.put("/logout","logout");
filterChainDefinitionMap.put("/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
}
/**
* CAS Filter
*/
@Bean(name = "casFilter")
public CasFilter getCasFilter(@Value("${shiro.cas}") String casServerUrlPrefix,
@Value("${shiro.server}") String shiroServerUrlPrefix) {
CasFilter casFilter = new CasFilter();
casFilter.setName("casFilter");
casFilter.setEnabled(true);
String loginUrl = casServerUrlPrefix + "/login?service=" + shiroServerUrlPrefix + casFilterUrlPattern;
casFilter.setFailureUrl(loginUrl);
return casFilter;
}
@Bean(name = "shiroFilter")
public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager,
CasFilter casFilter,
@Value("${shiro.cas}") String casServerUrlPrefix,
@Value("${shiro.server}") String shiroServerUrlPrefix) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
String loginUrl = casServerUrlPrefix + "/login?service=" + shiroServerUrlPrefix + casFilterUrlPattern;
shiroFilterFactoryBean.setLoginUrl(loginUrl);
shiroFilterFactoryBean.setSuccessUrl("/");
Map<String, Filter> filters = new HashMap<>();
filters.put("casFilter", casFilter);
LogoutFilter logoutFilter = new LogoutFilter();
logoutFilter.setRedirectUrl(casServerUrlPrefix + "/logout?service=" + shiroServerUrlPrefix);
filters.put("logout",logoutFilter);
shiroFilterFactoryBean.setFilters(filters);
loadShiroFilterChain(shiroFilterFactoryBean);
return shiroFilterFactoryBean;
}
}
程序中获取登录的用户名
上述配置完成后,就可以找程序中获取登录用户的名字了
public String getUsername() {
Subject subject = SecurityUtils.getSubject();
if (subject == null || subject.getPrincipals() == null) {
return DEFAULTUSER;
}
return (String) subject.getPrincipals().getPrimaryPrincipal();
}
总结
shiro使用还是比较简单的,使用的时候只需要修改application.properties即可
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# spring
# boot
# 单点登录
# 配置单点登录
# 基于SpringBoot+Redis的Session共享与单点登录详解
# 使用Spring Security OAuth2实现单点登录
# SpringCloud实现SSO 单点登录的示例代码
# vue+springboot前后端分离实现单点登录跨域问题解决方法
# spring boot整合Shiro实现单点登录的示例代码
# spring boot 1.5.4 集成shiro+cas
# 实现单点登录和权限控制
# spring session同域下单点登录实现解析
# 单点
# 这是
# 都有
# 只需要
# 将不
# 大家多多
# 就可以
# 加载
# 完成后
# bean
# 子包下
# Configuration
# public
# config
# java
# server
# strong
# xxx
# http
# setFilter
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
青岛网站建设如何选择本地服务器?
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
移动端脚本框架Hammer.js
如何挑选优质建站一级代理提升网站排名?
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
php 三元运算符实例详细介绍
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
PHP正则匹配日期和时间(时间戳转换)的实例代码
linux写shell需要注意的问题(必看)
清除minerd进程的简单方法
如何为不同团队 ID 动态生成多个独立按钮
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
香港服务器租用每月最低只需15元?
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
Python文本处理实践_日志清洗解析【指导】
javascript中对象的定义、使用以及对象和原型链操作小结
高端云建站费用究竟需要多少预算?
如何用VPS主机快速搭建个人网站?
JS弹性运动实现方法分析
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
香港服务器选型指南:免备案配置与高效建站方案解析
利用 Google AI 进行 YouTube 视频 SEO 描述优化
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
微信小程序 五星评分(包括半颗星评分)实例代码
网站图片在线制作软件,怎么在图片上做链接?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
油猴 教程,油猴搜脚本为什么会网页无法显示?
如何在自有机房高效搭建专业网站?
详解vue.js组件化开发实践
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
Laravel怎么在Blade中安全地输出原始HTML内容
浅谈javascript alert和confirm的美化
Laravel API资源类怎么用_Laravel API Resource数据转换
如何快速重置建站主机并恢复默认配置?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?

