跳到主要内容

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.SecurityUtilsorg.jeecg.config.security.utils.SecureUtil
(LoginUser) SecurityUtils.getSubject().getPrincipal()SecureUtil.currentUser()
org.apache.shiro.authz.annotation.RequiresRolesorg.springframework.security.access.prepost.PreAuthorize
org.apache.shiro.authz.annotation.RequiresPermissionsorg.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));
}
}