欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中的@PreAuthorize注解詳解

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

@PreAuthorize注解

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

只有當(dāng)@EnableGlobalMethodSecurity(prePostEnabled=true)的時候,@PreAuthorize才可以使用,@EnableGlobalMethodSecurity注解在SPRING安全中心進行設(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 表達式返回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)文章

  • Spring MVC常用客戶端參數(shù)接收方式詳解

    Spring MVC常用客戶端參數(shù)接收方式詳解

    這篇文章主要介紹了Spring MVC常用客戶端參數(shù)接收方式詳解,文章主要介紹了幾種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • java實現(xiàn)自定義表格渲染和編輯

    java實現(xiàn)自定義表格渲染和編輯

    這篇文章主要為大家詳細(xì)介紹了java如何實現(xiàn)自定義表格渲染和編輯,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • JavaWeb禁止瀏覽器緩存當(dāng)前Web頁面的方法

    JavaWeb禁止瀏覽器緩存當(dāng)前Web頁面的方法

    所謂瀏覽器緩存,是指當(dāng)?shù)谝淮卧L問網(wǎng)頁時,瀏覽器會將這些網(wǎng)頁緩存到本地,當(dāng)下一次再訪問這些被緩存的網(wǎng)頁時,瀏覽器就會直接從本地讀取這些網(wǎng)頁的內(nèi)容,而無需再從網(wǎng)絡(luò)上獲取
    2017-11-11
  • Java?同步工具與組合類的線程安全性解析

    Java?同步工具與組合類的線程安全性解析

    這篇文章主要介紹了Java?同步工具與組合類的線程安全性解析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Java設(shè)計模式之狀態(tài)模式

    Java設(shè)計模式之狀態(tài)模式

    這篇文章介紹了Java設(shè)計模式之狀態(tài)模式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • 詳解Windows?配置Java環(huán)境變量的方法

    詳解Windows?配置Java環(huán)境變量的方法

    這篇文章主要介紹了Windows?配置Java環(huán)境變量,通過配置JAVA_HOME環(huán)境變量,配置Path環(huán)境變量的過程解析,給大家詳細(xì)介紹了java環(huán)境變量的配置過程,需要的朋友可以參考下
    2022-04-04
  • SpringBoot Entity中枚舉類型詳細(xì)使用介紹

    SpringBoot Entity中枚舉類型詳細(xì)使用介紹

    本文介紹SpringBoot如何在Entity(DAO)中使用枚舉類型。(本文使用MyBatis-Plus)。在實際開發(fā)中,經(jīng)常會遇到表示類型或者狀態(tài)的情況,比如:有三種支付方式:微信、支付寶、銀聯(lián)。本文介紹如何這種場景的方案對比,并用實例來介紹如何用枚舉這種最優(yōu)雅的來表示
    2022-10-10
  • Java 深入淺出分析Synchronized原理與Callable接口

    Java 深入淺出分析Synchronized原理與Callable接口

    Synchronized關(guān)鍵字解決的是多個線程之間訪問資源的同步性,synchronized關(guān)鍵字可以保證被它修飾的方法或者代碼塊在任意時刻只能有一個線程執(zhí)行,Runnable是執(zhí)行工作的獨立任務(wù),但是不返回任何值。如果我們希望任務(wù)完成之后有返回值,可以實現(xiàn)Callable接口
    2022-03-03
  • Spring?@Conditional注解示例詳細(xì)講解

    Spring?@Conditional注解示例詳細(xì)講解

    @Conditional是Spring4新提供的注解,它的作用是按照一定的條件進行判斷,滿足條件給容器注冊bean,這篇文章主要介紹了Spring?@Conditional注解示例詳細(xì)講解,需要的朋友可以參考下
    2022-11-11
  • java 讀取本地文件實例詳解

    java 讀取本地文件實例詳解

    這篇文章主要介紹了java 讀取本地文件實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評論