SpringBoot中的@PreAuthorize注解詳解
@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)文章
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-11SpringBoot Entity中枚舉類型詳細(xì)使用介紹
本文介紹SpringBoot如何在Entity(DAO)中使用枚舉類型。(本文使用MyBatis-Plus)。在實際開發(fā)中,經(jīng)常會遇到表示類型或者狀態(tài)的情況,比如:有三種支付方式:微信、支付寶、銀聯(lián)。本文介紹如何這種場景的方案對比,并用實例來介紹如何用枚舉這種最優(yōu)雅的來表示2022-10-10Java 深入淺出分析Synchronized原理與Callable接口
Synchronized關(guān)鍵字解決的是多個線程之間訪問資源的同步性,synchronized關(guān)鍵字可以保證被它修飾的方法或者代碼塊在任意時刻只能有一個線程執(zhí)行,Runnable是執(zhí)行工作的獨立任務(wù),但是不返回任何值。如果我們希望任務(wù)完成之后有返回值,可以實現(xiàn)Callable接口2022-03-03Spring?@Conditional注解示例詳細(xì)講解
@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進行判斷,滿足條件給容器注冊bean,這篇文章主要介紹了Spring?@Conditional注解示例詳細(xì)講解,需要的朋友可以參考下2022-11-11