Skip to content

用户权限分配

@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

Last updated: