SpringBoot中的@PreAuthorize注解詳解
@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關(guān)于String.split("|")的使用方式
這篇文章主要介紹了java關(guān)于String.split("|")的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
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
Spring數(shù)據(jù)庫多數(shù)據(jù)源路由配置過程圖解
這篇文章主要介紹了Spring數(shù)據(jù)庫多數(shù)據(jù)源路由配置過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06

