文档章节

结合shiro使用aop自定义权限验证

javahao
 javahao
发布于 2017/02/24 14:49
字数 877
阅读 55
收藏 1
点赞 1
评论 0

#场景 为了敏捷开发,作者在平台中把dao、service、甚至controller三层基本的增删改查都抽象到顶层,这样在一个新模块中只要有了这三层就拥有了增删改查的功能,结合代码生成器大大提升了开发效率,但是在这种情况下,shiro自带的权限验证_@RequiresPermissions_注解就显得有点力不从心了。

#方案 1、采用自定义注解将资源权限分成两块,一块是功能模块注解(@PermissionModule),一块是资源操作注解(@PermissionOperate),这样在抽象出去的controller层面就可以只在@PermissionOperate()定义可访问的资源权限名称,在实际的功能模块类中定义模块名称,两块拼在一起即一个完整的资源权限

代码如下:

/**
 * use for:资源模块
 * Created by javahao on 2017/2/20.
 * auth:JavaHao
 */
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionModule {
    String value() default "";
}
/**
 * use for:资源
 * Created by javahao on 2017/2/20.
 * auth:JavaHao
 */
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionOperate {
    /**
     * 资源
     * @return
     */
    String[] value() default "";

    /**
     * 关系
     * @return
     */
    Relation relation() default Relation.AND;
}

/**
 * use for:关系
 * Created by javahao on 2017/2/24.
 * auth:JavaHao
 */
public enum Relation {
    OR,AND;
}

2、使用AOP在添加了指定注解的方法加切入点,这样在访问指定资源之前,先进行权限校验,如果验证通过则继续访问,如果验证失败则跳转越权页面。

代码如下:

@Aspect
@Component
public class PermissionAop {
    @Before(value="@annotation(operate)")
    public void permission(JoinPoint jp,PermissionOperate operate) throws Throwable{
        Class aspectClz = jp.getTarget().getClass();
        if(aspectClz.isAnnotationPresent(PermissionModule.class)){
            PermissionModule module = (PermissionModule) aspectClz.getAnnotation(PermissionModule.class);
            String[] operates = operate.value();
            String[] checks = new String[operates.length];
            for(int i = 0 ; i < operates.length ; i++){
                checks[i] = module.value()+":"+operates[i];
            }
            if(!UserUtil.isPermitted(operate.relation(),checks))
                throw new UnauthorizedException("用户:["+UserUtil.getName()+"]正在越权访问资源:"+ ArraysUtil.joinStringArray(Arrays.asList(operates),","));
        }
    }
}
/**
 * use for:检测到请求未授权回调
 * Created by javahao on 2017/2/24.
 * auth:JavaHao
 */
@ControllerAdvice
public class UnAuthorizationHandler {
    @ExceptionHandler({UnauthorizedException.class})
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    public ModelAndView processUnauthenticatedException(NativeWebRequest request, UnauthorizedException e) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("exception", e);
        mv.setViewName("unauthorized");
        return mv;
    }
}

注:

此处作者遇到的难点在aop的@Before地方,初始写法是

@Before(value="@annotation()")
    public void permission(JoinPoint jp) throws Throwable{
        
    }

大家可能注意到了变化@annotation()和方法无参数,这种情况下,如果想要获取到完整的权限标示是比较困难的,作者尝试过N种方法都没能成功这篇博客虽然说得很详细,但是按照博主的方法测试之后,始终还是获取到的代理方法,无法获取到切面的注解。 最终作者在这篇博客中受到启发

@Before(value="@annotation(operate)")
    public void permission(JoinPoint jp,PermissionOperate operate) throws Throwable{
        ......
    }

还有一点资源权限验证是作者扣的shiro的标签源码,大家需要“自扣”即可

<shiro:hasPermission name=""/>

附赠一段使用aop的列选择代码

@AfterReturning(pointcut="within(com..*) && @annotation(columnSelect)",returning="modelAndView")
	public void getCurrentDictColumn(Object modelAndView,ColumnSelect columnSelect) throws Exception{
		//加入列选择
		DictColumns dictColumns = new DictColumns();			
		Module module = new Module();
		module.setId(columnSelect.moduleId());
		String accountId=CurrentProperties.getCurrentAccountCache().getAccount().getId();
		dictColumns.setAccountId(accountId);
		dictColumns.setModule(module);
		List<DictColumns> dictColumnsList=dictColumnsService.listDictColumnsByAccount(dictColumns);
//		HttpServletResponse response = CurrentProperties.getCurrentResponse();
//		response.setCharacterEncoding("UTF-8");
//		PrintWriter printWriter = response.getWriter();
		ModelMap modelMap = ((ModelAndView)modelAndView).getModelMap();
		modelMap.put("dictColumnsList",dictColumnsList);
		modelMap.put("module",module);
		
		/*JsonConfig jsonConfig = new JsonConfig();  
		
		//排除不需要进行转换的属性
		jsonConfig.setExcludes(new String[] { "beanClass","prefix","callback","propertyEditorClass","propertyType","propertyValue","propertyValues","readMethod","writeMethod","writeMethodForActualAccess","writeMethodParameter"});  
		
		//防止自包含形成死循环
		jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
		
		// 当输出时间格式时,采用和JS兼容的格式输出 
		//注:JsDateJsonBeanProcessor 是json-lib已经提供的类,我们也可以实现自己的JsonBeanProcessor
		jsonConfig.registerJsonBeanProcessor(Date.class,new JsDateJsonBeanProcessor());
		
		JSONObject json = JSONObject.fromObject(modelMap,jsonConfig);
		
		printWriter.print(json);
		printWriter.close();*/
	}

更详细的aop讲解 请看这里 共同学习,共同进步!

© 著作权归作者所有

共有 人打赏支持
javahao
粉丝 2
博文 10
码字总数 11029
作品 0
济南
高级程序员
springboot + shiro 权限注解、请求乱码解决、统一异常处理

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

wyait
06/06
0
0
shiro基础配置

spring-shiro.xml文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:......

卯金刀GG
2016/09/09
25
0
Apache Shiro入门总结

一:数据库表结构 users:用户表,包含用户名、密码、角色ID。 roles:角色表,包含角色名。 permission:权限表,包含权限字符串(user:add),权限描述。 role_permission:中间表,包含角色和权限...

铂金小虫
2013/09/01
0
1
Shiro和Spring Security对比

Shiro简介 Apache Shiro是Java的一个安全框架。目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大,但是在实际工作时可能并不...

有余力则学文
04/27
0
0
Jeesite中shiro的用法讲解

前言 Apache Shiro 是一个框架,可用于身份验证和授权。虽然这两个术语代表的是不同的含义,但出于它们在应用程序安全性方面各自的角色考虑,它们有时会被交换使用。 身份验证 指的是验证用户...

Y幕徐
2017/07/14
0
0
JFianl整合Shiro

原文: 入门必看 英文好的可以直接看官网教程,英文不好的可以看下开涛的博客《跟我学Shiro》系列 在看教程之前,最好了解想一些shiro的概念:Apache Shiro Terminology 自己入门时踩的坑 一...

听_风
2016/08/30
102
0
shiro 之 认证登录的demo

1 shiro登录的简单demo 1.1 web.xml添加shiroFilter <!-- shiro过虑器,DelegatingFilterProx会从spring容器中找shiroFilter --> <filter> <filter-name>shiroFilter</filter-name> <filter......

龙之天空
2015/11/17
0
2
自定义权限注解

1、Shiro权限原理:spring-shiro.xml需要配置 <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> </bean>这个bean,用来匹配他自己定义的权......

郭克蒙
2016/01/05
115
0
shiro使用之二

1.身份认证概念 在 shiro 中,用户需要提供 principals (身份)和 credentials(证明)给 shiro,从而应用能 验证用户身份; principals:身份,即主体的标识属性,可以是任何东西,如用户名...

乾坤刀
2017/07/27
0
0
shiro权限控制问题

在task控制器上加入shiro权证验证的注解没效果,用user和admin都可以使用方法,shiro权限认证注解没起作用。我在例子里加入了 AOP式方法级权限检查 的bean,还是不行。我自己又搭建了springm...

bluesky4cn
2012/09/28
2.4K
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python -re模块及正则表达式解析

传送门: https://blog.csdn.net/pipisorry/article/details/25909899 ps:上面文章中"命名分组"的语法格式不能执行。正确的如下: (?P<name>正则表达式) #name是一个合法的标识符 除了使用别名...

一口今心
11分钟前
0
0
mybatis中session.getMapper方法源码分析

0开始代码AuthorMapper mapper = session.getMapper(AuthorMapper.class); 1 DefaultSqlSession类 @Override public <T> T getMapper(Class<T> type) { //最后会去调用MapperRegistry.getMap......

writeademo
19分钟前
0
0
spring cloud zuul网关的作用

zuul一般有两大作用,1是类似于Nginx的网址重定向,但zuul的重定向的一般是整个spring cloud里在Eureka注册中心的模块. zuul: ignored-services: '*' sensitiveHeaders: routes: ...

算法之名
19分钟前
8
0
java按比例之原图生成缩略图

package com.wxp.test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import javax.imageio.ImageIO; import sun.......

恋码之子
29分钟前
1
0
SpringCloud 微服务 (十五) 服务容错 Hystrix

壹 工作中的微服务架构,某个服务通常会被多个服务调用或者多层调用完成需求,如果某个服务不可用,导致一个系统功能不可用或者服务直接没用了的情况,这种情况称为雪崩效应 有A服务调用B服务,B服...

___大侠
31分钟前
0
0
Spring框架中的设计模式(五)

Spring框架中的设计模式(五) 通过以前的4篇文章,我们看到Spring采用了大量的关于创建和结构方面的设计模式。本文将描述属于行为方面的两种设计模式:命令和访问者。 前传: Spring框架中的...

瑞查德-Jack
34分钟前
0
0
解决phpstorm运行很卡问题!

phpStorm一旦达到这个临界值,所有智能提示、自动补全都失效了 这TM就很尴尬了,顿时感觉自己就是个废人了,纯手写代码跟便秘一样 众所周知phpStorm基于JAVA,那么这个内存限制肯定跟JAVA的虚...

sjcehui2010
37分钟前
0
0
javascript前端AES加密解密

参考了一下网上的代码加上自已的一些想法,修改,key也可以是中文, 要引入一个aes.js的js文件。 html代码 <html> <head> <title>AES加解密</title> <meta http-equiv="Content-Type"......

oisan_
40分钟前
0
0
MacOS和Linux内核的区别

有些人可能认为MacOS和Linux内核有相似之处,因为它们可以处理类似的命令和类似的软件。甚至有人认为苹果的MacOS是基于linux的。事实上,这两个内核的历史和特性是非常不同的。今天,我们来看...

六库科技
45分钟前
0
0
Vue.js-自定义事件例子

自定义组件的 v-model 2.2.0+ 新增 一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value 特性用于不同的目的。m...

tianyawhl
48分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部