Shiro的认证与授权过程的401自定义信息返回格式

news2024/11/24 10:48:36

spring boot与shiro整合的很多这个不用多赘述,主要分享下过滤器这块

shiro中的部分过滤器

anon过滤器:用于处理匿名访问,即不需要身份验证的URL。
authc过滤器:用于进行身份验证,如果身份验证失败,将会返回一个HTTP 401 Unauthorized响应。
authcBasic过滤器:用于进行HTTP基本身份验证,如果身份验证失败,将会返回一个HTTP 401 Unauthorized响应。
authcBearer过滤器:用于进行OAuth2授权,如果授权失败,将会返回一个HTTP 401 Unauthorized响应。
perms过滤器:用于检查用户是否具有指定权限,如果用户没有指定权限,将会返回一个HTTP 403 Forbidden响应。
port过滤器:用于检查请求的端口是否与配置文件中指定的端口匹配,如果不匹配,将会返回一个HTTP 403 Forbidden响应。
rest过滤器:用于处理RESTful请求,例如GET、POST、PUT、DELETE等。
ssl过滤器:用于检查请求是否使用安全连接,如果不使用安全连接,将会返回一个HTTP 403 Forbidden响应。
user过滤器:用于检查用户是否已经登录,如果用户未登录,将会返回一个HTTP 401 Unauthorized响应

上述过滤器各自对应了一个具体的实现类,需要的找对应的过滤器

anon->AnonymousFilter
authc->FormAuthenticationFilter
authcBasic->BasicHttpAuthenticationFilter
roles->RolesAuthorizationFilter

正常流程会在ShiroConfig中配置下部分代码

	@Bean
    public CustomHttpAuthenticationFilter customHttpAuthenticationFilter(){
        return new CustomHttpAuthenticationFilter();
    }
    @Bean
    public CustomRolesAuthenticationFilter customRolesAuthenticationFilter(){
        return new CustomRolesAuthenticationFilter();
    }
    
	@Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager defaultWebSecurityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
        LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login","anon");
        filterChainDefinitionMap.put("/unauthc","anon");
        filterChainDefinitionMap.put("/test/test1","anon");
        filterChainDefinitionMap.put("/test/test2","authcBasic");
        filterChainDefinitionMap.put("/test/test3","authcBasic,roles[r002]");
//        filterChainDefinitionMap.put("/**","authcBasic");
        Map<String, Filter> filterMap = new HashMap<>();
        

// 此处,将自定义重写的过滤器添加到过滤器集合中,目前看来对这个过滤器匹配时通过过滤器名称比较的,所有authcBasic/role这些名称一定要写对,不然可能匹配不上
        filterMap.put("authcBasic",customHttpAuthenticationFilter());
        filterMap.put("roles", customRolesAuthenticationFilter());
        shiroFilterFactoryBean.setFilters(filterMap);

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }

filterChainDefinitionMap.put(“/test/test3”,“authcBasic,roles[r002]”);
此种请求会加经过customHttpAuthenticationFilter(继承自BasicHttpAuthenticationFilter)进行认证和customRolesAuthenticationFilter(继承自RolesAuthorizationFilter) 进行授权校验,默认返回信息格式:

{
    "timestamp": "2023-12-22T02:13:59.375+00:00",
    "status": 401,
    "error": "Unauthorized",
    "path": "/test/test3"
}

认证不通过会返回401,Unauthorized,需要在customHttpAuthenticationFilter中进行处理,

public class CustomHttpAuthenticationFilter extends BasicHttpAuthenticationFilter {
    //  sendChallenge重写的目的是避免前端在没有登录的情况下访问@RequiresPermissions()等未授权接口返回401错误,
    //  给前端调用接口一个数据,让前端去重新登陆
    //  如果使用浏览器访问,浏览器会弹出一个输入账号密码的弹框,重写后浏览器访问出现接口数据

    @Override
    protected boolean sendChallenge(ServletRequest request, ServletResponse response) {
        System.err.println("Authentication required: sending 401 Authentication challenge response.");
        // 工具类把第二个参数转为json字符串写到response中
        HttpUtils.returnJson((HttpServletResponse) response, Result.Custom(HttpStatus.SC_UNAUTHORIZED,"未授权"));
        return false;
    }
}

授权不通过会返回403,Forbidden,需要在customRolesAuthenticationFilter进行处理

public class CustomRolesAuthenticationFilter extends RolesAuthorizationFilter {
    @Override
    public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
        Subject subject = getSubject(request, response);
        String[] rolesArray = (String[]) mappedValue;

        if (rolesArray == null || rolesArray.length == 0) {
            //no roles specified, so nothing to check - allow access.
            return true;
        }

        Set<String> roles = CollectionUtils.asSet(rolesArray);
        boolean hasAllRoles = subject.hasAllRoles(roles);
        if (!hasAllRoles){
            HttpUtils.returnJson((HttpServletResponse) response, Result.ERROR("当前用户不具备该角色"));
        }
        return hasAllRoles;
    }
}

通过以上处理可将默认的401异常信息进行格式化成符合自定义格式反馈到前端

Shiro是基于过滤器实现的,有问题最好是多查查过滤器,以及过滤器的匹配规则,确定自己代码走到那一个过滤器才好进一步处理,
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1327874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ModuleNotFoundError: No module named ‘tensorflow‘

直接运行pip install tensorflow安装成功之后&#xff0c;发现版本是tensorflow2.15.0 python的版本是3.9版本 导入包&#xff1a;import tensorflow 打包xxx.exe,调用之后提示错误 ModuleNotFoundError: No module named tensorflow 最后发现特定的python的版本对应特定的t…

Qt 6.3 学习笔记

文章目录 Qt的安装和配置创建一个Qt项目信号和槽布局和控件绘图和动画数据库和网络 Qt是一个跨平台的C图形用户界面应用程序开发框架。它提供了创建GUI应用程序的工具和库。Qt 6.3是Qt的最新版本&#xff0c;引入了许多新特性和改进。在这个章节中&#xff0c;我们将详细介绍如…

DRF从入门到精通二(Request源码分析、DRF之序列化、反序列化、反序列化校验、序列化器常用字段及参数、source、定制字段、保存数据)

文章目录 一、Request对象源码分析区分原生request和新生request新的request还能像原来的reqeust一样使用吗源码片段分析总结&#xff1a; 二、DRF之序列化组件序列化介绍序列化步骤序列化组件的基本使用反序列化基本使用反序列化的新增反序列化的新增删除单条 反序列化的校验序…

109基于MATLAB 中的设施布局设计和位置分配

基于MATLAB 中的设施布局设计和位置分配&#xff0c;通过PSO算法进行最佳位置匹配。程序已调通&#xff0c;可直接运行。 109设施布局设计和位置分配通 (xiaohongshu.com)

2023光伏“洗牌”,鼎捷数智方案如何助力企业抓住时代契机?

2023年的光伏行业正进入重新“洗牌”的阶段&#xff01; 一方面&#xff0c;在“双碳政策”和全球能源危机的双重驱动下&#xff0c;我国光伏全产业链迎来高速增长&#xff0c;成为外贸出口“新三样”之一。光伏发电正加速取代传统化石能源&#xff0c;在电网中发挥着日益重要的…

vue3+Ts

安装 命令含义可参考typescript文章中的自动编译部分 npm create vitelatest vuets-project -- --template vue-tsvs code插件 Vue Language Features (Volar)对.vue文件进行实时的类型错误反馈TypeScript Vue Plugin (Volar) 用于支持在TS中import*.vue文件&#xff08;mai…

【2023年网络安全优秀创新成果大赛专刊】银行数据安全解决方案(天空卫士)

在2023年网络安全优秀创新成果大赛&#xff0c;成都分站中&#xff0c;天空卫士银行数据安全方案获得优秀解决方案奖。与此同时&#xff0c;天空卫士受信息安全杂志邀请&#xff0c;编写《银行数据安全解决方案》。12月6日&#xff0c;天空卫士编写的《银行数据安全解决方案》做…

Debezium发布历史20

原文地址&#xff1a; https://debezium.io/blog/2017/09/25/streaming-to-another-database/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 将数据流式传输到下游数据库 九月 25, 2017 作者&#xff1a; Jiri…

期货交易策略模拟测试-基于CLBISO01策略-2023.12.22

采取与昨天同样的策略进行盘中模拟测试&#xff0c;今天行情还可以&#xff0c;挺“顺溜”。

1. 结构型模式 - 适配器模式

亦称&#xff1a; 封装器模式、Wrapper、Adapter 意图 适配器模式是一种结构型设计模式&#xff0c; 它能使接口不兼容的对象能够相互合作 问题 假如你正在开发一款股票市场监测程序&#xff0c; 它会从不同来源下载 XML 格式的股票数据&#xff0c; 然后向用户呈现出美观的图…

电气 接近开关

npn&#xff1a;和负载&#xff08;控制器或者继电器&#xff09;共阳极&#xff0c;低电平响应 pnp&#xff1a;和负载共阴极&#xff0c;高电平响应

声音克隆定制丰富和的系统源码+完整的代码包+搭建教程

随着科技的进步&#xff0c;人工智能&#xff08;AI&#xff09;技术已经逐渐渗透到我们生活的各个领域。声音克隆技术&#xff0c;作为AI领域的一个重要分支&#xff0c;通过模仿人类的声音特征&#xff0c;生成与目标声音相似的语音。这项技术在语音合成、语音识别、虚拟现实…

vue2 之 实现pdf电子签章

一、前情提要 1. 需求 仿照e签宝&#xff0c;实现pdf电子签章 > 拿到pdf链接&#xff0c;移动章的位置&#xff0c;获取章的坐标 技术 : 使用fabric pdfjs-dist vuedraggable 2. 借鉴 一位大佬的代码仓亏 : 地址 一位大佬写的文章 &#xff1a;地址 3. 优化 在大佬的代码…

椰油酰胺,预计到2026年将达到5.25亿美元

椰油酰胺&#xff0c;也称为椰油酰胺 DEA 或椰油酰胺 MEA&#xff0c;是从椰子油中提取的脂肪酸酰胺的混合物。它通常用作洗发水、香皂和化妆品等个人护理产品中的乳化剂和发泡剂。近年来&#xff0c;受个人护理产品需求增加以及椰油酰胺在食品和制药等其他行业的广泛使用推动&…

安全、高效的MySQL DDL解决方案

MySQL作为目前应用最广泛的开源关系型数据库&#xff0c;是许多网站、应用和商业产品的主要数据存储。在生产环境&#xff0c;线上数据库常常面临着持续的、不断变化的表结构修改&#xff08;DDL&#xff09;&#xff0c;如增加、更改、删除字段和索引等等。其中一些DDL操作在M…

微服务 Spring Cloud 10,如何追踪微服务调用?服务治理的常见手段

目录 一、服务追踪的作用1、优化系统瓶颈2、优化链路调用3、故障排查4、性能优化5、生成网络拓扑图4、透明传输数据 二、节点管理1、服务调用失败一般有两类原因造成&#xff1a;2、服务调用失败的解决方式&#xff1a;3、服务调用失败的具体解决方式&#xff1a; 三、负载均衡…

电脑怎么重装系统?跟着步骤轻松搞定!

电脑系统随着时间的推移可能会变得迟缓或出现其他问题&#xff0c;而重装系统是解决这些问题的有效方法之一。本文将介绍三种电脑怎么重装系统的方法&#xff0c;帮助您在不同情况下选择适合自己的方案&#xff0c;让电脑焕然一新。 方法1&#xff1a;使用系统自带的恢复选项 …

[SWPUCTF 2021 新生赛]gift_F12

打开环境 题目有提示&#xff08;F12&#xff09;&#xff0c;那就查看一下源代码 直接滑到最后 看提示猜测&#xff0c;flag就在源代码里了 ctrlf查找flag 最后得到flag&#xff0c;改一下形式就可以了

ELFK日志收集

文章目录 第一章:ELK日志收集系统介绍日志收集重要性ELK介绍EFK介绍ELFK介绍ES部署Kibana部署第二章:Logstach日志收集Logstash介绍Logstash安装Logstash Input输入插件Logstash Filter过滤插件Logstash Output输出插件Input fileFilter mutatesplit示例add_field示例remove_…