当前位置: 首页 > news >正文

shiro app

写在前面

我们知道,shiro框架在Java Web应用中使用时,本质上是通过filter方式集成的。
也就是说,它是遵循过滤器链规则的:filter的执行顺序与在web.xml中定义的顺序一致,如下所示:

<filter>
    <filter-name>securityFilter</filter-name> <filter-class>com.lenovo.iot.devicemanager.filter.SecurityFilter</filter-class> </filter> <filter-mapping> <filter-name>securityFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- The filter-name matches name of a 'shiroFilter' bean inside applicationContext.xml --> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <!-- Make sure any request you want accessible to Shiro is filtered. /* catches all --> <!-- requests. Usually this filter mapping is defined first (before all others) to --> <!-- ensure that Shiro works in subsequent filters in the filter chain: --> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

显然,securityFilter定义在shiroFilter之前,那么securityFilter也是在shiroFilter之前被访问到。
根据这个原理,我们可以根据实际情况对shiro的filter进行扩展。
举个例子,shiro默认的org.apache.shiro.web.filter.authc.UserFilter会对请求进行过滤,在未登录时请求会被重定向到登录页面。
但是在API项目中,响应都是json格式,并不存在登录页面,此时就会返回404错误。

项目实践

在最新的项目中,前后端完全分离,通过API方式进行数据交换,并且在服务端集成了shiro进行权限控制,后端项目架构为:SpringMVC + Shiro。
为了在拦截那些未执行登录的请求时返回json格式的响应,对org.apache.shiro.web.filter.authc.UserFilter进行了扩展。
具体来说需要做2件事情:
1.扩展org.apache.shiro.web.filter.authc.UserFilter实现

public class ShiroUserFilter extends UserFilter { private static final Logger logger = LoggerFactory.getLogger(ShiroUserFilter.class); @Override protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { if(logger.isErrorEnabled()) { logger.error("account need login for: {}", ((HttpServletRequest)request).getServletPath()); } // 请求被拦截后直接返回json格式的响应数据 response.getWriter().write(JsonResp.getJsonRespError(JsonResp.SC_NOT_LOGINED, "account not logined").toString()); response.getWriter().flush(); response.getWriter().close(); return false; } }

2.在spring中定义并使用自定义扩展的filter

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="filters"> <util:map> <entry key="shiroUserFilter" value-ref="shiroUserFilter" /> </util:map> </property> <property name="filterChainDefinitions"> <value> # some example chain definitions: # /admin/** = authc, roles[admin] # /docs/** = authc, perms[document:read] /**/login.do = anon /** = shiroUserFilter # more URL-to-FilterChain definitions here </value> </property> </bean> <!-- 定义扩展的filter实例 --> <bean id="shiroUserFilter" class="com.lenovo.iot.devicemanager.filter.ShiroUserFilter" />

【参考】
https://shiro.apache.org/web.html#Web-FilterChainDefinitions

https://www.cnblogs.com/ljdblog/p/6237683.html

转载于:https://www.cnblogs.com/But-you/p/10688076.html

相关文章:

  • 控制台报错 index:0,size:0
  • 14Linux_BIND-Linux就该这么学
  • WordPress 5.2 Beta 3 发布,要求 PHP 5.6.20 以上版本
  • springboot 2 Hikari 多数据源配置问题(dataSourceClassName or jdbcUrl is required)
  • JAVA 多用户商城系统b2b2c-Spring Cloud Stream 介绍
  • 实现Kubernetes跨集群服务应用的高可用
  • scss rem 转换函数
  • 30K iOS程序员的简述:如何快速进阶成为高级开发人员
  • sysbench安装配置和参数说明
  • Q680 验证回文字符串 Ⅱ
  • python基础知识-12-模块的了解
  • 20175318 2018-2019-2 实验二《Java面向对象程序设计》实验报告
  • 数据可视化之下发图实践
  • PCB单双面板打样工程费跨入30元时代!
  • DLC 基本定律与规则2
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • k8s 面向应用开发者的基础命令
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Protobuf3语言指南
  • React中的“虫洞”——Context
  • scala基础语法(二)
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 从重复到重用
  • 聚簇索引和非聚簇索引
  • 正则表达式小结
  • 字符串匹配基础上
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 回归生活:清理微信公众号
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #android不同版本废弃api,新api。
  • #define、const、typedef的差别
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (规划)24届春招和25届暑假实习路线准备规划
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (南京观海微电子)——I3C协议介绍
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (十一)手动添加用户和文件的特殊权限
  • .axf 转化 .bin文件 的方法
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET 5种线程安全集合
  • .net Signalr 使用笔记
  • .net wcf memory gates checking failed
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .Net各种迷惑命名解释
  • @selector(..)警告提示
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [\u4e00-\u9fa5] //匹配中文字符
  • []error LNK2001: unresolved external symbol _m
  • [AIGC] MySQL存储引擎详解
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬