文档章节

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

Hccake
 Hccake
发布于 2017/04/06 11:41
字数 617
阅读 99
收藏 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
粉丝 1
博文 24
码字总数 6201
作品 0
东城
私信 提问
青橘子的服务端 - 拦截器+注解实现登陆验证

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

花有信
2017/11/27
0
0
图书管理系统【用户、购买、订单模块、添加权限】

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

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

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

江火似流萤
2016/09/09
99
0
SpringBoot集成SpringSecurity(入门级)

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

mmythos
2017/12/30
0
0
Spring+Shiro案例分析

在 Web 项目中应用 Apache Shiro Apache Shiro 是功能强大并且容易集成的开源权限框架,它能够完成认证、授权、加密、会话管理等功能。认证和授权为权限控制的核心,简单来说,“认证”就是证...

程序界小强
01/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

容器服务

简介 容器服务提供高性能可伸缩的容器应用管理服务,支持用 Docker 和 Kubernetes 进行容器化应用的生命周期管理,提供多种应用发布方式和持续交付能力并支持微服务架构。 产品架构 容器服务...

狼王黄师傅
昨天
3
0
高性能应用缓存设计方案

为什么 不管是刻意或者偶尔看其他大神或者大师在讨论高性能架构时,自己都是认真的去看缓存是怎么用呢?认认真真的看完发现缓存这一块他们说的都是一个WebApp或者服务的缓存结构或者缓存实现...

呼呼南风
昨天
12
0
寻找一种易于理解的一致性算法(扩展版)

摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可...

Tiny熊
昨天
2
0
聊聊GarbageCollectionNotificationInfo

序 本文主要研究一下GarbageCollectionNotificationInfo CompositeData java.management/javax/management/openmbean/CompositeData.java public interface CompositeData { public Co......

go4it
昨天
3
0
阿里云ECS的1M带宽理解

本文就给大家科普下阿里云ECS的固定1M带宽的含义。 “下行带宽”和“上行带宽” 为了更好的理解,需要先给大家解释个词“下行带宽”和“上行带宽”: 下行带宽:粗略的解释就是下载数据的最大...

echojson
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部