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

如何使用Spring Security實(shí)現(xiàn)用戶(hù)-角色-資源的權(quán)限控制

 更新時(shí)間:2024年10月15日 11:01:35   作者:Takumilovexu  
文章介紹了如何通過(guò)SpringSecurity實(shí)現(xiàn)用戶(hù)-角色-資源的權(quán)限管理,包括基于角色的請(qǐng)求控制、加載用戶(hù)角色信息、角色與資源的關(guān)聯(lián)等步驟,同時(shí),提供了一些測(cè)試場(chǎng)景,以驗(yàn)證權(quán)限控制是否正確,感興趣的朋友跟隨小編一起看看吧

在Web應(yīng)用的開(kāi)發(fā)中,權(quán)限管理是必不可少的一環(huán)。繼上次分享了基于 用戶(hù)-權(quán)限-資源的權(quán)限控制后,這次我們來(lái)探討如何通過(guò)Spring Security實(shí)現(xiàn) 用戶(hù)-角色-資源的權(quán)限管理。

一、基于角色的請(qǐng)求控制

首先,我們需要根據(jù)不同的資源路徑設(shè)置相應(yīng)的角色要求。以下是安全配置的代碼:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    // 開(kāi)啟授權(quán)保護(hù)
    http.authorizeHttpRequests(authorize -> authorize
            // 所有 /user/** 路徑下的請(qǐng)求需要 ADMIN 角色
            .requestMatchers("/user/**").hasRole("ADMIN")
            // 對(duì)所有請(qǐng)求開(kāi)啟授權(quán)保護(hù)
            .anyRequest()
            // 已認(rèn)證的請(qǐng)求自動(dòng)被授權(quán)
            .authenticated());
    // 其他配置省略...
}

在這段代碼中,我們通過(guò)hasRole("ADMIN")方法,指定訪問(wèn)/user/**路徑的請(qǐng)求需要具備ADMIN角色。這樣,我們就實(shí)現(xiàn)了基于角色的資源訪問(wèn)控制。

二、加載用戶(hù)角色信息

接下來(lái),我們需要為用戶(hù)加載其對(duì)應(yīng)的角色信息。在Spring Security中,可以通過(guò)實(shí)現(xiàn)UserDetailsService接口的loadUserByUsername方法:

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.eq(User::getUsername, username);
    User user = userMapper.selectOne(lambdaQueryWrapper);
    if (user == null) {
        throw new UsernameNotFoundException(username);
    } else {
        return org.springframework.security.core.userdetails.User.withUsername(user.getUsername())
                .password(user.getPassword())
                .disabled(!user.getEnabled())
            	// 設(shè)置用戶(hù)的憑據(jù)是否過(guò)期,false 表示憑據(jù)未過(guò)期
                .credentialsExpired(false)
            	// 設(shè)置賬戶(hù)是否被鎖定,false 表示賬戶(hù)未鎖定
                .accountLocked(false)
                // 為用戶(hù)分配 ADMIN 角色
                .roles("ADMIN")
                .build();
    }
}

在這個(gè)方法中,我們:

  • 從數(shù)據(jù)庫(kù)中根據(jù)用戶(hù)名查詢(xún)用戶(hù)信息。
  • 如果用戶(hù)存在,使用User.withUsername()方法構(gòu)建一個(gè)UserDetails對(duì)象。
  • 通過(guò).roles("ADMIN")方法為用戶(hù)分配ADMIN角色。

需要注意的是,Spring Security在處理角色時(shí),會(huì)自動(dòng)為角色名添加"ROLE_"前綴。因此,"ADMIN"角色實(shí)際上對(duì)應(yīng)權(quán)限"ROLE_ADMIN"

三、角色與資源的關(guān)聯(lián)

通過(guò)上述配置,我們實(shí)現(xiàn)了以下功能:

  • 用戶(hù):通過(guò)數(shù)據(jù)庫(kù)加載,包含用戶(hù)名、密碼、是否啟用等信息。
  • 角色:為用戶(hù)分配特定的角色,例如ADMIN。
  • 資源:指定哪些URL路徑需要哪些角色才能訪問(wèn)。

當(dāng)用戶(hù)嘗試訪問(wèn)受保護(hù)的資源時(shí),Spring Security會(huì)根據(jù)用戶(hù)的角色信息決定是否授權(quán)。

四、測(cè)試角色權(quán)限控制

以下是一些測(cè)試場(chǎng)景,幫助驗(yàn)證我們的權(quán)限控制是否正確。

1. 未登錄用戶(hù)訪問(wèn)受保護(hù)資源

當(dāng)未登錄的用戶(hù)嘗試訪問(wèn)/user/list時(shí),會(huì)被重定向到登錄頁(yè)面,提示需要先進(jìn)行身份認(rèn)證。

2. 登錄用戶(hù)訪問(wèn)受保護(hù)資源

使用具備ADMIN角色的用戶(hù)登錄后,嘗試訪問(wèn)/user/list,應(yīng)當(dāng)能夠正常訪問(wèn)。

3. 角色不足的用戶(hù)訪問(wèn)受保護(hù)資源(把前面改成.roles(“USER”))

如果登錄的用戶(hù)沒(méi)有ADMIN角色,嘗試訪問(wèn)/user/list時(shí),會(huì)收到權(quán)限不足的提示,無(wú)法訪問(wèn)該資源。

五、自定義異常處理

為了提升用戶(hù)體驗(yàn),我們可以自定義異常處理器,返回統(tǒng)一的JSON格式錯(cuò)誤信息。

1. 自定義未授權(quán)處理器

public class MyAccessDeniedHandler implements AccessDeniedHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response,
                       AccessDeniedException accessDeniedException) throws IOException, ServletException {
        // 創(chuàng)建結(jié)果對(duì)象
        HashMap<String, Object> result = new HashMap<>();
        result.put("code", -1);
        result.put("message", "沒(méi)有訪問(wèn)該資源的權(quán)限");
        // 轉(zhuǎn)換成JSON字符串
        String json = JSON.toJSONString(result);
        // 返回響應(yīng)
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().println(json);
    }
}

2. 注冊(cè)自定義異常處理器

http.exceptionHandling(exception -> {
    // 請(qǐng)求未認(rèn)證的處理
    exception.authenticationEntryPoint(new MyAuthenticationEntryPoint());
    // 請(qǐng)求未授權(quán)的處理
    exception.accessDeniedHandler(new MyAccessDeniedHandler());
});

通過(guò)上述配置,當(dāng)用戶(hù)沒(méi)有權(quán)限訪問(wèn)某個(gè)資源時(shí),會(huì)返回自定義的JSON錯(cuò)誤信息,方便前端進(jìn)行處理。

六、總結(jié)

通過(guò)以上步驟,我們實(shí)現(xiàn)了基于用戶(hù)-角色-資源的權(quán)限控制:

  • 用戶(hù):通過(guò)UserDetailsService加載用戶(hù)信息,并為其分配ADMIN角色。
  • 角色:使用.roles("ADMIN")方法為用戶(hù)指定角色。
  • 資源:通過(guò)requestMatchers("/user/**").hasRole("ADMIN")指定需要ADMIN角色才能訪問(wèn)的資源。

這種方式的優(yōu)勢(shì)在于:

  • 管理方便:角色可以包含多個(gè)權(quán)限,簡(jiǎn)化了權(quán)限管理的復(fù)雜度。
  • 靈活性高:可以根據(jù)需要?jiǎng)討B(tài)調(diào)整用戶(hù)的角色,進(jìn)而控制其訪問(wèn)權(quán)限。

在實(shí)際項(xiàng)目中,通常會(huì)有一個(gè)角色和權(quán)限的對(duì)應(yīng)關(guān)系表,角色下包含多個(gè)權(quán)限,用戶(hù)可以被分配一個(gè)或多個(gè)角色。

到此這篇關(guān)于使用Spring Security實(shí)現(xiàn)用戶(hù)-角色-資源的權(quán)限控制的文章就介紹到這了,更多相關(guān)Spring Security角色權(quán)限控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?Collection?接口和常用方法綜合詳解

    Java?Collection?接口和常用方法綜合詳解

    Collection派生出三個(gè)子接口,Set代表不可重復(fù)的無(wú)序集合、List代表可重復(fù)的有序集合、Queue是java提供的隊(duì)列實(shí)現(xiàn),通過(guò)它們不斷的擴(kuò)展出很多的集合類(lèi),接下來(lái)我們?cè)敿?xì)介紹一下
    2021-11-11
  • 聊聊Springboot2.x的session和cookie有效期

    聊聊Springboot2.x的session和cookie有效期

    這篇文章主要介紹了Springboot2.x的session和cookie有效期,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringCache 分布式緩存的實(shí)現(xiàn)方法(規(guī)避redis解鎖的問(wèn)題)

    SpringCache 分布式緩存的實(shí)現(xiàn)方法(規(guī)避redis解鎖的問(wèn)題)

    這篇文章主要介紹了SpringCache 分布式緩存的實(shí)現(xiàn)方法(規(guī)避redis解鎖的問(wèn)題),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • java刪除文件夾的實(shí)現(xiàn)方式

    java刪除文件夾的實(shí)現(xiàn)方式

    用戶(hù)發(fā)現(xiàn)File.delete()無(wú)法刪除非空目錄,嘗試自定義遞歸刪除方法后,發(fā)現(xiàn)commons-io已提供FileUtils.deleteDirectory,建議優(yōu)先使用第三方庫(kù)避免重復(fù)造輪子,提升效率與代碼可靠性
    2025-07-07
  • Security中的WebSecurityConfigurerAdapter詳解

    Security中的WebSecurityConfigurerAdapter詳解

    這篇文章主要介紹了Security中的WebSecurityConfigurerAdapter詳解,今天我們要進(jìn)一步的的學(xué)習(xí)如何自定義配置Spring?Security,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Mybatis 中的sql批量修改方法實(shí)現(xiàn)

    Mybatis 中的sql批量修改方法實(shí)現(xiàn)

    在項(xiàng)目中遇到需要批量更新的功能,原本想的是在Java中用循環(huán)訪問(wèn)數(shù)據(jù)庫(kù)去更新,但是心里總覺(jué)得這樣做會(huì)不會(huì)太頻繁了,太耗費(fèi)資源了,效率也很低,查了下mybatis的批量操作,原來(lái)確實(shí)有<foreach>標(biāo)簽可以做到,下面通過(guò)本文給大家介紹下
    2017-01-01
  • 基于Spring boot @Value 注解注入屬性值的操作方法

    基于Spring boot @Value 注解注入屬性值的操作方法

    這篇文章主要介紹了結(jié)合SpEL使用@Value-基于配置文件或非配置的文件的值注入-Spring Boot的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Spring?Security權(quán)限注解啟動(dòng)及邏輯處理使用示例

    Spring?Security權(quán)限注解啟動(dòng)及邏輯處理使用示例

    這篇文章主要為大家介紹了Spring?Security權(quán)限注解啟動(dòng)及邏輯處理使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 使用jxls自定義命令設(shè)置動(dòng)態(tài)行高

    使用jxls自定義命令設(shè)置動(dòng)態(tài)行高

    這篇文章主要介紹了使用jxls自定義命令設(shè)置動(dòng)態(tài)行高,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Spring實(shí)戰(zhàn)之設(shè)置普通屬性值的方法示例

    Spring實(shí)戰(zhàn)之設(shè)置普通屬性值的方法示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之設(shè)置普通屬性值的方法,結(jié)合實(shí)例形式分析了Spring設(shè)置普通屬性值的方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-11-11

最新評(píng)論

江永县| 鲁甸县| 伊金霍洛旗| 延津县| 喀什市| 普宁市| 和平区| 海盐县| 特克斯县| 安顺市| 万年县| 仙居县| 东方市| 黄浦区| 九寨沟县| 宁陵县| 华坪县| 宁蒗| 崇文区| 双鸭山市| 桃江县| 钟祥市| 万年县| 汉寿县| 泰顺县| 永丰县| 滦南县| 陇川县| 霞浦县| 海淀区| 信阳市| 盘山县| 临沧市| 灌南县| 余庆县| 济南市| 武山县| 巴楚县| 鸡东县| 江口县| 五原县|