shiro 安全框架入门,看这一篇就够了( 七 )


  • Listing 15. Path-specific Filter Chains
[urls]/assets/** = anon/user/signup = anon/user/** = user/rpc/rest/** = perms[rpc:invoke], authc/** = authc如您所见,Web应用程序有一个[urls] INI部分 。对于每一行,等号左侧的值代表上下文相关的Web应用程序路径 。右侧的值定义了一个Filter链-要对给定路径执行的Servlet过滤器的列表,以逗号分隔 。
每个过滤器都是一个普通的Servlet过滤器,但是您在上面看到的过滤器名称(匿名,用户,权限,身份验证)是Shiro提供的与安全相关的特殊过滤器 。
您可以混合使用这些安全过滤器,以创建非常自定义的安全体验 。您还可以指定可能具有的任何其他现有Servlet过滤器 。
与使用web.xml(定义一个过滤器块,然后定义一个分离的过滤器模式块)相比,这要好多少?
使用Shiro的方法,可以更轻松地准确查看针对给定匹配路径执行的过滤器链 。
如果需要,可以在web.xml中仅定义Shiro过滤器,并在shiro.ini中定义所有其他过滤器和过滤器链,以使过滤器链定义机制比web.xml更加简洁明了 。
即使您没有使用Shiro的任何安全功能,仅此一项小小的便利都可以使Shiro值得使用 。
JSP标签库Shiro还提供了一个JSP标记库,通过该库,您可以根据当前Subject的状态来控制JSP页面的输出 。
一个有用的常见示例是在用户登录后显示 Hello <username> 文本 。
但是,如果它们是匿名的,则可能需要显示其他内容,例如 Hello! Register Today! 代替 。
清单16显示了如何使用Shiro的JSP标签支持这一点 。
  • Listing 16. JSP Taglib
<%@ taglib prefix="shiro"    uri="http://shiro.apache.org/tags" %>...<p>Hello<shiro:user>    <!-- shiro:principal prints out the Subject’s main        principal - in this case, a username: -->    <shiro:principal/>!</shiro:user><shiro:guest>    <!-- not logged in - considered a guest. Show        the register link: -->    ! <a href=https://www.isolves.com/it/cxkf/kj/2020-12-28/”register.jsp”>Register today!

还有其他标签可让您根据其拥有(或没有)的角色,分配(或未分配)哪些权限以及是否对它们进行身份验证,从“记住我”服务中记住这些权限或 匿名访客 。
Shiro还支持许多其他特定于Web的功能,例如简单的“ Remember Me”服务,REST和BASIC身份验证,当然,如果要使用Shiro的本机企业会话,则当然还支持透明的HttpSession支持 。
web 会话管理最后,指出Shiro对网络环境中的会话的支持很有趣 。
默认Http会话对于Web应用程序,Shiro将其会话基础结构默认为使用我们都习惯的现有Servlet容器会话 。
也就是说,当您调用方法subject.getSession()和subject.getSession(boolean)时,Shiro将返回由Servlet容器的HttpSession实例支持的Session实例 。
这种方法的优点在于,调用subject.getSession()的业务层代码与Shiro Session实例进行交互-它不具备与基于Web的HttpSession对象一起工作的“知识” 。
在跨架构层保持清晰隔离时,这是一件非常好的事情 。
Web层中Shiro的本机会话如果您由于需要Shiro的企业会话功能(例如与容器无关的集群)而在Web应用程序中启用了Shiro的本机会话管理,那么您当然希望HttpServletRequest.getSession()和HttpSession API与“本机”会话一起使用,并且而不是Servlet容器会话 。
如果您必须重构任何使用HttpServletRequest和HttpSession API的代码来替代使用Shiro的Session API,那将非常令人沮丧 。
Shiro当然不会期望您这样做 。
相反,Shiro完全实现了Servlet规范的Session部分,以支持Web应用程序中的本机会话 。
这意味着无论何时调用相应的HttpServletRequest或HttpSession方法调用,Shiro都会将这些调用委派给其内部的本地Session API 。
最终结果是,即使您使用的是Shiro的“本地”企业会话管理,也不必更改Web代码-确实是非常方便(且必不可少)的功能 。
附加功能Apache Shiro框架中还有其他对保护Java应用程序有用的功能,例如:
1, 线程和并发支持,用于跨线程维护主题(Executor和ExecutorService支持)


推荐阅读