【Shiro】 网络支持

Metadata

title: 【Shiro】 网络支持
date: 2023-01-19 14:11
tags:
  - 行动阶段/完成
  - 主题场景/组件
  - 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
  - 细化主题/Module/Shiro/基础
categories:
  - Shiro
keywords:
  - Shiro
description: 【Shiro】 网络支持

【Shiro】 网络支持

最后但同样重要的是,我们将简要介绍 Shiro 的网络支持。Shiro 附带一个强大的 Web 支持模块,以帮助保护 Web 应用程序。为 Web 应用程序设置 Shiro 很简单。唯一需要做的就是在 web.xml 中定义一个 Shiro Servlet Filter。清单 14 显示了这段代码。

清单14: web.xml 中的 ShiroFilter

<filter> 
    <filter-name>ShiroFilter</filter-name> 
    <filter-class> 
        org.apache.shiro.web.servlet.IniShiroFilter 
    </filter-class> 
    <!-- 没有init-param意味着加载INI配置
        来自类路径:shiro.ini --> 
</filter>
<filter-mapping>
     <filter-name>ShiroFilter</filter-name>
     <url-pattern>/*</url-pattern>
</filter-mapping>

此过滤器可以读取上述 shiro.ini 配置,因此无论部署环境如何,您都可以获得一致的配置体验。配置完成后,Shiro Filter 将过滤每个请求并确保在请求期间可以访问特定于请求的 Subject。而且由于它过滤每个请求,您可以执行特定于安全的逻辑以确保只允许满足特定条件的请求通过。

特定于 URL 的过滤器链

Shiro 通过其创新的 URL 过滤器链功能支持特定于安全的过滤器规则。它允许您为任何匹配的 URL 模式指定临时过滤器链。这意味着您在使用 Shiro 的过滤机制执行安全规则(或规则组合)方面具有很大的灵活性——比您单独在 web.xml 中定义过滤器要灵活得多。清单 15 显示了 Shiro INI 中的配置片段。

清单15: 特定于路径的过滤器链

[urls] 
/assets/** = anon 
/user/signup = anon 
/user/** = user 
/rpc/rest/** = perms[rpc:invoke], authc 
/** = authc

如您所见,有一个 [urls] INI 部分可用于 Web 应用程序。对于每一行,等号左侧的值表示一个上下文相关的 Web 应用程序路径。右边的值定义了一个过滤器链——一个有序的、以逗号分隔的 Servlet 过滤器列表,为给定的路径执行。每个过滤器都是一个普通的 Servlet 过滤器,但是您在上面看到的过滤器名称(anon、user、perms、authc)是 Shiro 提供的开箱即用的特殊安全相关过滤器。您可以混合搭配这些安全过滤器来创建非常自定义的安全体验。您还可以指定您可能拥有的任何其他现有 Servlet 过滤器。

与使用 web.xml 相比,这要好多少?在 web.xml 中,您定义了一个过滤器块,然后是一个单独的断开连接的过滤器模式块?使用 Shiro 的方法,可以更容易地准确查看针对给定匹配路径执行的过滤器链。如果你愿意,你可以只在 web.xml 中定义 Shiro 过滤器,并在 shiro.ini 中定义所有其他过滤器和过滤器链,以获得比 web.xml 更简洁和易于理解的过滤器链定义机制。即使您没有使用 Shiro 的任何安全功能,仅这一小的便利就可以使 Shiro 值得使用。

网络会话管理

最后,指出 Shiro 对 web 环境中的会话的支持是很有趣的。

默认 Http 会话

对于 web 应用程序,Shiro 默认其会话基础结构使用我们都习惯的现有 Servlet 容器会话。也就是说,当您调用 subject.getSession() 和 subject.getSession(boolean) 方法时,Shiro 将返回由 Servlet 容器的 HttpSession 实例支持的 Session 实例。这种方法的美妙之处在于调用 subject.getSession() 的业务层代码与 Shiro Session 实例交互——它不知道它正在使用基于 Web 的 HttpSession 对象。在保持架构层之间的清晰分离时,这是一件非常好的事情。

Shiro 在 Web 层的本机会话

如果您因为需要 Shiro 的企业会话功能(如容器独立集群)而在 Web 应用程序中启用了 Shiro 的本机会话管理,您当然希望 HttpServletRequest.getSession() 和 HttpSession API 与“本机”会话一起工作,并且不是 servlet 容器会话。如果您不得不重构任何使用 HttpServletRequest 和 HttpSession API 的代码来代替使用 Shiro 的 Session API,那将是非常令人沮丧的。白当然不会指望你这么做。相反,Shiro 完全实现了 Servlet 规范的 Session 部分,以支持 Web 应用程序中的本机会话。这意味着无论何时调用相应的 HttpServletRequest 或 HttpSession 方法调用,Shiro 都会将这些调用委托给其内部原生 Session API。