文档章节

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

Hccake
 Hccake
发布于 2017/04/06 11:41
字数 617
阅读 68
收藏 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
springMVC 基于注释 通过拦截器来控制后台的权限

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

江火似流萤
2016/09/09
99
0
图书管理系统【用户、购买、订单模块、添加权限】

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

阿斯顿方法
02/27
0
0
springboot + shiro 权限注解、请求乱码解决、统一异常处理

springboot + shiro 权限注解、请求乱码解决、统一异常处理 前篇 后台权限管理系统 相关: spring boot + mybatis + layui + shiro后台权限管理系统 springboot + shiro之登录人数限制、登录...

wyait
06/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ajax 提交返回map集合 获取不到值

后台java代码 @RequestMapping("/cameraList") @ResponseBody public Map<String, Object> cameraListForPage(@RequestParam(defaultValue = "1", value = "page") Integer page......

S三少S
33分钟前
44
3
TypeScrip最污的技术课-技术胖TypeScript图文视频教程

近日Node.js之父瑞安达尔(Ryan Dahl)发布新的开源项目 deno,从官方介绍来看,可以认为它是下一代 Node,使用 rust 语言代替 C++ 重新编写跨平台底层内核驱动,上层仍然使用 V8 引擎,最终...

JamesView
35分钟前
7
0
Es学习笔记

1.过滤排重聚合查询 筛选出某一个聚合值的个数统计。相当于mysql的distinct. 关键字:cardinality "aggs": { "2":{ "cardinality": { "field": "field" } ...

Gmupload
37分钟前
1
0
h5语义化标签

语义化HTML:用最恰当的HTML元素标签做恰当的事情。 优点: 提升可访问性; SEO; 结构清晰,利于维护; 通用容器:div——块级通用容器;span——短语内容无语义容器。 <title></title>:简...

莫西摩西
43分钟前
2
0
修改11g rac中 asm diskstring的发现路径

问题 : 如果我 们asm_disking以前是/dev/oracleasm/disks/* ,并且现在已经有磁盘组再用这个磁盘串了,那么,我们无法直接修改这个发现串为 ORCL:*,修改会报错,提示存在的磁盘无法使用新的...

tututu_jiang
46分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部