权限注解实现
# 权限注解实现
在企业级应用中,权限控制是非常关键的一部分。若依框架通过集成 Spring Security,提供了一整套基于注解的权限控制机制。本文将详细介绍如何在若依框架中实现权限注解控制,并涵盖常见的使用场景和注意事项。
# 一、@PreAuthorize 注解与 Spring EL 表达式
@PreAuthorize
注解用于配置接口访问权限,基于 Spring EL 表达式,允许我们在接口方法上添加注解,以控制访问权限。若依框架扩展了 Spring Security 的权限服务,使其更易于在项目中使用。
# 1. @PreAuthorize
注解的方法说明
方法 | 参数 | 描述 |
---|---|---|
hasPermi | String | 验证用户是否具备某权限 |
lacksPermi | String | 验证用户是否不具备某权限,与 hasPermi 逻辑相反 |
hasAnyPermi | String | 验证用户是否具备以下任意一个权限 |
hasRole | String | 判断用户是否拥有某个角色 |
lacksRole | String | 验证用户是否不具备某角色,与 hasRole 逻辑相反 |
hasAnyRoles | String | 验证用户是否具备以下任意一个角色,多个角色使用逗号分隔 |
这些方法在 @PreAuthorize
注解中配合 Spring EL 表达式使用,可实现灵活的权限控制。
# 二、权限注解的使用示例
# 1. 基于权限的控制
若依框架中的 @ss
代表的是 PermissionService
服务,对每个接口拦截并调用 PermissionService
的对应方法判断接口调用者的权限。
- 验证用户是否具备指定权限:
// 验证用户是否具备 system:user:list 权限
@PreAuthorize("@ss.hasPermi('system:user:list')")
@GetMapping("/list")
public List<User> listUsers() {
return userService.listAllUsers();
}
2
3
4
5
6
- 验证用户是否不具备某权限:
// 验证用户是否不具备 system:user:list 权限
@PreAuthorize("@ss.lacksPermi('system:user:list')")
@GetMapping("/noList")
public String noAccessToList() {
return "你没有查看用户列表的权限";
}
2
3
4
5
6
- 验证用户是否具备任意一个权限:
// 验证用户是否具备 system:user:add 或 system:user:edit 权限
@PreAuthorize("@ss.hasAnyPermi('system:user:add,system:user:edit')")
@PostMapping("/save")
public String saveUser(User user) {
userService.saveUser(user);
return "用户保存成功";
}
2
3
4
5
6
7
# 2. 基于角色的控制
- 验证用户是否具备某个角色:
// 验证用户是否具备 'admin' 角色
@PreAuthorize("@ss.hasRole('admin')")
@GetMapping("/adminPage")
public String adminPage() {
return "这是管理员页面";
}
2
3
4
5
6
- 验证用户是否不具备某个角色:
// 验证用户是否不具备 'admin' 角色
@PreAuthorize("@ss.lacksRole('admin')")
@GetMapping("/nonAdminPage")
public String nonAdminPage() {
return "你不是管理员";
}
2
3
4
5
6
- 验证用户是否具备任意一个角色:
// 验证用户是否具备 'admin' 或 'user' 角色
@PreAuthorize("@ss.hasAnyRoles('admin,user')")
@GetMapping("/adminOrUserPage")
public String adminOrUserPage() {
return "你是管理员或普通用户";
}
2
3
4
5
6
# 三、编程式权限判断
在某些情况下,我们可能需要在代码逻辑中动态判断用户是否具有某些权限或角色。若依框架提供了 SecurityUtils
工具类来简化这一操作。
# 1. 判断用户是否具备某权限
if (SecurityUtils.hasPermi("system:user:edit")) {
System.out.println("当前用户有编辑用户的权限");
} else {
System.out.println("当前用户没有编辑用户的权限");
}
2
3
4
5
# 2. 判断用户是否具备某个角色
if (SecurityUtils.hasRole("admin")) {
System.out.println("当前用户是管理员");
} else {
System.out.println("当前用户不是管理员");
}
2
3
4
5
# 四、公开接口的实现
有时,我们希望某些接口可以公开访问,不受权限控制。若依框架提供了 @Anonymous
注解,用于标识无需权限验证的接口。
@Anonymous
@GetMapping("/public")
public List<SysXxxx> listPublicData() {
return xxxxService.listAll();
}
2
3
4
5
在使用 @Anonymous
注解后,该接口不再受 Spring Security 的权限控制,无需登录即可访问。
# 五、注意事项与最佳实践
# 1. 超级管理员权限
在若依框架中,超级管理员默认拥有所有权限,不受权限限制。这意味着,如果当前用户是超级管理员,所有带权限注解的接口都会放行。
# 2. 权限与角色的合理使用
在实际开发中,应根据业务需求合理设计权限与角色。角色通常用于区分不同级别的用户(如管理员、普通用户),而权限则用于细粒度控制具体操作(如增删改查)。
# 3. 权限控制的优先级
在同一接口上,如果同时存在多个权限控制注解,Spring Security 会根据注解的顺序依次检查。一旦某个权限检查失败,后续的检查将不会执行。
# 4. 公共资源的管理
对于无需登录即可访问的公共资源,如首页、登录页等,可以统一使用 @Anonymous
注解进行标注,避免误用权限控制导致用户无法访问这些页面。