Apache Shiro Web 支持

Configuration

将 Shiro 集成到任何 Web 应用程序中的最简单方法是在 web.xml 中配置 Servlet ContextListener 和 Filter,以了解如何读取 Shiro 的 INI 配置。 INI 配置格式本身的大部分是在“配置”页面的INI Sections部分中定义的,但是我们将在此处介绍一些其他特定于 Web 的部分。

Using Spring?

Spring Framework 用户将不会执行此设置。如果您使用 Spring,则需要阅读有关Spring 特定的 Web 配置的信息。

web.xml

Shiro 1.2 及更高版本

在 Shiro 1.2 和更高版本中,标准 Web 应用程序通过将以下 XML 块添加到web.xml来初始化 Shiro:

<listener>
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>

...

<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>ShiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

假定 Shiro INI Configuration文件位于以下两个位置中的任意一个(以先发现者为准):

  • /WEB-INF/shiro.ini

  • shiro.ini文件位于 Classpath 的根目录。

这是上述配置的作用:

  • EnvironmentLoaderListener初始化 Shiro WebEnvironment实例(包含 Shiro 需要操作的所有内容,包括SecurityManager),并使其在ServletContext中可访问。如果您需要随时获取此WebEnvironment实例,则可以调用WebUtils.getRequiredWebEnvironment(servletContext)

  • ShiroFilter将使用此WebEnvironment对任何过滤的请求执行所有必要的安全操作。

  • 最终,filter-mapping定义确保所有请求都被ShiroFilter过滤,推荐给大多数 Web 应用程序使用,以确保可以保护任何请求。

ShiroFilter filter-mapping

通常希望在任何其他“ filter-mapping”声明之前定义“ ShiroFilter filter-mapping”,以确保 Shiro 也可以在这些过滤器中起作用。

ShiroFilter default encoding

shiro 筛选器是标准的 servlet 筛选器,根据servlet specification的默认编码为 ISO-8859-1.但是,Client 端可以选择使用Content-TypeHeaders 的charset属性以不同的编码发送身份验证数据。

自定义 WebEnvironment 类

默认情况下,EnvironmentLoaderListener将创建IniWebEnvironment实例,该实例假定 Shiro 基于 INI 的Configuration。如果愿意,可以通过在web.xml中指定ServletContext context-param来指定自定义WebEnvironment实例:

<context-param>
    <param-name>shiroEnvironmentClass</param-name>
    <param-value>com.foo.bar.shiro.MyWebEnvironment</param-value>
</context-param>

这使您可以自定义如何解析配置格式并将其表示为WebEnvironment实例。您可以将现有的IniWebEnvironment子类化为自定义行为,或者完全支持不同的配置格式。例如,如果有人想用 XML 而不是 INI 配置 Shiro,则可以创建基于 XML 的实现,例如com.foo.bar.shiro.XmlWebEnvironment

自定义配置位置

IniWebEnvironment类希望读取和加载 INI 配置文件。默认情况下,此类将自动在以下两个位置中查找 Shiro .ini配置(按 Sequences):

  • /WEB-INF/shiro.ini

  • classpath:shiro.ini

它将使用最先找到的那个。

但是,如果您希望将配置放置在其他位置,则可以在web.xml中用另一个context-param指定该位置:

<context-param>
    <param-name>shiroConfigLocations</param-name>
    <param-value>YOUR_RESOURCE_LOCATION_HERE</param-value>
</context-param>

默认情况下,param-value预期可以由ServletContext. getResource方法定义的规则解决。例如/WEB-INF/some/path/shiro.ini

但是,您也可以使用 Shiro 的ResourceUtils class支持的适当资源前缀来指定特定的文件系统,Classpath 或 URL 位置,例如:

  • file:/home/foobar/myapp/shiro.ini

  • classpath:com/foo/bar/shiro.ini

  • url:http://confighost.mycompany.com/myapp/shiro.ini

Shiro 1.1 及更早版本

在 1.1 或更早版本的 Web 应用程序中启用 Shiro 的最简单方法是定义 IniShiroFilter 并指定filter-mapping

<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
</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>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

此定义要求您的 INI 配置位于 Classpath 根目录的 shiro.ini 文件中(例如classpath:shiro.ini)。

Custom Path

如果您不想将 INI 配置放在/WEB-INF/shiro.iniclasspath:shiro.ini中,则可以根据需要指定一个自定义资源位置。添加configPath init-param并指定资源位置:

<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
    <init-param>
        <param-name>configPath</param-name>
        <param-value>/WEB-INF/anotherFile.ini</param-value>
    </init-param>
</filter>

...

不合格(无格式或“非前缀”)的configPath值假定为ServletContext资源路径,可通过由
ServletContext. getResource方法。

ServletContext resource paths - Shiro 1.2+

ServletContext 资源路径在 Shiro 1.2 和更高版本中可用。在 1.1 及更早版本中,所有configPath定义都必须指定classpath:file:url:前缀。

您也可以使用分别表示 Classpath,URL 或文件系统位置的classpath:url:file:前缀来指定其他非ServletContext资源位置。例如:

...
<init-param>
    <param-name>configPath</param-name>
    <param-value>url:http://configHost/myApp/shiro.ini</param-value>
</init-param>
...

Inline Config

最后,也可以将 INI 配置内嵌在 web.xml 中,而根本不使用 INI 文件。您可以使用config init-param而不是configPath来做到这一点:

<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
    <init-param><param-name>config</param-name><param-value>

    # INI Config Here

    </param-value></init-param>
</filter>
...

内联配置通常适用于小型或简单应用程序,但是出于以下原因,通常将内联配置外部化到专用的 shiro.ini 文件中更为方便:

  • 您可能会编辑很多安全配置,并且不想在 web.xml 文件中添加修订控件“ noise”

  • 您可能希望将安全性配置与其余的 web.xml 配置分开

  • 您的安全性配置可能会变大,并且您希望保持 web.xml 的精简和易于阅读

  • 您有一个复杂的构建系统,其中可能需要在多个地方引用相同的 Shiro 配置

这取决于您-使用对您的项目有意义的内容。

Web INI 配置

除了在主要的Configuration章节中已经描述的标准[main][users][roles]章节之外,您还可以在shiro.ini文件中指定特定于 Web 的[urls]章节:

# [main], [users] and [roles] above here
...
[urls]
...

[urls]部分允许您执行我们尚未见过的任何 Web 框架中不存在的事情:能够为应用程序中任何匹配的 URL 路径定义临时过滤器链!

这比在web.xml中通常定义过滤链的方式更加灵活,强大和简洁:即使您从未使用 Shiro 提供的任何其他功能,也仅使用过此功能,仅此一项就值得使用。

[urls]

urls部分中每行的格式如下:

_URL_Ant_Path_Expression_ = _Path_Specific_Filter_Chain_

For example:

...
[urls]

/index.html = anon
/user/create = anon
/user/** = authc
/admin/** = authc, roles[administrator]
/rest/** = authc, rest
/remoting/rpc/** = authc, perms["remote:invoke"]

接下来,我们将确切介绍这些行的含义。

等号(=)左侧的标记是相对于 Web 应用程序上下文根的Ant样式路径表达式。

例如,假设您有以下[urls]行:

/account/** = ssl, authc

此行指出“对我的应用程序的/account路径或其任何子路径(/account/foo/account/bar/baz等)的任何请求都将触发'ssl,authc'过滤器链”。我们将在下面介绍过滤器链。

请注意,所有路径表达式都相对于应用程序的上下文根。这意味着,如果您有一天将应用程序部署到www.somehost.com/myapp,然后再将其部署到www.anotherhost.com(没有“ myapp”子路径),则模式匹配仍然有效。所有路径都相对于HttpServletRequest.getContextPath()值。

Order Matters!

URL 路径表达式按照传入请求的定义 Sequences 和* FIRST MATCH WINS *进行评估。例如,假设有以下链定义:

/account/** = ssl, authc
/account/signup = anon

如果传入请求旨在到达/account/signup/index.html(所有“匿名”用户都可以访问),则将永远不会处理它!。原因是/account/**模式首先匹配传入的请求,然后“短路”所有剩余的定义。

切记要根据* FIRST MATCH WINS *策略定义过滤器链!

过滤器链定义

等号(=)右侧的标记是逗号分隔的过滤器列表,可针对与该路径匹配的请求执行这些过滤器。它必须与以下格式匹配:

filter1[optional_config1], filter2[optional_config2], ..., filterN[optional_configN]

where:

    • filterN *是在[main]部分中定义的过滤器 bean 的名称,
  • [optional_configN]是可选的带括号的字符串,它对于该特定路径*(每个过滤器,特定于路径的配置!)具有特定过滤器的含义。如果过滤器不需要该 URL 路径的特定配置,则可以丢弃括号,使filterN[]变为filterN

而且由于过滤器令牌定义了链(也称为列表),所以请记住 Sequences 很重要!按照希望请求在链中流动的 Sequences 定义以逗号分隔的列表。

最后,每个过滤器都可以自由处理响应,但是如果不满足其必要条件,则可以自由处理(例如执行重定向,使用 HTTP 错误代码响应,直接呈现等)。否则,期望允许请求 continue 通过链 continue 到最终目标视图。

Tip

能够对路径特定的配置(即过滤器令牌的[optional_configN]部分)做出反应,是 Shiro 过滤器可用的独特功能。

如果您想创建自己的javax.servlet.Filter实现(也可以执行此操作),请确保您的过滤器子类org.apache.shiro.web.filter.PathMatchingFilter

Available Filters

[main]部分中定义了可用于过滤器链定义的过滤器“池”。在主要部分中分配给它们的名称是在过滤器链定义中使用的名称。例如:

[main]
...
myFilter = com.company.web.some.FilterImplementation
myFilter.property1 = value1
...

[urls]
...
/some/path/** = myFilter

Default Filters

运行 Web 应用程序时,Shiro 会创建一些有用的默认Filter实例,并自动在[main]部分中使它们可用。您可以像其他任何 Bean 一样在main中配置它们,并在链定义中引用它们。例如:

[main]
...
# Notice how we didn't define the class for the FormAuthenticationFilter ('authc') - it is instantiated and available already:
authc.loginUrl = /login.jsp
...

[urls]
...
# make sure the end-user is authenticated.  If not, redirect to the 'authc.loginUrl' above,
# and after successful authentication, redirect them back to the original account page they
# were trying to view:
/account/** = authc
...

自动可用的默认过滤器实例由DefaultFilter enum定义,枚举的name字段是可用于配置的名称。他们是:

Filter NameClass
anonorg.apache.shiro.web.filter.authc.AnonymousFilter
authcorg.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasicorg.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
authcBearerorg.apache.shiro.web.filter.authc.BearerHttpAuthenticationFilter
logoutorg.apache.shiro.web.filter.authc.LogoutFilter
noSessionCreationorg.apache.shiro.web.filter.session.NoSessionCreationFilter
permsorg.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
portorg.apache.shiro.web.filter.authz.PortFilter
restorg.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
rolesorg.apache.shiro.web.filter.authz.RolesAuthorizationFilter
sslorg.apache.shiro.web.filter.authz.SslFilter
userorg.apache.shiro.web.filter.authc.UserFilter

启用和禁用过滤器

与任何过滤器链定义机制(web.xml,Shiro 的 INI 等)一样,您只需将过滤器包含在过滤器链定义中就可以启用过滤器,然后通过从链定义中删除它来禁用过滤器。

但是 Shiro 1.2 中新增的一项功能是启用或禁用过滤器而无需将其从过滤器链中删除的功能。如果启用(默认设置),则将按预期过滤请求。如果禁用,则过滤器将允许请求立即传递到FilterChain中的下一个元素。您通常可以基于配置属性来触发过滤器的启用状态,甚至可以基于“每个请求”来触发它。

这是一个功能强大的概念,因为根据某些要求启用或禁用过滤器通常比更改静态过滤器链定义(这将是永久性的且不灵活的)更方便。

Shiro 通过其OncePerRequestFilter抽象父类完成此任务。 Shiro 的所有开箱即用的过滤器实现都是该子类的子类,因此无需将其从过滤器链中删除就可以启用或禁用。如果您也需要此功能*,则可以将该类作为您自己的过滤器实现的子类。

  • SHIRO-224有望为所有过滤器启用此功能,而不仅仅是子类OncePerRequestFilter。如果这对您很重要,请对该问题进行投票。

General Enabling/Disabling

OncePerRequestFilter(及其所有子类)支持跨所有请求以及基于每个请求的启用/禁用。

通过将其过滤器的enabled属性设置为 true 或 false,可以对所有请求启用或禁用过滤器。默认设置为true,因为如果大多数过滤器配置在链中,则它们固有地需要执行。

例如,在 shiro.ini 中:

[main]
...
# configure Shiro's default 'ssl' filter to be disabled while testing:
ssl.enabled = false

[urls]
...
/some/path = ssl, authc
/another/path = ssl, roles[admin]
...

此示例表明,可能有许多 URL 路径都可能要求必须通过 SSL 连接保护请求。在开发过程中设置 SSL 可能会令人沮丧且耗时。在开发过程中,您可以禁用 ssl 过滤器。部署到生产环境时,可以使用一个配置属性来启用它-比手动更改所有 URL 路径或维护两个 Shiro 配置要容易得多。

Request-specific Enabling/Disabling

OncePerRequestFilter实际上根据其isEnabled(request, response)方法确定是启用还是禁用了过滤器。

此方法默认为返回enabled属性的值,该属性通常用于如上所述启用/禁用所有请求。如果要基于“特定于请求”的标准启用或禁用过滤器,则可以覆盖OncePerRequestFilter isEnabled(request,response)方法以执行更具体的检查。

Path-specific Enabling/Disabling

Shiro 的PathMatchingFilter(OncePerRequestFilter的子类能够根据要过滤的“特定路径”对配置做出反应。这意味着除了传入请求和响应,您还可以基于路径和特定于路径的配置启用或禁用过滤器响应。

如果您需要对匹配的路径和特定于路径的配置做出反应,以确定是启用还是禁用了过滤器,则可以覆盖PathMatchingFilter isEnabled(request,response,path,pathConfig)方法,而不是覆盖OncePerRequestFilter isEnabled(request,response)方法。

Session Management

Servlet 容器会话

在 Web 环境中,Shiro 的默认会话 Management 器SessionManager实现是ServletContainerSessionManager。这个非常简单的实现将所有会话 Management 职责(如果 Servlet 容器支持,则包括会话集群)委派给运行时 Servlet 容器。它本质上是 Shiro 的会话 API 到 servlet 容器的 bridge 梁,并且几乎没有其他作用。

使用此默认值的好处是,与现有 Servlet 容器会话配置(超时,任何特定于容器的集群机制等)一起使用的应用程序将按预期运行。

此默认设置的缺点是您与 Servlet 容器的特定会话行为联系在一起。例如,如果您想对会话进行集群,但是您使用 Jetty 进行测试并且在 Producing 使用了 Tomcat,则特定于容器的配置(或代码)将不可移植。

Servlet 容器会话超时

如果使用默认的 Servlet 容器支持,则可以按预期在 Web 应用程序的web.xml文件中配置会话超时。例如:

<session-config>
  <!-- web.xml expects the session timeout in minutes: -->
  <session-timeout>30</session-timeout>
</session-config>

Native Sessions

如果您希望会话配置设置和集群可跨 servlet 容器移植(例如在测试中使用 Jetty,但在 Producing 使用 Tomcat 或 JBoss),或者想要控制特定的会话/群集功能,则可以启用 Shiro 的本机会话 Management。

这里的“本机”一词意味着 Shiro 自己的企业会话 Management 实现将用于支持所有SubjectHttpServletRequest会话,并完全绕过 servlet 容器。但是请放心-Shiro 直接实现 Servlet 规范的相关部分,因此任何现有的与 Web/http 相关的代码都可以按预期工作,而无需“知道” Shiro 正在透明地 Management 会话。

DefaultWebSessionManager

要为您的 Web 应用程序启用本机会话 Management,您将需要配置本机支持 Web 的会话 Management 器,以覆盖基于 Servlet 容器的默认会话 Management 器。您可以通过在 Shiro 的SecurityManager上配置DefaultWebSessionManager的实例来实现。例如,在shiro.ini中:

shiro.ini 本机 Web 会话 Management

[main]
...
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
# configure properties (like session timeout) here if desired

# Use the configured native session manager:
securityManager.sessionManager = $sessionManager

声明后,您可以使用Session Management部分中所述的本机会话选项(例如会话超时和群集配置)配置DefaultWebSessionManager实例。

本机会话超时

配置DefaultWebSessionManager实例后,按照会话 Management:会话超时中的说明配置会话超时

DefaultWebSessionManager支持两个特定于 Web 的配置属性:

  • sessionIdCookieEnabled(布尔值)

  • sessionIdCookie,即Cookie实例。

Cookie as a template

sessionIdCookie属性本质上是一个模板-您配置Cookie实例属性,并且此模板将用于在运行时使用适当的会话 ID 值设置实际的 HTTP``Headers。

DefaultWebSessionManager 的sessionIdCookie默认实例是SimpleCookie。这个简单的实现允许您要在 http Cookie 上配置的所有相关属性都使用 JavaBeans 样式的属性配置。

例如,您可以设置 Cookie 域:

[main]
...
securityManager.sessionManager.sessionIdCookie.domain = foo.com

有关其他属性,请参见SimpleCookie JavaDoc

根据 Servlet 规范,cookie 的默认名称为JSESSIONID。此外,Shiro 的 cookie 支持HttpOnlySameSite标志。 sessionIdCookie默认情况下将HttpOnly设置为true,将SameSite设置为LAX,以提高安全性。

Note

Shiro 的Cookie概念即使在 Servlet 2.4 和 2.5 环境中也支持HttpOnly标志(而 Servlet API 仅在 2.6 或更高版本中本身支持它)。

如果您不希望使用会话 cookie,则可以通过将sessionIdCookieEnabled属性配置为 false 来禁用会话 cookie。例如:

禁用本机会话 Cookie

[main]
...
securityManager.sessionManager.sessionIdCookieEnabled = false

记住我的服务

如果AuthenticationToken实现org.apache.shiro.authc.RememberMeAuthenticationToken接口,则 Shiro 将执行“ rememberMe”服务。此接口指定一种方法:

boolean isRememberMe();

如果此方法返回true,那么 Shiro 将记住各个会话中最终用户的身份。

UsernamePasswordToken and RememberMe

常用的UsernamePasswordToken已经实现RememberMeAuthenticationToken界面,并支持 RememberMe 登录。

Programmatic Support

要以编程方式使用 RememberMe,可以在支持此配置的类上将值设置为true。例如,使用标准UsernamePasswordToken

UsernamePasswordToken token = new UsernamePasswordToken(username, password);

token.setRememberMe(true);

SecurityUtils.getSubject().login(token);
...

Form-based Login

对于 Web 应用程序,默认情况下authc过滤器是FormAuthenticationFilter。这支持读取“ rememberMe”布尔值作为表单/请求参数。默认情况下,它期望请求参数被命名为rememberMe。这是一个支持此功能的示例 shiro.ini 配置:

[main]
authc.loginUrl = /login.jsp

[urls]

# your login form page here:
login.jsp = authc

在您的网络表单中,有一个名为“ rememberMe”的复选框:

<form ...>

   Username: <input type="text" name="username"/> 
Password: <input type="password" name="password"/> ... <input type="checkbox" name="rememberMe" value="true"/>Remember Me? ... </form>

默认情况下,FormAuthenticationFilter将查找名为usernamepasswordrememberMe的请求参数。如果这些名称与您在表单中使用的表单字段名称不同,则需要在FormAuthenticationFilter上配置名称。例如,在shiro.ini中:

[main]
...
authc.loginUrl = /whatever.jsp
authc.usernameParam = somethingOtherThanUsername
authc.passwordParam = somethingOtherThanPassword
authc.rememberMeParam = somethingOtherThanRememberMe
...

您可以通过设置默认的\ {{}}各种 cookie 属性来配置rememberMe cookie 的功能。例如,在 shiro.ini 中:

[main]
...

securityManager.rememberMeManager.cookie.name = foo
securityManager.rememberMeManager.cookie.maxAge = blah
...

有关配置属性,请参见CookieRememberMeManager和支持的SimpleCookie JavaDoc。

Custom RememberMeManager

应该注意的是,如果默认的基于 cookie 的RememberMeManager实现无法满足您的需求,则可以将任何您喜欢的插件插入securityManager,就像配置其他对象引用一样:

[main]
...
rememberMeManager = com.my.impl.RememberMeManager
securityManager.rememberMeManager = $rememberMeManager

JSP/GSP 标记库

Apache Shiro 提供了Subject感知的 JSP/GSP 标记库,该库可让您根据当前 Subject 的状态来控制 JSP,JSTL 或 GSP 页面的输出。这对于基于查看网页的当前用户的身份和授权状态来个性化视图非常有用。

标签库配置

标签库 Descriptors(TLD)文件 Binding 在META-INF/shiro.tld文件的shiro-web.jar中。要使用任何标记,请将以下行添加到 JSP 页面的顶部(或定义页面指令的任何位置):

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

我们已经使用shiro前缀来表示 shiro 标记库名称空间,但是您可以分配任何喜欢的名称。

现在,我们将介绍每个标签,并说明如何将其用于呈现页面。

访客标签

仅当当前Subject被视为“访客”时,guest标签才会显示其包装内容。来宾是没有身份的任何Subject。就是说,我们不知道用户是谁,因为他们尚未登录并且以前的站点访问也不会记住他们(通过“记住我”服务)。

Example:

<shiro:guest>
    Hi there!  Please <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a> today!
</shiro:guest>

guest标签与user标签在逻辑上相反。

用户标签

仅当当前Subject被视为“用户”时,user标记才会显示其包装内容。在这种情况下,“用户”被定义为具有已知身份的Subject,无论是来自成功的身份验证还是来自“ RememberMe”服务。请注意,此标签在语义上与authenticated标签不同,后者比此标签更具限制性。

Example:

<shiro:user>
    Welcome back John!  Not John? Click <a href="login.jsp">here<a> to login.
</shiro:user>

user标签与guest标签在逻辑上相反。

认证标签

仅在当前用户在其当前会话期间*成功认证之后,才显示正文内容。它比'user'标签更具限制性。在逻辑上与“ notAuthenticated”标记相反。

仅当当前Subject在其当前会话过程中*成功认证时,authenticated标记才会显示其包装内容。与user相比,它是限制性更强的标签,用于确保敏感工作流程中的身份。

Example:

<shiro:authenticated>
    <a href="updateAccount.jsp">Update your contact information</a>.
</shiro:authenticated>

authenticated标签与notAuthenticated标签在逻辑上相反。

notAuthenticated 标签

如果当前的Subject在当前会话期间没有成功通过验证,则notAuthenticated标签将显示其包装内容。

Example:

<shiro:notAuthenticated>
    Please <a href="login.jsp">login</a> in order to update your credit card information.
</shiro:notAuthenticated>

notAuthenticated标签与authenticated标签在逻辑上相反。

主体标签

principal标签将输出主题的principal(标识属性)或该主体的属性。

没有任何标签属性,标签将呈现主体的toString()值。例如(假设主体是字符串用户名):

Hello, <shiro:principal/>, how are you today?

(主要)等效于以下内容:

Hello, <%= SecurityUtils.getSubject().getPrincipal().toString() %>, how are you today?

Typed principal

principal标记默认情况下假定要打印的主体是subject.getPrincipal()值。但是,如果您要打印的值不是主要主体,而是主题的{principal collection中的另一个值,则可以按类型获取该主体并打印该值。

例如,假设主体 ID 在主体集合中,则打印主体的用户 ID(而不是用户名):

User ID: <principal type="java.lang.Integer"/>

(主要)等效于以下内容:

User ID: <%= SecurityUtils.getSubject().getPrincipals().oneByType(Integer.class).toString() %>

Principal property

但是,如果委托人(上面的默认主委托人或上面的“类型化”委托人)是一个复杂的对象而不是一个简单的字符串,并且您想引用该委托人的属性,该怎么办?您可以使用property属性来指示要读取的属性的名称(必须可以通过与 JavaBeans 兼容的 getter 方法进行访问)。例如(假设主要主体是一个 User 对象):

Hello, <shiro:principal property="firstName"/>, how are you today?

(主要)等效于以下内容:

Hello, <%= SecurityUtils.getSubject().getPrincipal().getFirstName().toString() %>, how are you today?

或者,结合 type 属性:

Hello, <shiro:principal type="com.foo.User" property="firstName"/>, how are you today?

这基本上等同于以下内容:

Hello, <%= SecurityUtils.getSubject().getPrincipals().oneByType(com.foo.User.class).getFirstName().toString() %>, how are you today?

hasRole 标签

仅当当前Subject被分配了指定角色时,hasRole标记才会显示其包装内容。

For example:

<shiro:hasRole name="administrator">
    <a href="admin.jsp">Administer the system</a>
</shiro:hasRole>

hasRole标签与lacksRole标签在逻辑上相反。

missingsRole 标签

仅当当前Subject **未分配指定角色时,lacksRole标记才会显示其包装内容。

For example:

<shiro:lacksRole name="administrator">
    Sorry, you are not allowed to administer the system.
</shiro:lacksRole>

lacksRole标签与hasRole标签在逻辑上相反。

hasAnyRole 标签

如果从角色名称的逗号分隔列表中为当前Subject指定了任意个指定角色,则hasAnyRole标签将显示其包装内容。

For example:

<shiro:hasAnyRoles name="developer, project manager, administrator">
    You are either a developer, project manager, or administrator.
</shiro:hasAnyRoles>

hasAnyRole标签当前没有逻辑相反的标签。

hasPermission 标记

仅当当前的Subject“具有”(隐含)指定的权限时,hasPermission标记才会显示其包装内容。即,用户具有指定的能力。

For example:

<shiro:hasPermission name="user:create">
    <a href="createUser.jsp">Create a new User</a>
</shiro:hasPermission>

hasPermission标签与lacksPermission标签在逻辑上相反。

missingsPermission 标签

仅当当前Subject 没有 具有(暗示)指定的权限时,lacksPermission标记才会显示其包装内容。也就是说,用户 没有 具有指定的能力。

For example:

<shiro:lacksPermission name="user:delete">
    Sorry, you are not allowed to delete user accounts.
</shiro:lacksPermission>

lacksPermission标签与hasPermission标签在逻辑上相反。

协助处理文档

尽管我们希望该文档对您使用 Apache Shiro 所做的工作有所帮助,但社区一直在不断改进和扩展文档。如果您想为 Shiro 项目提供帮助,请考虑在需要的地方更正,扩展或添加文档。您提供的每一点帮助都会扩大社区,进而改善 Shiro。

提交文档的最简单方法是通过单击下面的Edit链接提交请求请求,然后将其发送到User Forum用户邮件列表