背景:

  需要在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 注解 使用问题记录的更多相关文章

  1. Shiro权限管理框架(五):自定义Filter实现及其问题排查记录

    明确需求 在使用Shiro的时候,鉴权失败一般都是返回一个错误页或者登录页给前端,特别是后台系统,这种模式用的特别多.但是现在的项目越来越多的趋向于使用前后端分离的方式开发,这时候就需要响应Json数 ...

  2. Shiro权限管理框架(一):Shiro的基本使用

    首发地址:https://www.guitu18.com/post/2019/07/26/43.html 核心概念 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码 ...

  3. Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享

    首发地址:https://www.guitu18.com/post/2019/07/28/44.html 本篇是Shiro系列第二篇,使用Shiro基于Redis实现分布式环境下的Session共享. ...

  4. Shiro权限管理框架(三):Shiro中权限过滤器的初始化流程和实现原理

    本篇是Shiro系列第三篇,Shiro中的过滤器初始化流程和实现原理.Shiro基于URL的权限控制是通过Filter实现的,本篇从我们注入的ShiroFilterFactoryBean开始入手,翻看 ...

  5. Shiro权限管理框架(四):深入分析Shiro中的Session管理

    其实关于Shiro的一些学习笔记很早就该写了,因为懒癌和拖延症晚期一直没有落实,直到今天公司的一个项目碰到了在集群环境的单点登录频繁掉线的问题,为了解决这个问题,Shiro相关的文档和教程没少翻.最后 ...

  6. Shiro权限管理框架详解

    1 权限管理1.1 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被 ...

  7. shiro权限管理框架与springmvc整合

    shiro是apache下的一个项目,和spring security类似,用于用户权限的管理‘ 但从易用性和学习成本上考虑,shiro更具优势,同时shiro支持和很多接口集成 用户及权限管理是众多 ...

  8. Shiro权限管理框架

    一.Shiro介绍 Apache Shiro 是Java 的一个安全框架.Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE 环境,也可以用在JavaEE 环境.Shiro 可以 ...

  9. Shiro 权限管理框架

    一.什么是Shiro Apache Shiro是一个强大易用的java安全框架,提供认证.授权.加密和会话管理等功能 · 认证:用户身份识别,俗称“登录”: · 授权:访问控制 · 密码加密:保护或隐 ...

  10. (转)shiro权限框架详解02-权限理论介绍

    http://blog.csdn.net/facekbook/article/details/54893042 权限管理解决方案 本文主要介绍权限管理的解决方法: 粗颗粒度和细颗粒度 基于url拦截 ...

随机推荐

  1. 肖sir__面试笔试题__阿里笔试题

    第一题: #给定一个无序数组nums和一个目标值target,返回数组中两个元素的和为target的算法,时间复杂度为O(1);def func1(nums,target):    dict1 = { ...

  2. mac新仙剑奇侠传 2018

    新仙剑奇侠传 201803重制 下载,挂载后,拖动app到applications应用程序 文件夹即可. https://590m.com/f/28636472-500476381-5c8846 (访 ...

  3. mysql常规主从复制跟基于GTID的主从复制方法

    一,环境部署 192.168.113.129 193.168.113.130 二进制部署mysql5.7的方法见mysql5.7二进制部署,以及部分优化参数 二,mysql基于二进制日志点的复制 1, ...

  4. 解决appium-doctor报各种 cannot be found问题

    解决appium-doctor报各种 cannot be found问题 1.opencv4nodejs cannot be found.cmake --version 查看cmake是否安装已安装执 ...

  5. 如何保证RabbitMQ的消息不会丢失?怎么保证RabbitMQ的可靠性?

    生产者: 原因: 由于网络原因导致消息发送失败,消息队列没有接收到生产者发送的消息,但生产者认为消息发送成功. 解决办法: transaction模式:事务模式:开启事务,发送消息,成功提交事务,失败 ...

  6. mockjs 加上 json-server 快速生成前端数据

    const mock = require('mockjs'); // 引入mockjs const data = mock.mock({ "data|20": [{ "i ...

  7. 对象和类复习题(c++ prime plus )

    第一题: 为复习题5描述的类提供方法定义,并编写一个小程序来演示所有的特性: bank.h #ifndef BACK_H_ #define BACK_H_ #include <string> ...

  8. gitt如何将本地分支同远程分支进行关联

    将本地分支同远程分支进行关联,1.本地已经创建了分支test(test,是master以外自己创建的分支),而远程没有2种方法在远程创建分支test,并与本地分支进行关联: 方法1: git push ...

  9. PLC入门笔记6

    计数器指令及其应用 计数器指令介绍 很多场合需要进行计数操作.例如电机启动次数.生产线物料经过次数.位置传感器传送的脉冲次数等. 计数器分为普通和高速两种. 比PLC扫描频率远小于用普通,接近或大于用 ...

  10. Ubuntu系统update时提示源不安全被禁用的一种解决办法

    参考自这篇文章Ubuntu系统update时提示源不安全被禁用 - 知乎 (zhihu.com). 安装好Ubuntu18.04并更换清华源后,在运行 sudo apt update 更新源时报错如下 ...