详解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如何实现一对一模型关联?(Eloquent示例)  网站建设保证美观性,需要考虑的几点问题!  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  微信小程序 wx.uploadFile无法上传解决办法  北京的网站制作公司有哪些,哪个视频网站最好?  网站制作软件有哪些,制图软件有哪些?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  魔方云NAT建站如何实现端口转发?  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  如何做网站制作流程,*游戏网站怎么搭建?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  jQuery 常见小例汇总  BootStrap整体框架之基础布局组件  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  香港服务器租用每月最低只需15元?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  如何快速生成凡客建站的专业级图册?  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  如何有效防御Web建站篡改攻击?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  iOS中将个别页面强制横屏其他页面竖屏  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  Linux系统命令中tree命令详解  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  如何快速打造个性化非模板自助建站?  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  深圳网站制作培训,深圳哪些招聘网站比较好?  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  ,南京靠谱的征婚网站?  Laravel如何实现文件上传和存储?(本地与S3配置)  大连网站制作公司哪家好一点,大连买房网站哪个好?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  html如何与html链接_实现多个HTML页面互相链接【互相】  JavaScript中如何操作剪贴板_ClipboardAPI怎么用