本文最后更新于 2024-04-09,欢迎来到我的Blog! https://www.zpeng.site/

RuoYi学习-权限(permission)

1.数据权限

自定义注解+aop获得对应拼接sql与原来sql进行拼接

数据权限使用

1、在(系统管理-角色管理)设置需要数据权限的角色 目前支持以下几种权限

  • 全部数据权限

  • 自定数据权限

  • 部门数据权限

  • 部门及以下数据权限

  • 仅本人数据权限

2、在需要数据权限控制方法上添加@DataScope注解,其中du用来表示表的别名

部门数据权限注解

@DataScope(deptAlias = "d")
public List<...> select(...)
{
    return mapper.select(...);
}

部门及用户权限注解

@DataScope(deptAlias = "d", userAlias = "u")
public List<...> select(...)
{
    return mapper.select(...);
}

3、在mybatis查询底部标签添加数据范围过滤

<select id="select" parameterType="..." resultMap="...Result">
    <include refid="select...Vo"/>
    <!-- 数据范围过滤 -->
    ${params.dataScope}
</select>

逻辑实现代码:src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java

提示

仅实体继承BaseEntity才会进行处理,SQL语句会存放到BaseEntity对象中的params属性中,然后在xml中通过${params.dataScope}获取拼接后的语句。
PS:如果是自己的业务表需要实现数据权限,需要有dept_iduser_id这两个字段。

2.访问权限

自定义注解

权限注解

Spring Security提供了Spring EL表达式,允许我们在定义接口访问的方法上面添加注解,来控制访问权限。

权限方法

@PreAuthorize注解用于配置接口要求用户拥有某些权限才可访问,它拥有如下方法

方法

参数

描述

hasPermi

String

验证用户是否具备某权限

lacksPermi

String

验证用户是否不具备某权限,与 hasPermi逻辑相反

hasAnyPermi

String

验证用户是否具有以下任意一个权限

hasRole

String

判断用户是否拥有某个角色

lacksRole

String

验证用户是否不具备某角色,与 isRole逻辑相反

hasAnyRoles

String

验证用户是否具有以下任意一个角色,多个逗号分隔

使用示例

其中@ss代表的是PermissionService 服务,对每个接口拦截并调用PermissionService的对应方法判断接口调用者的权限。

  1. 数据权限示例。

// 符合system:user:list权限要求
@PreAuthorize("@ss.hasPermi('system:user:list')")

// 不符合system:user:list权限要求
@PreAuthorize("@ss.lacksPermi('system:user:list')")

// 符合system:user:add或system:user:edit权限要求即可
@PreAuthorize("@ss.hasAnyPermi('system:user:add,system:user:edit')")

编程式判断是否有资源权限

if (SecurityUtils.hasPermi("sys:user:edit"))
{
    System.out.println("当前用户有编辑用户权限");
}
  1. 角色权限示例。

// 属于user角色
@PreAuthorize("@ss.hasRole('user')")

// 不属于user角色
@PreAuthorize("@ss.lacksRole('user')")

// 属于user或者admin之一
@PreAuthorize("@ss.hasAnyRoles('user,admin')")

编程式判断是否有角色权限

if (SecurityUtils.hasRole("admin"))
{
    System.out.println("当前用户有admin角色权限");
}

权限提示

超级管理员拥有所有权限,不受权限约束。

3.@PreAuthorize

@PreAuthorize 是 Spring Security 提供的注解之一,用于在方法执行之前进行权限验证。通过使用 @PreAuthorize 注解,可以在方法级别对用户的权限进行校验,只有具备相应权限的用户才能执行被注解的方法。

以下是 @PreAuthorize 注解的使用方式:

  1. 添加依赖:首先,确保项目中已添加了 Spring Security 相关的依赖。

  2. 配置权限表达式:打开项目的 Spring Security 配置文件(如 SecurityConfig.java),在配置类上添加 @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) 注解,以开启方法级别的权限验证,并支持 @PreAuthorize 注解。src/main/java/com/ruoyi/framework/config/SecurityConfig.java

  1. 在方法上添加 @PreAuthorize 注解:找到需要进行权限验证的方法,在方法上添加 @PreAuthorize 注解,并指定相应的权限表达式

@Log(title = "参数管理", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:config:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysConfig config)
{
    List<SysConfig> list = configService.selectConfigList(config);
    ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
    util.exportExcel(response, list, "参数数据");
}
  • ss 是一个注册在 Spring容器中的BEAN,对应的类是src/main/java/com/ruoyi/framework/web/service/PermissionService.java

  • hasPermi 是PermissionService类中定义的方法;

  • 当Spring EL 表达式返回TRUE,则权限校验通过;

@Service("ss")
public class PermissionService
{
    /**
     * 验证用户是否具备某权限
     * 
     * @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;
        }
        PermissionContextHolder.setContext(permission);
        return hasPermissions(loginUser.getPermissions(), permission);
    }