Spring Authorization 权限注解
Spring Authorization Server 是 JeecgBoot SpringBoot3 + SAS 分支使用的权限框架。
分支地址:https://github.com/jeecgboot/JeecgBoot/tree/springboot3_sas
概述
Spring Authorization Server 基于 Spring Security,是专注于实现 OAuth 2.1 授权服务器功能的框架。JeecgBoot 对其进行了自定义扩展,提供了与 Shiro 兼容的权限校验方法,便于从 Shiro 平滑迁移。
常用权限注解
权限校验
JeecgBoot 提供了与 Shiro 兼容的权限校验方法,便于从 Shiro 迁移。
// 必须拥有指定权限
@PreAuthorize("@jps.requiresPermissions('user:add')")
@RequestMapping(value = "/add", method = RequestMethod.POST)
public Result<SysUser> add(@RequestBody SysUser user) {
userService.save(user);
return Result.ok("添加成功");
}
// 权限组合使用(OR 关系)
@PreAuthorize("@jps.requiresPermissions('user:add') or @jps.requiresPermissions('user:edit')")
@RequestMapping("/saveOrUpdate")
public Result<?> saveOrUpdate(@RequestBody SysUser user) {
userService.saveOrUpdate(user);
return Result.ok("保存成功");
}
// 权限和角色组合使用
@PreAuthorize("@jps.requiresPermissions('system:quartzJob:add') or @jps.requiresRoles('admin')")
@RequestMapping("/saveJob")
public Result<?> saveJob(@RequestBody QuartzJob job) {
return Result.ok("保存成功");
}
3. 角色校验
// 必须拥有指定角色
@PreAuthorize("@jps.requiresRoles('admin')")
@RequestMapping("/delete")
public Result<?> delete(@RequestParam String id) {
userService.removeById(id);
return Result.ok("删除成功");
}
// 角色组合使用(OR 关系)
@PreAuthorize("@jps.requiresRoles('admin') or @jps.requiresRoles('manager')")
@RequestMapping("/audit")
public Result<?> audit() {
return Result.ok("审核页面");
}
4. 复杂表达式
// 组合条件(AND)
@PreAuthorize("@jps.requiresRoles('admin') and @jps.requiresPermissions('user:delete')")
@RequestMapping("/forceDelete")
public Result<?> forceDelete(@RequestParam String id) {
return Result.ok("强制删除");
}
// 组合条件(OR)
@PreAuthorize("@jps.requiresRoles('admin') or @jps.requiresPermissions('user:view')")
@RequestMapping("/view")
public Result<?> view(@RequestParam String id) {
return Result.ok("查看详情");
}
从 Shiro 迁移
JeecgBoot 提供了平滑的迁移方案,使用 @jps 服务保持与 Shiro 相同的使用习惯。
注解迁移对照表
| Shiro 注解 | Spring Authorization Server 替换方案 |
|---|---|
@RequiresRoles("admin") | @PreAuthorize("@jps.requiresRoles('admin')") |
@RequiresPermissions("sys:role") | @PreAuthorize("@jps.requiresPermissions('sys:role')") |
| 组合使用 | @PreAuthorize("@jps.requiresPermissions('system:quartzJob:add') or @jps.requiresRoles('admin')") |
代码升级对照表
| 搜索 | 替换为 |
|---|---|
org.apache.shiro.SecurityUtils | org.jeecg.config.security.utils.SecureUtil |
(LoginUser) SecurityUtils.getSubject().getPrincipal() | SecureUtil.currentUser() |
org.apache.shiro.authz.annotation.RequiresRoles | org.springframework.security.access.prepost.PreAuthorize |
org.apache.shiro.authz.annotation.RequiresPermissions | org.springframework.security.access.prepost.PreAuthorize |
@RequiresPermissions("xxx") | @PreAuthorize("@jps.requiresPermissions('xxx')") |
@RequiresRoles("xxx") | @PreAuthorize("@jps.requiresRoles('xxx')") |
菜单配置权限标识
1. 打开系统菜单

2. 添加按钮权限
找到对应的列表,添加下级按钮权限:

3. 给角色分配权限
进入角色管理授权访问权限:

4. 生效说明
权限配置修改后,需要退出重新登录才能生效。
权限配置修改后,需要退出重新登录才能生效。
权限标识命名规范
模块:操作
例如:
user:add - 用户添加
user:edit - 用户编辑
user:delete - 用户删除
user:view - 用户查看
user:export - 用户导出
system:quartzJob:add - 系统定时任务添加
最佳实践
1. 推荐使用 JeecgBoot 自定义方式
使用 @jps 方式,与 Shiro 保持一致的使用习惯:
@RestController
@RequestMapping("/sys/user")
public class SysUserController {
@PreAuthorize("@jps.requiresPermissions('user:add')")
@PostMapping("/add")
public Result<?> add(@RequestBody SysUser user) {
return Result.ok(userService.save(user));
}
@PreAuthorize("@jps.requiresRoles('admin')")
@DeleteMapping("/delete")
public Result<?> delete(@RequestParam String id) {
return Result.ok(userService.removeById(id));
}
}