用户权限分配
@PreAuthorize 是 Spring Security 中用于 方法级权限控制 的注解,作用是在方法调用前基于用户的权限表达式进行判断,从而决定是否允许访问该方法
| 表达式 | 说明 |
|---|---|
hasRole('ROLE_ADMIN') 或 hasRole('ADMIN') | 是否拥有某个角色(Spring Security 自动添加前缀 ROLE_) |
hasAuthority('sys:user:add') | 是否拥有某个权限(authority) |
hasAnyRole('ADMIN', 'USER') | 是否拥有任意一个角色 |
hasAnyAuthority('a', 'b') | 是否拥有任意一个权限 |
permitAll() | 无条件允许访问 |
denyAll() | 无条件拒绝访问 |
isAuthenticated() | 已登录用户 |
isAnonymous() | 匿名用户 |
principal.username == #username | 当前登录用户与参数一致 |
#id == authentication.principal.id | 参数值和当前登录用户ID一致(常用于自己操作自己的数据) |
@PreAuthorize(...):方法执行前进行权限判断 "@ss.hasPermi('system:user:list')":表示调用 Bean 名为 ss 的 Spring Bean(也就是下面定义的 PermissionManager 类),并执行其中的 hasPermi() 方法判断当前用户是否有 system:user:list 权限
java
@PreAuthorize("@ss.hasPermi('system:user:list')")
@GetMapping("/list")
@ApiOperation(value = "获取用户列表")
public TableDataInfo list(SysUser user) {
startPage();
List<SysUser> list = userService.selectUserList(user);
return getDataTable(list);
}java
@Service("ss")
public class PermissionManager {
/**
* 验证用户是否具备某权限
*
* @param permission 权限字符串
* @return 用户是否具备某权限
*/
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);
}
/**
* 判断是否包含权限
*
* @param permissions 权限列表
* @param permission 权限字符串
* @return 用户是否具备某权限
*/
private boolean hasPermissions(Set<String> permissions, String permission) {
return permissions.contains(Constants.ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission));
}
}工作机制流程图
java
请求 /list --> list() 方法执行前触发 @PreAuthorize
|
--> 执行表达式 @ss.hasPermi('system:user:list')
|
--> PermissionManager.hasPermi('system:user:list')
|
--> SecurityUtils.getLoginUser()
|
--> 获取权限集合 permissions
|
--> 检查是否包含 system:user:list
|
--> true:放行调用 list()
--> false:拒绝访问,返回 403