美文网首页
若依aop之DataScope数据权限的使用与mybatis p

若依aop之DataScope数据权限的使用与mybatis p

作者: 小明_d19e | 来源:发表于2021-05-12 15:30 被阅读0次

    我有这么个需求:同一个表在不同的数据权限下,显示不同的数据.
    这个有些类似细颗粒度权限设计了,其实你把一些接口开放给用户使用经常会碰到这个问题.
    若依其实已经实现了这个功能,就是aop:@DataScope
    根据用户管理的用法:

        @Override
        @DataScope(deptAlias = "d", userAlias = "u")
        public List<SysUser> selectUserList(SysUser user)
        {
            return userMapper.selectUserList(user);
        }
    

    mybatis mapper.xml

    <select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
            select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader,d.ancestors from sys_user u
            left join sys_dept d on u.dept_id = d.dept_id
            where u.del_flag = '0'
            <if test="userName != null and userName != ''">
                AND u.user_name like concat('%', #{userName}, '%')
            </if>
            <if test="status != null and status != ''">
                AND u.status = #{status}
            </if>
            <if test="phonenumber != null and phonenumber != ''">
                AND u.phonenumber like concat('%', #{phonenumber}, '%')
            </if>
            <if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
                AND date_format(u.create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
            </if>
            <if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
                AND date_format(u.create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
            </if>
            <!-- OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) ) -->
            <if test="deptId != null and deptId != 0">
                AND (u.dept_id = #{deptId} )
            </if>
            <!-- 数据范围过滤 -->
            ${params.dataScope}
        </select>
    

    看到了吧,这里最后写了个${params.dataScope},其实这个params是从BaseEntity继承来的,所以如果你用mp的话,其必须继承自这个类,但是这里有个坑:mp不存在的字段在查询的时候就报错了,所以需要改造若依源码,加上@TableField(exist = false)

    
    public class BaseEntity implements Serializable
    {
        private static final long serialVersionUID = 1L;
    
        @TableField(exist = false)
        /** 搜索值 */
        private String searchValue;
        @TableField(exist = false)
        /** 创建者 */
        private String createBy;
        @TableField(exist = false)
        /** 创建时间 */
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private Date createTime;
        @TableField(exist = false)
        /** 更新者 */
        private String updateBy;
        @TableField(exist = false)
        /** 更新时间 */
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private Date updateTime;
        @TableField(exist = false)
        /** 备注 */
        private String remark;
        @TableField(exist = false)
        /** 请求参数 */
        private Map<String, Object> params;
    
    ...后面不拷贝了
    

    这样mp和若依就兼容了,你查询的sql会自动在末尾加上and u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) )
    角色管理的数据权限设置为:本部门及以下数据权限

    相关文章

      网友评论

          本文标题:若依aop之DataScope数据权限的使用与mybatis p

          本文链接:https://www.haomeiwen.com/subject/cwuadltx.html