Shiro权限管理框架-@RequiresPermissions 注解 使用问题记录
背景:
需要在springboot项目里面用到shiro的权限管理,Shiro访问控制流程:先shiro认证(登录时调用) 然后 shiro授权,但是项目里面登录的功能用的公司统一的系统,所以需要“绕过”shiro认证,
解决方式是:在用户访问需要鉴权的接口之前,通过硬编码的方式进行shiro认证。
使用@RequiresPermissions("sys:user:shiro"):
在指定接口上面添加@RequiresPermissions("sys:user:shiro")进行权限控制会先进行shiro授权,若有进行shiro认证(登录),流程为: 依次调用@Aspect切面类(如果有定义) ==>shiro授权==>目标方法。
若无shiro认证(登录),则直接报错。目前(2020/12/03)还没有找到使用使用@RequiresPermissions注解并且可以“绕过”shiro认证的方法,所以暂时放弃使用此注解。
不使用@RequiresPermissions("sys:user:shiro"):
如果不使用@RequiresPermissions注解,麻烦点的方式就是直接硬编码,在每个需要权限管理的接口里面硬编码会造成代码冗余,所以选择了配置@Aspect切面类,在满足的 切入点Pointcut 表达式中的方法
执行前增加自定义验证逻辑,符合条件则继续执行,否则终止目标接口的执行,代码如下。
@Aspect
@Component
@Order(value = 3)
public class ShiroAuthenticationAspect {
private static final Logger logger = LoggerFactory.getLogger(ShiroAuthenticationAspect.class); @Pointcut("execution(public * cn.wj.fdata.console.controller.AuthorityManagementController.*(..) )")
public void controllerPointcut() {
} @Around("controllerPointcut()")
public Object around(ProceedingJoinPoint joinPoint) {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
Object ret = null;
String userName = getLoginUid(request);
logger.info("loginName="+userName);
try{
// 自定义验证逻辑,符合条件则继续执行,否则终止方法的执行
// 1、进行Shiro认证(登录)
Subject subject = ShiroUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(userName, "");
subject.login(token);
logger.info("登录成功"); boolean permitted = subject.isPermitted("sys:user:shiroAA");
if(permitted){ // 2、有对应权限则执行方法
ret = joinPoint.proceed();
logger.info("{}环绕proceed,结果是 :{}" , request.getRequestURL(), ret);
}else{
logger.info("{}环绕proceed,不满足条件未执行",request.getRequestURL());
Message<Object> message = new Message<Object>();
message.setCode(FdataConstants.EXECUTE_USER_NOPOWER_ERROR);
message.setMsg("无操作权限!");
ret = message;
}
}catch (Throwable e) {
logger.error("error", e);
}
return ret;
} private String getLoginUid(HttpServletRequest request) {
Object attribute = request.getAttribute("fsmart.login.uid");
return (String)attribute;
}
}
Shiro权限管理框架-@RequiresPermissions 注解 使用问题记录的更多相关文章
- Shiro权限管理框架(五):自定义Filter实现及其问题排查记录
明确需求 在使用Shiro的时候,鉴权失败一般都是返回一个错误页或者登录页给前端,特别是后台系统,这种模式用的特别多.但是现在的项目越来越多的趋向于使用前后端分离的方式开发,这时候就需要响应Json数 ...
- Shiro权限管理框架(一):Shiro的基本使用
首发地址:https://www.guitu18.com/post/2019/07/26/43.html 核心概念 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码 ...
- Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享
首发地址:https://www.guitu18.com/post/2019/07/28/44.html 本篇是Shiro系列第二篇,使用Shiro基于Redis实现分布式环境下的Session共享. ...
- Shiro权限管理框架(三):Shiro中权限过滤器的初始化流程和实现原理
本篇是Shiro系列第三篇,Shiro中的过滤器初始化流程和实现原理.Shiro基于URL的权限控制是通过Filter实现的,本篇从我们注入的ShiroFilterFactoryBean开始入手,翻看 ...
- Shiro权限管理框架(四):深入分析Shiro中的Session管理
其实关于Shiro的一些学习笔记很早就该写了,因为懒癌和拖延症晚期一直没有落实,直到今天公司的一个项目碰到了在集群环境的单点登录频繁掉线的问题,为了解决这个问题,Shiro相关的文档和教程没少翻.最后 ...
- Shiro权限管理框架详解
1 权限管理1.1 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被 ...
- shiro权限管理框架与springmvc整合
shiro是apache下的一个项目,和spring security类似,用于用户权限的管理‘ 但从易用性和学习成本上考虑,shiro更具优势,同时shiro支持和很多接口集成 用户及权限管理是众多 ...
- Shiro权限管理框架
一.Shiro介绍 Apache Shiro 是Java 的一个安全框架.Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE 环境,也可以用在JavaEE 环境.Shiro 可以 ...
- Shiro 权限管理框架
一.什么是Shiro Apache Shiro是一个强大易用的java安全框架,提供认证.授权.加密和会话管理等功能 · 认证:用户身份识别,俗称“登录”: · 授权:访问控制 · 密码加密:保护或隐 ...
- (转)shiro权限框架详解02-权限理论介绍
http://blog.csdn.net/facekbook/article/details/54893042 权限管理解决方案 本文主要介绍权限管理的解决方法: 粗颗粒度和细颗粒度 基于url拦截 ...
随机推荐
- ue4 启动顺序
GameMode PlayerController Actor Level https://www.cnblogs.com/fjz13/p/6133795.html
- 每日一抄 Go语言通信顺序进程简述
package main import ( "fmt" "sync" ) /* Go实现了两种并发形式,第一种是大家普遍认知的多线程共享内存,其实就是 Java ...
- ubuntu 20.04 修改静态IP和dhcp自动分配IP
一.静态分配固定IP kuaibang@k8smaster:~$ sudo nano /etc/netplan/00-installer-config.yaml # This is the netwo ...
- Cimage类处理图像像素(数据)的3种方式(转)
这里只讨论对图像像素的处理,cimage类的具体用法查相关资料#include <atlimage.h> //VS2010以后不用加这个 --------CImage m_Image ...
- vscode提交修改的时候报错:无法推送 refs 到远端。您可以试着运行“拉取”功能,整合您的更改
vscode提交修改的时候报错:无法推送 refs 到远端.您可以试着运行"拉取"功能,整合您的更改, git操作命令行 git pull origin yourbranch - ...
- 放苹果 tzoj2679 //自然数拆分 tzoj5827;(dp)
放苹果 tzoj2679 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入 第一行是测试数据的数目t ...
- [2007年NOIP普及组] 奖学金
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序, ...
- SQL 用 in 大于 1000 问题解决
-- 今天生成环境数据突然多,系统异常 解决方案(必须用in 业务情况),也可以用其他函数解决 union all 或者 exists 等 1:截取list List<Integer> ...
- C语言||一作业04
作业头 这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/SE2020-3 这个作业要求在哪 https://edu.cnblogs.com/campus ...
- Vue 防抖节流获取this问题
1. 防抖 debounce(func, delay = 500) { let _this = this; let args = arguments; return (function () { if ...