1.若依架构自带的数据权限为以下几种:
文章图片
2.再功能模块给用户角色配置对应的数据权限如何让它生效
1)查看自己若依架构的
com.ruoyi.framework.aspectj.
DataScopeAspect类
/** * 数据过滤处理 * * @author ruoyi */ @Aspect @Component public class DataScopeAspect { /** * 全部数据权限 */ public static final String DATA_SCOPE_ALL = "1"; /** * 自定数据权限 */ public static final String DATA_SCOPE_CUSTOM = "2"; /** * 部门数据权限 */ public static final String DATA_SCOPE_DEPT = "3"; /** * 部门及以下数据权限 */ public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; /** * 仅本人数据权限 */ public static final String DATA_SCOPE_SELF = "5"; /** * 数据权限过滤关键字 */ public static final String DATA_SCOPE = "dataScope"; // 配置织入点 @Pointcut("@annotation(com.ruoyi.common.annotation.DataScope)") public void dataScopePointCut() { }@Before("dataScopePointCut()") public void doBefore(JoinPoint point) throws Throwable { handleDataScope(point); }protected void handleDataScope(final JoinPoint joinPoint) { // 获得注解 DataScope controllerDataScope = getAnnotationLog(joinPoint); if (controllerDataScope == null) { return; } // 获取当前的用户 LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest()); if (StringUtils.isNotNull(loginUser)) { SysUser currentUser = loginUser.getUser(); // 如果是超级管理员,则不过滤数据 if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) { dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), controllerDataScope.userAlias()); } } }/** * 数据范围过滤 * * @param joinPoint 切点 * @param user 用户 * @param userAlias 别名 */ public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias) { StringBuilder sqlString = new StringBuilder(); for (SysRole role : user.getRoles()) { String dataScope = role.getDataScope(); if (DATA_SCOPE_ALL.equals(dataScope)) { sqlString = new StringBuilder(); break; } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { sqlString.append(StringUtils.format( " or {}.id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, role.getRoleId())); } else if (DATA_SCOPE_DEPT.equals(dataScope)) { sqlString.append(StringUtils.format(" or {}.id = '{}' ", deptAlias, user.getDeptId())); } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { sqlString.append(StringUtils.format( /*" and {}.id IN ( SELECT id FROM sys_dept WHERE id = '{}' or find_in_set( '{}' , ancestors ) )", deptAlias, user.getDeptId(), user.getDeptId())); */ " or {}.id IN ( SELECT id FROM sys_dept WHERE id = '{}' or org_code like( SELECT CONCAT(org_code,'%') FROM sys_dept WHERE id = '{}' ) )", deptAlias, user.getDeptId(), user.getDeptId())); } else if (DATA_SCOPE_SELF.equals(dataScope)) { if (StringUtils.isNotBlank(userAlias)) { if(userAlias.contains(".")){ sqlString.append(StringUtils.format(" or {} = '{}' ", userAlias, user.getUserName())); }else{ sqlString.append(StringUtils.format(" or {}.id = '{}' ", userAlias, user.getId())); }} else { // 数据权限为仅本人且没有userAlias别名不查询任何数据 sqlString.append(" OR 1=0 "); } } }if (StringUtils.isNotBlank(sqlString.toString())) { Object params = joinPoint.getArgs()[0]; if (StringUtils.isNotNull(params) && params instanceof BaseEntity) { BaseEntity baseEntity = (BaseEntity) params; baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")"); } } }/** * 是否存在注解,如果存在就获取 */ private DataScope getAnnotationLog(JoinPoint joinPoint) { Signature signature = joinPoint.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; Method method = methodSignature.getMethod(); if (method != null) { return method.getAnnotation(DataScope.class); } return null; }
【java|若依框架使用数据权限】以上就是其实现原理,如果功能未成功,请仔细查看输出的sql看哪里不对
使用方式:
1.实体类有要当前创建人的用户id和部门id,但是这个不一定,根据你的业务需求进行合理筛选
2.再service实现类的查询方法上面添加
@DataScope(deptAlias = "t",userAlias = "t.create_name")
t就是你功能表的别名
3.再对应的功能查询的sql末尾添加
${params.dataScope}
注意:实体类是继承BaseEntity
推荐阅读
- 笔记|如何在若依中做数据权限
- Java|ruoyi使用AOP控制数据权限案例
- Spring|若依-数据权限管理-DataScope
- Spring系列|若依如何实现数据范围过滤的
- 若依源码学习笔记|若依源码学习4(AOP实现数据权限控制)
- 若依框架|基于若依框架的数据权限。
- springBoot|SpringBoot整合Spring Security+JWT实现前后端分离登录权限处理
- Authing|如何使用 Authing 单点登录,集成 Discourse 论坛()
- 产品功能|单点登录的三种实现方式