背景:

  需要在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. 杭电oj 蟠桃记

    Problem Description 喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!什么问题?他研究的问题是蟠桃一共有多少 ...

  2. golang json化时允许赋予默认值

    演示omitempty 代码: package main import ( "encoding/json" "fmt" ) func main() { type ...

  3. pytorch学习笔记(3)--dataset使用

    下载数据集 import torchvision from torch.utils.tensorboard import SummaryWriter dataset_transform = torch ...

  4. nchu第三次面向对象编程博客作业

    前言:   本次博客包含的内容有pta题目集6-8(电信计费)三次题目集.这次的难点主要是理解老师给的类图的内容,明白各部分的作用,以及如何使各类之间联系起来.只要能够理解老师给的类图结构之后就可以比 ...

  5. python机器学习——kmeans聚类算法

    背景与原理: 聚类问题与分类问题有一定的区别,分类问题是对每个训练数据,我给定了类别的标签,现在想要训练一个模型使得对于测试数据能输出正确的类别标签,更多见于监督学习:而聚类问题则是我们给出了一组数据 ...

  6. plsql链接oracle

    安装两个oracle文件夹在一个database中,安装plsql 要先配置两个都要修改,不然会找不到服务器 管理员运行  监听服务/监听位置和数据库服务都要修改 ass文件---监听程序配置 和本场 ...

  7. javaScript的介绍

    JavaScript Java Script的概述: 1组成 三部分组成 ecmaScript 基础语法(es5) dom document object 莫得了 文档对象模型 (操作html文档内容 ...

  8. AX2012 查询用户在线操作记录

    1 static void ExportSysClientAccessLog(Args _args) 2 { 3 SysClientAccessLog sysClientAccessLog; 4 5 ...

  9. chatGpt启示

    在应用软件领域实现自动化编程,我现在确实不怀疑了,只是还要等几年的问题.所以我的建议是:如果还想撸代码,可以往基础软件方向走,或者直接去大公司做 AI 工具:不想搞软件了,就去多了解业务吧.早做准备早 ...

  10. gpio 理解

    NVIC :NVIC_Init(&NVIC_Initsture); 1.NVIC只是设置某一种中断的优先级,而不是打开某种中断. 2.ppp_ITConfig():才是开/关具体某种中断使能位 ...