由于遇到项目中要做数据权限处理,参考网上大神所做
一、自定义注解
@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') >= date_format(#{params.beginTime},'%y%m%d')
</if>
<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
AND date_format(create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d')
</if>
<!-- 数据范围过滤 -->
${params.dataAuthc}
</select>