詳解spring boot配置單點(diǎn)登錄
概述
企業(yè)內(nèi)部一般都有一套單點(diǎn)登錄系統(tǒng)(常用的實(shí)現(xiàn)有apereo cas),所有的內(nèi)部系統(tǒng)的登錄認(rèn)證都對(duì)接它。本文介紹spring boot的程序如何對(duì)接CAS服務(wù)。
常用的安全框架有spring security和apache shiro。shiro的配置和使用相對(duì)簡(jiǎn)單,本文使用shrio對(duì)接CAS服務(wù)。
配置
新增依賴
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服務(wù)的地址 shiro.server=http://127.0.0.1:8080 # 自己應(yīng)用的地址,測(cè)試使用127即可
應(yīng)用配置
初始化shiro bean,將文件放到任意子包下即可,比如xxx.config,spring boot會(huì)自動(dòng)掃描加載
@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");//可以將不需要攔截的靜態(tài)文件目錄加進(jìn)去 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(); }
總結(jié)
shiro使用還是比較簡(jiǎn)單的,使用的時(shí)候只需要修改application.properties即可
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 基于SpringBoot+Redis的Session共享與單點(diǎn)登錄詳解
- 使用Spring Security OAuth2實(shí)現(xiàn)單點(diǎn)登錄
- SpringCloud實(shí)現(xiàn)SSO 單點(diǎn)登錄的示例代碼
- vue+springboot前后端分離實(shí)現(xiàn)單點(diǎn)登錄跨域問(wèn)題解決方法
- spring boot整合Shiro實(shí)現(xiàn)單點(diǎn)登錄的示例代碼
- spring boot 1.5.4 集成shiro+cas,實(shí)現(xiàn)單點(diǎn)登錄和權(quán)限控制
- spring session同域下單點(diǎn)登錄實(shí)現(xiàn)解析
相關(guān)文章
以用戶名注冊(cè)為例分析三種Action獲取數(shù)據(jù)的方式
這篇文章主要介紹了以用戶名注冊(cè)為例分析三種Action獲取數(shù)據(jù)的方式的相關(guān)資料,需要的朋友可以參考下2016-03-03Java數(shù)據(jù)類(lèi)型之細(xì)講char類(lèi)型與編碼關(guān)系
這幾天一直在復(fù)習(xí)Java基礎(chǔ)知識(shí),特地寫(xiě)了一篇文章來(lái)做一下筆記,文中有非常詳細(xì)的圖文示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05Java實(shí)現(xiàn)PDF轉(zhuǎn)為線性PDF詳解
線性化PDF文件是PDF文件的一種特殊格式,可以通過(guò)Internet更快地進(jìn)行查看。本文將通過(guò)后端Java程序?qū)崿F(xiàn)將PDF文件轉(zhuǎn)為線性化PDF。感興趣的可以了解一下2021-12-12springMVC自定義注解,用AOP來(lái)實(shí)現(xiàn)日志記錄的方法
下面小編就為大家分享一篇springMVC自定義注解,用AOP來(lái)實(shí)現(xiàn)日志記錄的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01使用spring boot通過(guò)自定義注解打印所需日志
這篇文章主要介紹了使用spring boot通過(guò)自定義注解打印所需日志的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07詳解Spring-Cloud2.0之Feign調(diào)用遠(yuǎn)程服務(wù)指南
這篇文章主要介紹了詳解Spring-Cloud2.0之Feign調(diào)用遠(yuǎn)程服務(wù)指南,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01springboot 整合druid數(shù)據(jù)庫(kù)密碼加密功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了springboot 整合druid數(shù)據(jù)庫(kù)密碼加密功能的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Java 獲取Web項(xiàng)目相對(duì)webapp地址的實(shí)例
下面小編就為大家?guī)?lái)一篇Java 獲取Web項(xiàng)目相對(duì)webapp地址的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11Springboot 2.6集成redis maven報(bào)錯(cuò)的坑記錄
這篇文章主要介紹了Springboot 2.6集成redis maven報(bào)錯(cuò)的坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04IntelliJ?IDEA?2022安裝注冊(cè)永久激活
java開(kāi)發(fā)工具IntelliJ?IDEA深受用戶喜愛(ài),很多朋友對(duì)這個(gè)idea開(kāi)發(fā)工具比較忠心,一旦有新版本發(fā)出,很多小伙伴就迫不及待的想更新,今天小編給大家?guī)?lái)了idea2022.1最新永久激活碼,親測(cè)有效,喜歡的朋友快來(lái)下載體驗(yàn)吧2022-08-08