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

SpringBoot中的@PreAuthorize注解詳解

 更新時間:2023年09月19日 11:09:02   作者:cloneme01  
這篇文章主要介紹了SpringBoot中的@PreAuthorize注解詳解,@PreAuthorize注解會在方法執(zhí)行前進(jìn)行權(quán)限驗證,支持Spring?EL表達(dá)式,它是基于方法注解的權(quán)限解決方案,需要的朋友可以參考下

@PreAuthorize注解

@PreAuthorize注解會在方法執(zhí)行前進(jìn)行權(quán)限驗證,支持Spring EL表達(dá)式,它是基于方法注解的權(quán)限解決方案。

只有當(dāng)@EnableGlobalMethodSecurity(prePostEnabled=true)的時候,@PreAuthorize才可以使用,@EnableGlobalMethodSecurity注解在SPRING安全中心進(jìn)行設(shè)置,如下:

/**
 * SPRING安全中心
 * @author ROCKY
 */
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}

@PreAuthorize注解如何使用?

/**
 * 刪除用戶
 */
@PreAuthorize("@ss.hasPermi('system:user:remove')")
@Log(title = "用戶管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{userIds}")
public Result remove(@PathVariable Long[] userIds) {
    if (ArrayUtils.contains(userIds, getUserId())) {
        return error("當(dāng)前用戶不能刪除");
    }
    return toAjax(userService.deleteUserByIds(userIds));
}

自定義權(quán)限實現(xiàn)

@PreAuthorize(“@ss.hasPermi(‘system:user:remove’)”)的意思是什么?

A. ss 是一個注冊在 Spring容器中的BEAN,對應(yīng)的類是cn.hadoopx.framework.web.service.PermissionService;

B. hasPermi 是PermissionService類中定義的方法;

C.當(dāng)Spring EL 表達(dá)式返回TRUE,則權(quán)限校驗通過;

D. PermissionService.java的定義如下:

/**
 * 自定義權(quán)限實現(xiàn),ss取自SpringSecurity首字母
 * @author ROCKY
 */
@Service("ss")
public class PermissionService {
    /**
     * 所有權(quán)限標(biāo)識
     */
    private static final String ALL_PERMISSION = "*:*:*";
    /**
     * 管理員角色權(quán)限標(biāo)識
     */
    private static final String SUPER_ADMIN = "admin";
    private static final String ROLE_DELIMETER = ",";
    private static final String PERMISSION_DELIMETER = ",";
    /**
     * 驗證用戶是否具備某權(quán)限
     * @param permission 權(quán)限字符串
     * @return 用戶是否具備某權(quán)限
     */
    public boolean hasPermi(String permission) {
        if (StringUtils.isEmpty(permission)) {
            return false;
        }
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) {
            return false;
        }
        return hasPermissions(loginUser.getPermissions(), permission);
    }
    /**
     * 驗證用戶是否不具備某權(quán)限,與 hasPermi邏輯相反
     * @param permission 權(quán)限字符串
     * @return 用戶是否不具備某權(quán)限
     */
    public boolean lacksPermi(String permission) {
        return hasPermi(permission) != true;
    }
    /**
     * 驗證用戶是否具有以下任意一個權(quán)限
     * @param permissions 以 PERMISSION_NAMES_DELIMETER 為分隔符的權(quán)限列表
     * @return 用戶是否具有以下任意一個權(quán)限
     */
    public boolean hasAnyPermi(String permissions) {
        if (StringUtils.isEmpty(permissions)) {
            return false;
        }
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) {
            return false;
        }
        Set<String> authorities = loginUser.getPermissions();
        for (String permission : permissions.split(PERMISSION_DELIMETER)) {
            if (permission != null && hasPermissions(authorities, permission)) {
                return true;
            }
        }
        return false;
    }
    /**
     * 判斷用戶是否擁有某個角色
     * @param role 角色字符串
     * @return 用戶是否具備某角色
     */
    public boolean hasRole(String role) {
        if (StringUtils.isEmpty(role)) {
            return false;
        }
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) {
            return false;
        }
        for (SysRole sysRole : loginUser.getUser().getRoles()) {
            String roleKey = sysRole.getRoleKey();
            if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) {
                return true;
            }
        }
        return false;
    }
    /**
     * 驗證用戶是否不具備某角色,與 isRole邏輯相反。
     * @param role 角色名稱
     * @return 用戶是否不具備某角色
     */
    public boolean lacksRole(String role) {
        return hasRole(role) != true;
    }
    /**
     * 驗證用戶是否具有以下任意一個角色
     * @param roles 以 ROLE_NAMES_DELIMETER 為分隔符的角色列表
     * @return 用戶是否具有以下任意一個角色
     */
    public boolean hasAnyRoles(String roles) {
        if (StringUtils.isEmpty(roles)) {
            return false;
        }
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) {
            return false;
        }
        for (String role : roles.split(ROLE_DELIMETER)) {
            if (hasRole(role)) {
                return true;
            }
        }
        return false;
    }
    /**
     * 判斷是否包含權(quán)限
     * @param permissions 權(quán)限列表
     * @param permission  權(quán)限字符串
     * @return 用戶是否具備某權(quán)限
     */
    private boolean hasPermissions(Set<String> permissions, String permission) {
        return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission));
    }
}

到此這篇關(guān)于SpringBoot中的@PreAuthorize注解詳解的文章就介紹到這了,更多相關(guān)@PreAuthorize注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java對象轉(zhuǎn)換String類型的三種方法

    java對象轉(zhuǎn)換String類型的三種方法

    在很多情況下我們都需要將一個對象轉(zhuǎn)換為String類型。一般來說有三種方法可以實現(xiàn):Object.toString()、(String)Object、String.valueOf(Object)。下面對這三種方法一一分析
    2013-11-11
  • Java工具包之Lombok使用

    Java工具包之Lombok使用

    這篇文章主要介紹了Java工具包之Lombok使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • kafka消費不到數(shù)據(jù)的排查過程

    kafka消費不到數(shù)據(jù)的排查過程

    這篇文章主要介紹了kafka消費不到數(shù)據(jù)的排查過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • java關(guān)于String.split("|")的使用方式

    java關(guān)于String.split("|")的使用方式

    這篇文章主要介紹了java關(guān)于String.split("|")的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java日常開發(fā)中讀寫TXT文本舉例詳解

    Java日常開發(fā)中讀寫TXT文本舉例詳解

    這篇文章主要給大家介紹了關(guān)于Java日常開發(fā)中讀寫TXT文本,包括使用BufferedReader、Scanner、FileInputStream等類進(jìn)行讀取,以及使用BufferedWriter、PrintWriter、FileOutputStream等類進(jìn)行寫入,需要的朋友可以參考下
    2024-12-12
  • Java根據(jù)前端返回的字段名進(jìn)行查詢數(shù)據(jù)的實現(xiàn)方法

    Java根據(jù)前端返回的字段名進(jìn)行查詢數(shù)據(jù)的實現(xiàn)方法

    在Java后端開發(fā)中,我們經(jīng)常需要根據(jù)前端傳遞的參數(shù)(如字段名)來動態(tài)查詢數(shù)據(jù)庫中的數(shù)據(jù),這種需求通常出現(xiàn)在需要實現(xiàn)通用查詢功能或者復(fù)雜查詢接口的場景中,所以本文介紹了Java根據(jù)前端返回的字段名進(jìn)行查詢數(shù)據(jù)的實現(xiàn)方法,需要的朋友可以參考下
    2024-12-12
  • 一文帶你了解SpringBoot中常用注解的原理和使用

    一文帶你了解SpringBoot中常用注解的原理和使用

    這篇文章主要介紹了一文帶你了解SpringBoot中常用注解的原理和使用
    2022-11-11
  • Java程序員需要掌握的英語詞組

    Java程序員需要掌握的英語詞組

    這篇文章主要為大家詳細(xì)匯總了Java程序員需要掌握的英語詞組 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • JAVA中對List進(jìn)行查詢

    JAVA中對List進(jìn)行查詢

    下面小編就為大家?guī)硪黄趈ava List中進(jìn)行模糊查詢的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-08-08
  • Spring數(shù)據(jù)庫多數(shù)據(jù)源路由配置過程圖解

    Spring數(shù)據(jù)庫多數(shù)據(jù)源路由配置過程圖解

    這篇文章主要介紹了Spring數(shù)據(jù)庫多數(shù)據(jù)源路由配置過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06

最新評論

三台县| 鲁甸县| 宣化县| 长寿区| 大同市| 隆子县| 陆川县| 马关县| 邻水| 昭通市| 米脂县| 洛扎县| 渭南市| 北宁市| 宝坻区| 开江县| 鲜城| 澄江县| 新津县| 驻马店市| 杨浦区| 方山县| 宿迁市| 曲水县| 山西省| 连南| 巴里| 元江| 兴义市| 潞西市| 汽车| 永嘉县| 朝阳县| 海宁市| 介休市| 葫芦岛市| 周宁县| 青神县| 安西县| 菏泽市| 大足县|