文档章节

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

Hccake
 Hccake
发布于 2017/04/06 11:41
字数 617
阅读 59
收藏 2
点赞 1
评论 0

数据层权限控制  本来是想利用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

SpringBoot集成SpringSecurity(入门级)

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

mmythos ⋅ 2017/12/30 ⋅ 0

springMVC 基于注释 通过拦截器来控制后台的权限

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

江火似流萤 ⋅ 2016/09/09 ⋅ 0

springboot + shiro 权限注解、请求乱码解决、统一异常处理

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

wyait ⋅ 06/06 ⋅ 0

NUTZ-ONEKEY 2.0 发布,新增微信接入示例

NUTZ-ONEKEY 2.0 发布了,NUTZ一键脚手架。 仓库 dgj nexus Team Nexus Repository http://maven.kerbores.com/nexus/content/groups/public...

Kerbores ⋅ 2016/09/07 ⋅ 12

Shiro之授权管理与授权的三种方式(1、编程方式,2、注解方式,3、jsp标签)-yellowcong

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

yelllowcong ⋅ 2017/12/20 ⋅ 0

NUTZ 框架下的企业级项目脚手架--NUTZ-ONEKEY

NUTZ-ONEKEY NUTZ一键脚手架 概述 github地址 https://github.com/Kerbores/NUTZ-ONEKEY 仓库 <repositories> 目标 提供开箱即用的企业级开发平台 提供企业开发中常见的组件和交互示例 提供高...

Kerbores ⋅ 2016/06/30 ⋅ 5

Shiro权限控制框架入门2:如何将Shiro非入侵地整合到SpringMVC等Web项目中

前言:我在上一篇文章(PS:https://www.zifangsky.cn/770.html)中介绍了shiro框架的一些基本概念以及自定义Realm可以实现的自定义授权和认证的目的。在这一篇文章中我将介绍如何将Shiro与S...

pangfc ⋅ 2017/01/06 ⋅ 0

@Repository、@Service、@Controller 和 @Component

@Repository、@Service、@Controller 和 @Component 将类标识为Beanspring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发。@Repository注解便属于最先引入的一批,它用于将数据...

上班不要玩手机 ⋅ 2016/11/14 ⋅ 0

Kerbores/NUTZ-ONEKEY

NUTZ-ONEKEY NUTZ一键脚手架 概述 github地址 https://github.com/Kerbores/NUTZ-ONEKEY git@osc地址 http://git.oschina.net/ixion/NUTZ-ONEKEY 演示地址 https://thunder.kerbores.com 仓库......

Kerbores ⋅ 2016/08/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MySQL主从复制原理、半同步操作步骤及原理

1.1 企业Linux运维场景数据同步方案 1.1.1 文件级别的异机同步方案 1、scp/sftp/nc 命令可以实现远程数据同步。 2、搭建ftp/http/svn/nfs 服务器,然后在客户端上也可以把数据同步到服务器。...

xiaomin0322 ⋅ 17分钟前 ⋅ 0

Oracle10g 数据及文件迁移过程[原]

QL*Plus: Release 10.2.0.1.0 - Production on 星期三 5月 11 10:22:35 2011 Copyright (c) 1982, 2005, Oracle. All rights reserved. 连接到: Oracle Database 10g Enterprise Edition Re......

harrypotter ⋅ 22分钟前 ⋅ 0

nginx安装

1:安装工具包 wget、vim和gcc yum install -y wget yum install -y vim-enhanced yum install -y make cmake gcc gcc-c++ 2:下载nginx安装包 wget http://nginx.org/download/nginx-1......

壹丶贰 ⋅ 25分钟前 ⋅ 0

ideaVim安装及配置

1.安装插件 File-Settings-Plugins,Browse Repositories,输入ideavim,安装。 重启后,在Tools-Vim Emulator启用。 2.快捷键设置 ideaViim键与idea快捷键有冲突,可以在Settings-Other Se...

Funcy1122 ⋅ 30分钟前 ⋅ 0

MySQL中B+Tree索引原理

B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B...

浮躁的码农 ⋅ 44分钟前 ⋅ 0

两道面试题,带你解析Java类加载机制

在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa{ static { System.out.println("爷爷在静态代码块"); }} cl...

1527 ⋅ 48分钟前 ⋅ 0

SpringCloud(Data Flow)

dataflow-server

赵-猛 ⋅ 59分钟前 ⋅ 0

深入理解Java虚拟机

这本书我读到第8章,之后就是在读不下去了。 读到后面是一种痛苦的体验,太多的东西是不全面的,大量的专有名词是没有解释的,读到最后很多东西仅仅是一个侧面,所以我觉得,这本书不适合初学...

颖伙虫 ⋅ 今天 ⋅ 0

NanoPi NEO core/ Ubuntu16.04单网卡配置3个IP地址(2个静态,1个动态)

配置 root@NanoPi-NEO-Core:/etc/network# cat interfacesauto loiface lo inet loopbackallow-hotplug eth0iface eth0 inet static address 172.31.188.249 netmask 255.......

SamXIAO ⋅ 今天 ⋅ 0

三步为你的App集成LivePhoto功能

摘要:LivePhoto是iOS9新推出的一种拍照方式,类似于拍摄Gif图或录制视频片段生成图片。如果没有画面感,可以联想《哈利波特》霍格沃茨城堡的壁画,哈哈,很炫酷有木有,但坑爹的是只有iphone6S以...

壹峰 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部