文档章节

spring+shiro+自定义注解实现 数据层权限控制

Hccake
 Hccake
发布于 2017/04/06 11:41
字数 617
阅读 80
收藏 2

数据层权限控制  本来是想利用springMvc的拦截器来做到数据过滤  
在进入方法之前   根据shiro权限来修改request中传过来的对应参数

后来几经尝试都没有成功   因为requsest中的parameter是不可修改的   即使重新定义了一个新的request
又找不到和过滤器一样的放行方法     后来还是采用了的springAOP 的环绕通知
 

 

首先定义一个作用在方法上的注解 :

package cn.moppo.domino.web.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


/**
 * 数据权限过滤注解  实现数据层权限过滤
 * @author Hccake
 *
 */
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DataScreening {
	
	/**
	 * 过滤的pojo类名  
	 */
	Class<?> value();
	/**
	 * 过滤参数
	 * @return
	 */
	String[] fields() default {};
}

 在需要做权限控制的方法上加上该注解:

定义切面:

package cn.web.filter;

import java.lang.reflect.Method;

import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;

import cn.model.User;
import cn.utils.Utils;
import cn.web.annotation.DataScreening;
import cn.web.utils.UserUtils;


@Aspect
public class DataAspectj {

	//定义切点DataScreening注解
    @Pointcut("@annotation(cn.web.annotation.DataScreening)")
    public void cutDataScreening(){
        
    }


    //环绕通知
    @Around("cutDataScreening()")
    public Object dataScreen(ProceedingJoinPoint point) throws Throwable{
    	
    	//获取当前执行方法上的  DataScreening注解
        Signature signature = point.getSignature();    
        MethodSignature methodSignature = (MethodSignature)signature;    
        Method targetMethod = methodSignature.getMethod();    
        DataScreening dc = targetMethod.getAnnotation(DataScreening.class);
        
        //获取被权限控制的pojo类型
        Class<?> pojoClass = dc.value();
        String className = pojoClass.getSimpleName();
        
        //注解参数   需要过滤的数据字段的集合
        String[] fields = dc.fields();
        //获取登录用户
        User loginUser = UserUtils.getLoginUser();
        Subject loginSubject = SecurityUtils.getSubject();
       
        
        //方法传入的所有参数
        Object[] args = point.getArgs();
        
        //找到参数列表中对应需要权限控制的参数的角标)
        //没有用index直接作为角标循环是为了    保留扩展  可能会没有封装成对象   但是有xxxStr等 请求参数
        Integer index = null;
        for (int i = 0; i < args.length; i++) {
			if(pojoClass.isInstance(args[i])){
				index = i;
				break;
			}
		}
        //获取参数
        Object obj = args[index];
        
        
        //***********************字段数据过滤**********************************
        if(fields != null && fields.length != 0){
            for (String field : fields) {
				
            	//在此根据shiro 以及业务做数据过滤操作				
			}
        }
        

        
        
    	//重新定义参数
        args[index] = obj;
        //传入新的参数  并执行切入点的方法
    	Object retVal = point.proceed(args);
        //返回结果  若被注解方法都是void 可以不执行return
        return retVal;
    }
}

 

在配置文件中加入切面    

 关于配置文件的引入顺序是有讲究的   在ream认证的时候是否能使用spring自动注入的bean  具体情况具体配置   具体容器初始化配置请看   https://my.oschina.net/hccake/blog/873958

  <bean id="dataAspectj" class="cn.web.filter.DataAspectj" />
	   <aop:aspectj-autoproxy proxy-target-class="true">
	   	<aop:include name="dataAspectj" />
</aop:aspectj-autoproxy>

 

© 著作权归作者所有

共有 人打赏支持
Hccake
粉丝 0
博文 24
码字总数 6201
作品 0
东城
私信 提问
青橘子的服务端 - 拦截器+注解实现登陆验证

思路 拦截器拦截所有配置好的路径,取出注解对象判断是否需要进行登陆判断。 其实也可以用AOP来实现。 代码 测试Controller 注解类 配置类 拦截器 参考资料 SpringBoot使用自定义注解实现权限...

花有信
2017/11/27
0
0
SpringBoot集成SpringSecurity(入门级)

Springboot集成SpringSecurity 目录创建于2017-12-18 Springboot集成SpringSecurity Demo 快速上手-初步入门: 创建单用户单角色的安全控制 添加依赖...

mmythos
2017/12/30
0
0
图书管理系统【用户、购买、订单模块、添加权限】

用户模块 要登陆后才能购买,因此我们先写购买模块. 设计实体 编写DAO 测试DAO 抽取DAO 编写Service 前台样式 head.jsp head.css 效果: 实现登陆注册功能 当点击登陆按钮的时候,把数据带过...

阿斯顿方法
02/27
0
0
springMVC 基于注释 通过拦截器来控制后台的权限

版权声明:本文为博主原创文章,未经博主允许不得转载。 最近公司布置了一个任务,通过springMVC注解来控制一个请求的权限;由于之前没有接触过注释控制权限,这次尝试了;效果还不是特别好;...

江火似流萤
2016/09/09
99
0
Shiro之授权管理与授权的三种方式(1、编程方式,2、注解方式,3、jsp标签)-yellowcong

授权管理,三种方式,其中注解和jsp的方式在开发中用得比较的多,但是对于编程的方式完成注解,在实际开发中,用得不是特别多。这一节,讲解shiro如何完成授权的,授权操作,需要在Reaml中,...

yelllowcong
2017/12/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用Autowired和Qualifier解决多个相同类型的bean如何共存的问题

注意: 实现类UserServiceImpl,MyUserServiceImpl 需要区分:@Service("userServicel") @Service("myUserService") https://blog.csdn.net/russle/article/details/80287763......

qimh
30分钟前
1
0
SQL 语句使用to_char函数时,检索结果有空格

小疯在使用Oracle过程中,使用to_char函数检索表数据时发现检索结果前面会有一个空格,对后续开发有影响。问题很好解决,比较直接对可以做一下trim处理。但是小疯很疑惑为什么会有空格呢,于...

野小疯
31分钟前
1
0
对接比特币钱包的PHP开发包

BtcTool是一个基于第三方服务和离线裸交易实现的PHP比特币应用开发包,适合不希望部署本地 节点旳PHP开发者,开发包主要包含以下特性: 利用第三方服务获取指定地址的utxo集合 离线生成消费裸...

汇智网教程
49分钟前
1
0
【自用】 VHD to VHDX

VHDX: 在VHD 2TB 的基础上提供 64TB的容量。 支持逻辑扇区大小为 4KB,和每块的大小为 256MB,来优化虚拟磁盘性能。 比VHD提供更高的安全性、可靠性和性能。 convert-VHD –path d:\Hyper-v...

Tensor丨思悟
今天
3
0
30 岁转行做Python开发晚吗?而且是零基础

最近有小伙伴问小编,30 岁转行做Python开发晚吗? 小编想说,其实无论男女,只要想学,有这个动力,就直接去行动。无论年龄,无论性别,只要你想一直勇往直前,那么想做的就去做吧~这里有一...

糖宝lsh
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部