Shiro共有5个注解:

  • RequiresAuthentication:

    使用该注解标注的类,实例,方法在访问或调用时,当前Subject必须在当前session中已经过认证。

  • RequiresGuest:

    使用该注解标注的类,实例,方法在访问或调用时,当前Subject可以是“gust”身份,不需要经过认证或者在原先的session中存在记录。

  • RequiresPermissions:

    当前Subject需要拥有某些特定的权限时,才能执行被该注解标注的方法。如果当前Subject不具有这样的权限,则方法不会被执行。

  • RequiresRoles:

    当前Subject必须拥有所有指定的角色时,才能访问被该注解标注的方法。如果当天Subject不同时拥有所有指定角色,则方法不会执行还会抛出AuthorizationException异常。

  • RequiresUser

    当前Subject必须是应用的用户,才能访问或调用被该注解标注的类,实例,方法。


使用方法:

Shiro的认证注解处理是有内定的处理顺序的,如果有个多个注解的话,前面的通过了会继续检查后面的,若不通过则直接返回,处理顺序依次为(与实际声明顺序无关):

RequiresRoles 
RequiresPermissions 
RequiresAuthentication 
RequiresUser 
RequiresGuest

例如:你同时声明了RequiresRoles和RequiresPermissions,那就要求拥有此角色的同时还得拥有相应的权限。

需要注意的是,shiro注解可以放到Controller层方法上,也可以放到Service层方法上。但在日常开发中,往往会在Service层添加“@Transactional”注解,为的是当Service发送数据库异常时,所有数据库操作可以回滚。当在Service层添加“@Transactional”注解后,执行Service方法前,会开启事务。此时的Service已经是一个代理对象了,此时如果我们将Shiro的权限注解加载Service层是不合适的,此时需要加到Controller层。这是因为不能让Service是“代理的代理”,如果强行注入,会发生类型转换异常。因此尽量加在Controller层比较好。

下面用@RequiresPermissions为例,将注解加在controller层,看在项目中是怎么用的,其他四种都是类似的。

当方法前可能需要多个权限时,可以自定义注解。如下,就表示RequiresPermissions可以有多个权限标识,默认的逻辑关系为与,即需要同时满足多个权限标识才能执行相关方法,逻辑关系也可修改为或。

package com.yealink.version.shiro;import org.apache.shiro.authz.annotation.Logical;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** Created by yl1794 on 2018/6/13.*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermissions {String[] value();Logical logical() default Logical.AND;
}

在controller的方法前加上注解,逻辑关系为或

    @RequiresPermissions(value={"version:delete","version:delete2"},logical = Logical.OR)@GetMapping("/delete/{id}")@ResponseBodypublic Result delete(@PathVariable String id){versionService.deleteVersion(id);return success();}

此时当用户同时具有version:delete,version:delete2权限标识时,才可执行delete方法,否则会提示如下报错。从打印的信息可以看出,当前用户aaa,具有的权限标识中并没有version:delete,因此会报错AuthorizationException。

用户: aaa 具有的角色: [admin]
用户: aaa 具有的权限: [add, query, version:list, version:release, update, delete, version:edit]
2018-06-14T18:31:23.180+0800 WEBERROR 8852 --- [nio-8890-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [version:delete]] with root causeorg.apache.shiro.authz.AuthorizationException: Not authorized to invoke method: public com.yealink.microservice.core.result.Result com.yealink.version.controller.VersionController.delete(java.lang.String)at org.apache.shiro.authz.aop.AuthorizingAnnotationMethodInterceptor.assertAuthorized(AuthorizingAnnotationMethodInterceptor.java:90)at org.apache.shiro.authz.aop.AnnotationsAuthorizingMethodInterceptor.assertAuthorized(AnnotationsAuthorizingMethodInterceptor.java:100)

在这里我们可以看到没有权限时会抛出异常,项目中可能会有很多的方法都会加上权限注解,那么我们应该怎么样对异常进行捕获,并且最好能够对这个异常进行统一的处理。这部分内容请参看:https://blog.csdn.net/Mr_EvanChen/article/details/80696872

【Shiro】权限控制注解相关推荐

  1. Apache Shiro权限控制框架简介

    Apache Shiro权限控制框架简介 要想实现权限控制,可以自己写代码实现,蓄力都的权限控制可以通过过滤器Filter实现,细粒度的权限控制是基于代理对象结合自定义的注解和反射技术来实现,反射技术 ...

  2. Shiro权限控制+整合shiro

    Shiro权限控制 0.1传统的权限认证方式 特点:为每个人单独的分配权限模块,能够实现权限控制,但是当公司人员庞大之后,非常难管理 上述权限控制如何设计表? 关系:员工和菜单权限的关系:多对多 员工 ...

  3. Shiro权限控制(二)

    之前写过Shiro的文章,但是当回过头来整理的时候,发现缺了好多东西,今天重新整理一下. 我们都知道Shiro和secitity都是安全的框架,但是相对于Shiro来说,比较入门简单,所需要的功能基本 ...

  4. shiro权限控制登陆成功页面跳转问题

    在开发中使用了shiro进行权限控制,遇到一个页面跳转问题:当用户账号密码都正确的时候并没有跳转到登陆成功页面. 在shiroFilter过滤器中配置了登陆成功路径没有反应.注意:我使用的是表单验证. ...

  5. JFinal配合Shiro权限控制在FreeMarker模板引擎中控制到按钮粒度的使用

    实现在FreeMarker模板中控制对应按钮的显示隐藏主要用到了Shiro中的hasRole, hasAnyRoles, hasPermission以及Authenticated等方法,我们可以实现T ...

  6. Shiro权限控制笔记要点

    一.Shiro 1.1 权限管理过滤器解释: Authentication :身份认证/登录,验证用户是不是拥有相应的身份: Authorization :授权,即权限验证,验证某个已认证的用户是否拥 ...

  7. 【Spring-boot】shiro权限控制

    缓存使用redis,自定义ShiroRedisCache.ShiroRedisCacheManager用于存储用户缓存信息 自定义MyShiroToken继承自AuthenticationToken. ...

  8. 【权限管理框架】一文看懂Shiro权限管理框架!

    文章目录 1.JavaWeb中的权限控制 2.权限框架核心知识ACL和RBAC 2.1.ACL和RBAC简介 2.2主流权限框架介绍 3.Shiro架构和基本概念 3.1.Shiro的4大核心模块 3 ...

  9. Apache Shiro的运行流程和权限控制方式分析

    Apache Shiro的运行流程和权限控制方式分析 Shiro的架构有3个主要的概念: Subject SecurityManager Realms 下面的关系图是关于这些组件是如何交互的高级概述. ...

最新文章

  1. bzoj-3288 3288: Mato矩阵(数论)
  2. 《C++ Primer中文版(第5版)》学习笔记与习题完整发布!
  3. 飞凌开发板 cramfs 镜像文件修改
  4. BZOJ 4997 [Usaco2017 Feb]Why Did the Cow Cross the Road III
  5. linux右键菜单的截图,Linux: 给右键菜单加一个“转换图片为jpg格式”
  6. cad2010多个文件并排显示_并排查看Excel工作表只需1个小动作,工作效率大涨百倍!...
  7. PRML第四章之分类的线性模型
  8. ob测试过程问题记录
  9. html5页面关闭的回调函数,js回调函数例子 js 回调函数问题的执行结果想作为返回值...
  10. 3D游戏开发套件指南(入门篇,转自Unity官方平台公众号)
  11. python 多行注释 字符串_python多行注释和跨行字符串
  12. 守望先锋为何如此火爆
  13. Java 蓝桥杯 基础练习 01字串(循环)
  14. 怎么旋转PDF文件中的页面
  15. 构建口音英语识别数据,一招化解人机口音交流
  16. 服务器维护后灵魂兽,魔兽世界9.0新增10多个鬼服位面,都有机会拿迷时磷光灵魂兽...
  17. 2022数维杯数学建模A题
  18. 基于ATTCK框架解析勒索病毒攻击
  19. vue-cli 创建项目不成功 原因为项目文件夹无node_modules文件 进行npm install不成功解决办法
  20. iframe高度自适应问题

热门文章

  1. MATLAB:图像裁切(imcrop函数)
  2. 其他笔记 - 编译Gazebo依赖以及源码过程 - Ubuntu 18.04,gazebo11
  3. ping命令加时间显示
  4. ai怎样导出所选部分_Illustrator(AI)选定对象批量导出jpg/pdf脚本插件(win/mac)...
  5. 知乎,微博是现代人负能量之源
  6. 1146. 新的开始 题解
  7. 全球与中国道路检测系统市场深度研究分析报告
  8. windows系统遇到的问题?
  9. 宏基4743G 把光驱换硬盘的一些问题
  10. 路易小体病理发生及相关的神经环路