数据权限的处理:用AOP+自定义注解解决

由于遇到项目中要做数据权限处理,参考网上大神所做
一、自定义注解
@Retention(RetentionPolicy.RUNTIME) //执行期
@Target(ElementType.METHOD) //作用于方法上
@Documented
public @interface DataAuthc {
    /**
     * 表的别名
     */
    public String tableAlias() default "";
}

二、AOP
@Aspect和@Component注解必须加否则Spring容器无法得知此类,也就不会起到切面作用

@Aspect
@Component
public class DataAuthcAspect {
    //所有数据权限
    public static final String DATA_AUTHC_ALL = "1";
    //自定义数据权限
    public static final String DATA_AUTHC_DEFINE = "2";
    //参数名
    public static final String DATA_AUTHC= "dataAuthc";  

    /**
     * 切入点:在加了@DataAuthc注解的方法上
     */
    @Pointcut("@annotation(com.zytt.annotation.DataAuthc)")
    public void dataAuthcPointCut() {
    }

    /**
     * 前置通知 过滤所有数据
     */
    @Before("dataAuthcPointCut()")
    public void doBefore(JoinPoint point) {
        DataAuthc authc = getAnnotation(point);
        if (authc == null) {
            return;
        }
        //获取当前用户
        SysUser user = UserUtils.getSysUser();
        if (user != null) {
            //用户是管理员则不过滤数据,不是则过滤数据
            if (!user.isAdmin()) {
                doFilterData(point, user, authc.tableAlias());
            }
        }
    }

    /**
     * 过滤数据
     * @param point
     * @param user
     * @param tableAlias
     */
    private static void doFilterData(JoinPoint point, SysUser user, String tableAlias) {
        StringBuilder sqlString = new StringBuilder();
        for (SysRole role : user.getRoles()) {
            String dataScope = role.getDataScope();
            if(DATA_AUTHC_ALL.equals(dataScope)){
                sqlString = new StringBuilder();
                break;
            }else if(DATA_AUTHC_DEFINE.equals(dataScope) ){
                sqlString.append(StringUtils.format(
                        " OR {}.orgid IN ( SELECT orgid FROM sys_role_org WHERE role_id = {} ) ", tableAlias,
                        role.getRoleId()));
            }
        }
        if (StringUtils.isNotBlank(sqlString.toString()))
        {
            BaseEntity baseEntity = (BaseEntity) point.getArgs()[0];
            baseEntity.getParams().put(DATA_AUTHC, " AND (" + sqlString.substring(4) + ")");
        }
    }


    /**
     * 获取注解
     *
     * @param point
     * @return
     */
    public DataAuthc getAnnotation(JoinPoint point) {
        //获取注解
        MethodSignature methodSignature = (MethodSignature) point.getSignature();
        //获取方法
        Method method = methodSignature.getMethod();
        //获取方法上的注解
        if (method != null) {
            return method.getAnnotation(DataAuthc.class);
        }
        return null;
    }
}

在实现类上需要做数据权限的地方加上注解与表别名

    @DataAuthc(tableAlias = "u")
    public List<SysRole> selectRoleList(SysRole role) {
        return sysRoleMapper.selectRoleList(role);
    }

最后在对应xml文件中添加sql:

  <select id="selectRoleList" parameterType="com.zytt.models.system.SysRole" resultMap="BaseResultMap">
    <include refid="selectRoleContactVo"/>
    where r.delflag = '1'
    <if test="roleName !=null and roleName !=''">AND r.role_name like concat('%',#{roleName},'%')</if>
    <if test="roleKey !=null and roleKey !=''">AND r.role_key like concat('%',#{roleKey},'%')</if>
    <if test="isvalid !=null and isvalid !=''">AND r.isvalid = #{isvalid}</if>
      <if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
          AND date_format(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(create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
      </if>
    <!-- 数据范围过滤 -->
    ${params.dataAuthc}
  </select>
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值