程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 快速入门

  • 后端手册

    • 分页实现
    • 导入导出功能
    • 文件上传与下载
    • 权限注解实现
      • 一、@PreAuthorize 注解与 Spring EL 表达式
        • 1. @PreAuthorize 注解的方法说明
      • 二、权限注解的使用示例
        • 1. 基于权限的控制
        • 2. 基于角色的控制
      • 三、编程式权限判断
        • 1. 判断用户是否具备某权限
        • 2. 判断用户是否具备某个角色
      • 四、公开接口的实现
      • 五、注意事项与最佳实践
        • 1. 超级管理员权限
        • 2. 权限与角色的合理使用
        • 3. 权限控制的优先级
        • 4. 公共资源的管理
    • 事务管理详解
    • 全局异常处理
    • 参数验证详解
    • 数据脱敏详解
    • 系统日志功能实现
    • 数据权限控制
    • 多数据源实现
    • 代码生成功能
    • 定时任务实现
    • 系统接口文档生成
    • 防重复提交实现
    • 国际化支持
    • 新建子模块
  • 前端手册

  • 组件文档

  • 数据库分析

  • 若依框架
  • 后端手册
scholar
2024-08-31
目录

权限注解实现

# 权限注解实现

在企业级应用中,权限控制是非常关键的一部分。若依框架通过集成 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();
}
1
2
3
4
5
6
  • 验证用户是否不具备某权限:
// 验证用户是否不具备 system:user:list 权限
@PreAuthorize("@ss.lacksPermi('system:user:list')")
@GetMapping("/noList")
public String noAccessToList() {
    return "你没有查看用户列表的权限";
}
1
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 "用户保存成功";
}
1
2
3
4
5
6
7

# 2. 基于角色的控制

  • 验证用户是否具备某个角色:
// 验证用户是否具备 'admin' 角色
@PreAuthorize("@ss.hasRole('admin')")
@GetMapping("/adminPage")
public String adminPage() {
    return "这是管理员页面";
}
1
2
3
4
5
6
  • 验证用户是否不具备某个角色:
// 验证用户是否不具备 'admin' 角色
@PreAuthorize("@ss.lacksRole('admin')")
@GetMapping("/nonAdminPage")
public String nonAdminPage() {
    return "你不是管理员";
}
1
2
3
4
5
6
  • 验证用户是否具备任意一个角色:
// 验证用户是否具备 'admin' 或 'user' 角色
@PreAuthorize("@ss.hasAnyRoles('admin,user')")
@GetMapping("/adminOrUserPage")
public String adminOrUserPage() {
    return "你是管理员或普通用户";
}
1
2
3
4
5
6

# 三、编程式权限判断

在某些情况下,我们可能需要在代码逻辑中动态判断用户是否具有某些权限或角色。若依框架提供了 SecurityUtils 工具类来简化这一操作。

# 1. 判断用户是否具备某权限

if (SecurityUtils.hasPermi("system:user:edit")) {
    System.out.println("当前用户有编辑用户的权限");
} else {
    System.out.println("当前用户没有编辑用户的权限");
}
1
2
3
4
5

# 2. 判断用户是否具备某个角色

if (SecurityUtils.hasRole("admin")) {
    System.out.println("当前用户是管理员");
} else {
    System.out.println("当前用户不是管理员");
}
1
2
3
4
5

# 四、公开接口的实现

有时,我们希望某些接口可以公开访问,不受权限控制。若依框架提供了 @Anonymous 注解,用于标识无需权限验证的接口。

@Anonymous
@GetMapping("/public")
public List<SysXxxx> listPublicData() {
    return xxxxService.listAll();
}
1
2
3
4
5

在使用 @Anonymous 注解后,该接口不再受 Spring Security 的权限控制,无需登录即可访问。

# 五、注意事项与最佳实践

# 1. 超级管理员权限

在若依框架中,超级管理员默认拥有所有权限,不受权限限制。这意味着,如果当前用户是超级管理员,所有带权限注解的接口都会放行。

# 2. 权限与角色的合理使用

在实际开发中,应根据业务需求合理设计权限与角色。角色通常用于区分不同级别的用户(如管理员、普通用户),而权限则用于细粒度控制具体操作(如增删改查)。

# 3. 权限控制的优先级

在同一接口上,如果同时存在多个权限控制注解,Spring Security 会根据注解的顺序依次检查。一旦某个权限检查失败,后续的检查将不会执行。

# 4. 公共资源的管理

对于无需登录即可访问的公共资源,如首页、登录页等,可以统一使用 @Anonymous 注解进行标注,避免误用权限控制导致用户无法访问这些页面。

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
文件上传与下载
事务管理详解

← 文件上传与下载 事务管理详解→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式