RuoYi学习-权限(permission)
本文最后更新于 2024-04-09,欢迎来到我的Blog! https://www.zpeng.site/
RuoYi学习-权限(permission)
1.数据权限
自定义注解+aop获得对应拼接sql与原来sql进行拼接
数据权限使用
1、在(系统管理-角色管理)设置需要数据权限的角色 目前支持以下几种权限
全部数据权限
自定数据权限
部门数据权限
部门及以下数据权限
仅本人数据权限
2、在需要数据权限控制方法上添加@DataScope
注解,其中d
和u
用来表示表的别名
部门数据权限注解
@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_id
和user_id
这两个字段。
2.访问权限
自定义注解
权限注解
Spring Security
提供了Spring EL
表达式,允许我们在定义接口访问的方法上面添加注解,来控制访问权限。
权限方法
@PreAuthorize
注解用于配置接口要求用户拥有某些权限才可访问,它拥有如下方法
使用示例
其中@ss
代表的是PermissionService 服务,对每个接口拦截并调用PermissionService
的对应方法判断接口调用者的权限。
数据权限示例。
// 符合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("当前用户有编辑用户权限");
}
角色权限示例。
// 属于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 注解的使用方式:
添加依赖:首先,确保项目中已添加了 Spring Security 相关的依赖。
配置权限表达式:打开项目的 Spring Security 配置文件(如 SecurityConfig.java),在配置类上添加 @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) 注解,以开启方法级别的权限验证,并支持 @PreAuthorize 注解。src/main/java/com/ruoyi/framework/config/SecurityConfig.java
在方法上添加
@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);
}
- 感谢你赐予我前进的力量