最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springBoot集成shiro實(shí)現(xiàn)權(quán)限刷新

 更新時(shí)間:2024年11月05日 09:48:08   作者:利瑞華  
在SpringBoot項(xiàng)目中集成Shiro進(jìn)行權(quán)限管理,包括基礎(chǔ)配置引入依賴、創(chuàng)建Shiro配置類以及用戶認(rèn)證與授權(quán)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下

一、Spring Boot 集成 Shiro 基礎(chǔ)配置

引入依賴
在 Spring Boot 項(xiàng)目的pom.xml(如果是 Maven 項(xiàng)目)中添加 Shiro 相關(guān)依賴,例如:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-starter</artifactId>
    <version>1.7.1</version>
</dependency>

這里的版本號(hào)可以根據(jù)實(shí)際需求進(jìn)行調(diào)整。

創(chuàng)建 Shiro 配置類
創(chuàng)建一個(gè)配置類,比如ShiroConfig,用于配置 Shiro 的核心組件,如安全管理器(SecurityManager)、過(guò)濾器鏈(FilterChain)等。

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.maven.plugins.shiro.spring.boot.autoconfigure.ShiroAutoConfiguration;
import org.apache.shiro.web.maven.plugins.shiro.spring.boot.autoconfigure.ShiroWebAutoConfiguration;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
@ImportAutoConfiguration({ShiroAutoConfiguration.class, ShiroWebAutoConfiguration.class})
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean() {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        // 設(shè)置安全管理器,后續(xù)創(chuàng)建并注入
        shiroFilterFactoryBean.setSecurityManager(securityManager());

        // 配置過(guò)濾器鏈
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

        return shiroFilterFactoryBean;
    }

    @Bean
    public DefaultWebSecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 設(shè)置Realm,后續(xù)創(chuàng)建并注入
        securityManager.setRealm(userRealm());
        return securityManager;
    }

    @Bean
    public UserRealm userRealm() {
        return new UserRealm();
    }
}

在上述配置中,定義了哪些 URL 需要進(jìn)行認(rèn)證(authc),哪些可以匿名訪問(wèn)(anon),并設(shè)置了安全管理器和相關(guān)的 Realm(用于用戶認(rèn)證和授權(quán)的組件)。

二、用戶認(rèn)證與授權(quán)實(shí)現(xiàn)(基于 Shiro 的 Realm)

創(chuàng)建 Realm 類
創(chuàng)建一個(gè)繼承自AuthorizingRealm的類,比如UserRealm,用于實(shí)現(xiàn)用戶的認(rèn)證和授權(quán)邏輯。

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

public class UserRealm extends AuthorizingRealm {

    @Override
    protected AuthenticationInfo doAuthentication(AuthenticationToken token) throws AuthenticationException {
        // 獲取用戶名和密碼等信息,這里假設(shè)從token中獲取
        String username = (String) token.getPrincipal();
        String password = new String((char[]) token.getCredentials());

        // 實(shí)際應(yīng)用中應(yīng)該從數(shù)據(jù)庫(kù)等地方查詢用戶信息進(jìn)行驗(yàn)證
        User user = userService.findByUsername(username);
        if (user == null) {
            throw new AuthenticationException("用戶不存在");
        }
        if (!user.getPassword().equals(password)) {
            throw new AuthenticationException("密碼錯(cuò)誤");
        }

        // 認(rèn)證通過(guò),返回認(rèn)證信息
        return new SimpleAuthenticationInfo(user, user.getPassword(), getName());
    }

    @Override
    protected AuthorizationInfo doAuthorization(AuthorizationInfo authorizationInfo) {
        // 獲取當(dāng)前用戶
        User user = (User) getSubject().getPrincipal();

        // 根據(jù)用戶角色和權(quán)限信息設(shè)置授權(quán)信息
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        List<Role> roles = user.getRoles();
        for (Role role : roles) {
            simpleAuthorizationInfo.addRole(role.getName());
            List<Permission> permissions = role.getPermissions();
            for (Permission permission : permissions) {
                simpleAuthorizationInfo.addStringPermission(permission.getName());
            }
        }

        return simpleAuthorizationInfo;
    }
}

doAuthentication方法中實(shí)現(xiàn)用戶認(rèn)證邏輯,通過(guò)查詢數(shù)據(jù)庫(kù)等方式驗(yàn)證用戶的用戶名和密碼是否正確。在doAuthorization方法中根據(jù)用戶的角色和權(quán)限信息設(shè)置授權(quán)信息。

三、權(quán)限刷新機(jī)制

1. 基于緩存清理的權(quán)限刷新

當(dāng)權(quán)限發(fā)生變化時(shí)(比如管理員在后臺(tái)修改了用戶的角色或權(quán)限),可以通過(guò)清理 Shiro 相關(guān)緩存來(lái)實(shí)現(xiàn)權(quán)限的刷新。

在 Realm 中添加緩存管理
UserRealm類中,可以使用 Shiro 提供的緩存機(jī)制來(lái)緩存用戶的認(rèn)證和授權(quán)信息,以提高性能。例如:

import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheManager;
import org.apache.shiro.maven.plugins.shiro.spring.boot.autoconfigure.ShiroAutoConfiguration;
import org.apache.shiro.spring.boot.autoconfigure.ShiroSpringBootAutoConfiguration;
import org.apache.shiro.spring.boot.autoconfigure.cache.ShiroCacheManagerAutoConfiguration;
import org.apache.shiro.spring.boot.autoconfigure.cache.ShiroRedisCacheManagerAutoConfiguration;
import org.apache.shiro.spring.boot.autoconfigure.session.ShiroSessionManagerAutoConfiguration;
import org.apache.shiro.spring.boot.autoconfigure.session.ShiroSpringSessionAutoConfiguration;
import org.apache.shiro.spring.boot.autoconfigure.web.ShiroWebAutoConfiguration;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.maven.plugins.shiro.spring.boot.autoconfigure.ShiroAutoConfiguration;
import org.apache.shiro.web.maven.plugins.shiro.spring.boot.autoconfigure.ShiroWebAutoConfiguration;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
@ImportAutoConfiguration({ShiroAutoConfiguration.class, ShiroWebAutoConfiguration.class})
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean() {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        // 設(shè)置安全管理器,后續(xù)創(chuàng)建并注入
        shiroFilterFactoryBean.setSecurityManager(securityManager());

        // 配置過(guò)濾器鏈
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

        return shiroFilterFactoryBean;
    }

    @Bean
    public DefaultWebSecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 設(shè)置Realm,后續(xù)創(chuàng)建并注入
        securityManager.setRealm(userRealm());
        return securityManager;
    }

    @Bean
    public UserRealm userRealm() {
        UserRealm userRealm = new UserRealm();
        // 設(shè)置緩存管理器
        userRealm.setCacheManager(cacheManager());
        return userRealm;
    }

    @Bean
    public CacheManager cacheManager() {
        // 這里可以根據(jù)實(shí)際情況選擇不同的緩存管理器實(shí)現(xiàn),如Ehcache、Redis等
        return new MemoryCacheManager();
    }
}

這里設(shè)置了MemoryCacheManager作為緩存管理器示例,實(shí)際應(yīng)用中可以根據(jù)需求選擇更合適的,如RedisCacheManager等。

權(quán)限修改時(shí)清理緩存
當(dāng)權(quán)限發(fā)生變化時(shí),在相關(guān)的業(yè)務(wù)邏輯代碼中(比如在修改用戶角色或權(quán)限的服務(wù)方法中),需要清理對(duì)應(yīng)的緩存。例如:

import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheManager;
import org.apache.shiro.maven.plugins.shiro.spring.boot.autoconfigure.ShiroAutoConfiguration;
import org.apache.shiro.spring.boot.autoconfigure.ShiroSpringBootAutoConfiguration;
import org.apache.shiro.spring.boot.autoconfigure.cache.ShiroCacheManagerAutoConfiguration;
import org.apache.shiro.spring.boot.autoconfigure.cache.ShiroRedisCacheManagerAutoConfiguration;
import org.apache.shiro.spring.boot.autoconfigure.session.ShiroSessionManagerAutoConfiguration;
import org.apache.shiro.spring.boot.autoconfigure.session.ShiroSpringSessionAutoConfiguration;
import org.apache.shiro.spring.boot.autoconfigure.web.ShiroWebAutoConfiguration;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.maven.plugins.shiro.spring.boot.autoconfigure.ShiroAutoConfiguration;
import org.apache.shiro.web.maven.plugins.shiro.spring.boot.autoconfigure.ShiroWebAutoConfiguration;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
@ImportAutoConfiguration({ShiroAutoConfiguration.class, ShiroWebAutoConfiguration.class})
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean() {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        // 設(shè)置安全管理器,后續(xù)創(chuàng)建并注入
        shiroFilterFactoryBean.setSecurityManager(securityManager());

        // 配置過(guò)濾器鏈
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

        return shiroFilterFactoryBean;
    }

    @Bean
    public DefaultWebSecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 設(shè)置Realm,后續(xù)創(chuàng)建并注入
        securityManager.setRealm(userRealm());
        return securityManager;
    }

    @Bean
    public UserRealm userRealm() {
        UserRealm userRealm = new UserRealm();
        // 設(shè)置緩存管理器
        userRealm.setCacheManager(cacheManager());
        return userRealm;
    }

    @Bean
    public CacheManager cacheManager() {
        // 這里可以根據(jù)實(shí)際情況選擇不同的緩存管理器實(shí)現(xiàn),如Ehcache、Redis等
        return new MemoryCacheManager();
    }

    // 在權(quán)限修改的服務(wù)方法中
    public void updateUserPermissions(User user, List<Permission> newPermissions) {
        // 先更新數(shù)據(jù)庫(kù)中的用戶權(quán)限信息
        userService.updateUserPermissions(user, newPermissions);

        // 清理緩存
        Cache<String, AuthorizationInfo> cache = userRealm().getCacheManager().getCache("authorizationCache");
        if (cache!= null) {
            cache.clear();
        }
    }
}

這樣,當(dāng)調(diào)用updateUserPermissions方法修改用戶權(quán)限后,會(huì)清理掉授權(quán)信息的緩存,下次用戶訪問(wèn)相關(guān)資源時(shí),Shiro 會(huì)重新進(jìn)行授權(quán)計(jì)算。

2. 主動(dòng)觸發(fā)授權(quán)更新

除了通過(guò)清理緩存來(lái)間接實(shí)現(xiàn)權(quán)限刷新外,還可以在權(quán)限發(fā)生變化時(shí)主動(dòng)觸發(fā)授權(quán)更新。

在 Realm 中添加更新授權(quán)方法
UserRealm類中添加一個(gè)方法來(lái)手動(dòng)觸發(fā)授權(quán)更新,例如:

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

public class UserRealm extends AuthorizingRealm {

    //... 前面的認(rèn)證和授權(quán)方法

    public void updateAuthorization(User user) {
        PrincipalCollection principals = getSubject().getPrincipals();
        if (principals!= null && principals.contains(user)) {
            super.doAuthorization(principals);
        }
    }
}

這個(gè)方法通過(guò)獲取當(dāng)前用戶的主體信息,然后調(diào)用super.doAuthorization來(lái)重新進(jìn)行授權(quán)計(jì)算。

在權(quán)限修改業(yè)務(wù)邏輯中調(diào)用更新授權(quán)方法
在修改用戶權(quán)限等相關(guān)業(yè)務(wù)邏輯代碼中,調(diào)用上述updateAuthorization方法來(lái)主動(dòng)觸發(fā)授權(quán)更新。例如:

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

public class UserService {

    //... 其他業(yè)務(wù)方法

    public void updateUserPermissions(User user, List<Permission> newPermissions) {
        // 先更新數(shù)據(jù)庫(kù)中的用戶權(quán)限信息
        userRepository.updateUserPermissions(user, newPermissions);

        // 主動(dòng)觸發(fā)授權(quán)更新
        UserRealm userRealm = (UserRealm) applicationContext.getBean("userRealm");
        userRealm.updateAuthorization(user);
    }
}

通過(guò)這種方式,當(dāng)權(quán)限發(fā)生變化時(shí),可以及時(shí)、主動(dòng)地更新用戶的授權(quán)信息,確保用戶的權(quán)限訪問(wèn)符合最新的設(shè)置。

綜上所述,在 Spring Boot 結(jié)合 Shiro 進(jìn)行管理時(shí),通過(guò)合理配置 Shiro 的基礎(chǔ)組件以及實(shí)現(xiàn)有效的權(quán)限刷新機(jī)制,可以更好地保障系統(tǒng)的安全性和權(quán)限管理的靈活性。

到此這篇關(guān)于springBoot集成shiro實(shí)現(xiàn)權(quán)限刷新的文章就介紹到這了,更多相關(guān)springBoot shiro權(quán)限刷新內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot項(xiàng)目打成War包部署的方法步驟

    SpringBoot項(xiàng)目打成War包部署的方法步驟

    這篇文章主要介紹了springboot項(xiàng)目如何打war包流程的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 詳解Java的引用類型及使用場(chǎng)景

    詳解Java的引用類型及使用場(chǎng)景

    這篇文章主要介紹了詳解Java的引用類型及使用場(chǎng)景,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • JDBC Template基本使用方法詳解

    JDBC Template基本使用方法詳解

    這篇文章主要介紹了JDBC Template基本使用方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java詳細(xì)講解異常Exception的處理

    Java詳細(xì)講解異常Exception的處理

    異常就是不正常,比如當(dāng)我們身體出現(xiàn)了異常我們會(huì)根據(jù)身體情況選擇喝開水、吃藥、看病、等?異常處理方法。?java異常處理機(jī)制是我們java語(yǔ)言使用異常處理機(jī)制為程序提供了錯(cuò)誤處理的能力,程序出現(xiàn)的錯(cuò)誤,程序可以安全的退出,以保證程序正常的運(yùn)行等
    2022-06-06
  • Java檢查日期字符串是否合法的方法總結(jié)

    Java檢查日期字符串是否合法的方法總結(jié)

    后端接口在接收數(shù)據(jù)的時(shí)候,都需要進(jìn)行檢查。檢查全部通過(guò)后,才能夠執(zhí)行業(yè)務(wù)邏輯。本文總結(jié)了四個(gè)Java檢查日期字符串是否合法的方法,感興趣的可以了解一下
    2022-10-10
  • SpringBoot屬性綁定與bean屬性校驗(yàn)實(shí)現(xiàn)方法詳解

    SpringBoot屬性綁定與bean屬性校驗(yàn)實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了SpringBoot屬性綁定與bean屬性校驗(yàn)實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-11-11
  • Spring Boot 整合 MongoDB的示例

    Spring Boot 整合 MongoDB的示例

    這篇文章主要介紹了Spring Boot 整合 MongoDB的示例,幫助大家更好的理解和學(xué)習(xí)spring boot框架,感興趣的朋友可以了解下
    2020-10-10
  • 微服務(wù)mybatis?typehandler使用詳解(就這一篇夠了)

    微服務(wù)mybatis?typehandler使用詳解(就這一篇夠了)

    TypeHandler是MyBatis框架的核心組件,實(shí)現(xiàn)數(shù)據(jù)庫(kù)表字段類型和Java?數(shù)據(jù)類型之間的相互轉(zhuǎn)換,本文介紹通過(guò)實(shí)例代碼mybatis?typehandler使用,感興趣的朋友一起看看吧
    2024-02-02
  • 在Java中為日期增加一天的多種方法

    在Java中為日期增加一天的多種方法

    這篇文章主要給大家介紹了關(guān)于如何在Java中為日期增加一天的多種方法,在JAVA業(yè)務(wù)代碼中,經(jīng)常會(huì)遇到通過(guò)指定時(shí)間,增加指定天數(shù)的業(yè)務(wù)需求,需要的朋友可以參考下
    2023-07-07
  • Java實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出為Word文檔的方法步驟

    Java實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出為Word文檔的方法步驟

    我們?cè)陂_發(fā)一些系統(tǒng)的時(shí)候,例如OA系統(tǒng),經(jīng)常能遇到將審批單數(shù)據(jù)導(dǎo)出為word和excel文檔的需求,導(dǎo)出為excel是比較簡(jiǎn)單的,但是word文檔的格式不像表格那樣可以輕松的定位,所以本文給大家介紹了Java怎樣實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出為Word文檔,需要的朋友可以參考下
    2025-01-01

最新評(píng)論

巴青县| 北票市| 汾西县| 东丰县| 正镶白旗| 平顺县| 遂川县| 临夏市| 崇仁县| 上杭县| 荣成市| 资兴市| 仁化县| 通化县| 敖汉旗| 亚东县| 栖霞市| 河津市| 桐梓县| 福清市| 灵石县| 天峻县| 惠来县| 漯河市| 临湘市| 丰县| 安阳县| 昆山市| 府谷县| 高要市| 泰顺县| 大英县| 页游| 余姚市| 泽州县| 仲巴县| 平和县| 柏乡县| 临汾市| 卓尼县| 弥渡县|