配置
将 Shiro 集成到任何 Web 应用程序中的最简单方法是在 web.xml 中配置一个 Servlet ContextListener 和 Filter,以了解如何读取 Shiro 的 INI 配置。大部分 INI 配置格式本身在配置页面的INI 部分部分中定义,但我们将在此处介绍一些额外的特定于 Web 的部分。
Spring Framework 用户不会执行此设置。如果您使用 Spring,您将需要阅读有关Spring 特定的 Web 配置的信息。
web.xml
Shiro 1.2 及更高版本
在 Shiro 1.2 及更高版本中,标准 Web 应用程序通过添加以下 XML 块来初始化 Shiro web.xml
:
<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>
<dispatcher>ASYNC</dispatcher>
</filter-mapping>
这假设 Shiro INI配置文件位于以下两个位置之一,使用先找到的位置:
-
/WEB-INF/shiro.ini
-
shiro.ini
类路径根目录下的文件。
以下是上述配置的作用:
-
EnvironmentLoaderListener
初始化一个 ShiroWebEnvironment
实例(其中包含 Shiro 需要操作的所有内容,包括)SecurityManager
并使其在ServletContext
. 如果您需要随时获取该WebEnvironment
实例,可以调用WebUtils.getRequiredWebEnvironment(servletContext)
. -
将
ShiroFilter
使用它WebEnvironment
来为任何过滤的请求执行所有必要的安全操作。 -
最后,该
filter-mapping
定义确保所有请求都被过滤ShiroFilter
,推荐用于大多数 Web 应用程序,以确保任何请求都可以得到保护。
ShiroFilter 过滤器映射
通常需要 |
shiro 过滤器是一个标准的 servlet 过滤器,根据servlet 规范,默认编码为 ISO-8859-1 。charset
但是,客户端可以选择使用标头的属性发送具有不同编码的身份验证数据Content-Type
。
自定义WebEnvironment
类
默认情况下,EnvironmentLoaderListener
将创建一个IniWebEnvironment
实例,它假定 Shiro 的基于 INI 的配置。如果您愿意,您可以通过指定 a inWebEnvironment
来指定自定义实例:ServletContext
context-param
web.xml
<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
配置(按顺序):
-
/WEB-INF/shiro.ini
-
classpath:shiro.ini
它将使用首先找到的那个。
但是,如果您希望将配置放在另一个位置,您可以在另一个位置指定该context-param
位置web.xml
:
<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 类支持的适当资源前缀来指定特定的文件系统、类路径或 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 配置位于类路径根目录的 shiro.ini 文件中(例如classpath:shiro.ini
)。
自定义路径
如果您不想将 INI 配置放在/WEB-INF/shiro.ini
or中classpath: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 资源路径 - Shiro 1.2+
ServletContext 资源路径在 Shiro 1.2 及更高版本中可用。在 1.1 及更早版本中,所有定义都 |
您还可以通过使用、或分别指示类路径、url 或文件系统位置的前缀来指定其他非ServletContext
资源位置。例如:classpath:
url:
file:
...
<init-param>
<param-name>configPath</param-name>
<param-value>url:http://configHost/myApp/shiro.ini</param-value>
</init-param>
...
内联配置
最后,也可以将您的 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 文件中添加修订控制“噪音”
-
您可能希望将安全配置与 web.xml 配置的其余部分分开
-
您的安全配置可能会变得很大,并且您希望 web.xml 保持精简且易于阅读
-
您有一个复杂的构建系统,其中可能需要在多个地方引用相同的 shiro 配置
这取决于您 - 使用对您的项目有意义的东西。
网页 INI 配置
除了主要配置章节中已经描述的标准和部分[main]
之外[users]
,您还可以在文件中指定一个特定于 Web 的部分:[roles]
[urls]
shiro.ini
# [main], [users] and [roles] above here
...
[urls]
...
该[urls]
部分允许您执行我们尚未看到的任何 Web 框架中不存在的事情:为您的应用程序中的任何匹配 URL 路径定义临时过滤器链的能力!
这比您通常在 中定义过滤器链的方式更加灵活、强大和简洁:web.xml
即使您从未使用过 Shiro 提供的任何其他功能并且只使用了它,它本身就值得使用。
[urls]
节中每一行的格式urls
如下:
_URL_Ant_Path_Expression_ = _Path_Specific_Filter_Chain_
例如:
...
[urls]
/index.html = anon
/user/create = anon
/user/** = authc
/admin/** = authc, roles[administrator]
/rest/** = authc, rest
/remoting/rpc/** = authc, perms["remote:invoke"]
接下来,我们将准确介绍这些行的含义。
URL 路径表达式
等号 (=) 左侧的标记是相对于您的 Web 应用程序的上下文根的Ant样式路径表达式。
例如,假设您有以下[urls]
行:
/account/** = ssl, authc
此行声明“对我的应用程序路径/account
或其任何子路径(/account/foo
,/account/bar/baz
等)的任何请求都将触发 'ssl, authc' 过滤器链”。我们将在下面介绍过滤器链。
请注意,所有路径表达式都相对于您的应用程序的上下文根。这意味着,如果您有一天将应用程序部署到,www.somehost.com/myapp
然后再将其部署到www.anotherhost.com
(没有“myapp”子路径),模式匹配仍然有效。所有路径都相对于该HttpServletRequest.getContextPath()值。
顺序很重要!
URL 路径表达式按照定义的顺序和FIRST MATCH WINS对传入请求进行评估。例如,假设有以下链定义:
永远记住根据FIRST MATCH WINS策略定义过滤器链! |
过滤器链定义
等号 (=) 右侧的标记是以逗号分隔的过滤器列表,用于为匹配该路径的请求执行。它必须符合以下格式:
filter1[optional_config1], filter2[optional_config2], ..., filterN[optional_configN]
在哪里:
-
filterN是该
[main]
部分中定义的过滤器 bean 的名称,并且 -
[optional_configN]
是一个可选的括号字符串,对于该特定路径的特定过滤器具有意义(每个过滤器,特定于路径的配置!)。如果过滤器不需要该 URL 路径的特定配置,您可以丢弃括号,因此filterN[]
变成filterN
.
由于过滤器标记定义了链(又名列表),请记住顺序很重要!按照您希望请求通过链的顺序定义逗号分隔的列表。
最后,如果不满足必要条件(例如执行重定向、使用 HTTP 错误代码响应、直接呈现等),每个过滤器都可以随意处理响应。否则,预计允许请求继续通过链到达最终目标视图。
小费
能够对路径特定的配置做出反应,即 如果您想创建自己的 |
可用的过滤器
可用于过滤器链定义的过滤器“池”在本[main]
节中定义。在主要部分中分配给它们的名称是在过滤器链定义中使用的名称。例如:
[main]
...
myFilter = com.company.web.some.FilterImplementation
myFilter.property1 = value1
...
[urls]
...
/some/path/** = myFilter
默认过滤器
当运行一个网络应用程序时,Shiro 会创建一些有用的默认Filter
实例,并自动在该[main]
部分中提供它们。您可以像配置main
任何其他 bean 一样配置它们,并在链定义中引用它们。例如:
[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 枚举定义,枚举的name
字段是可用于配置的名称。他们是:
过滤器名称 | 类 |
---|---|
anon | |
authc | |
authcBasic | org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter |
authcBearer | org.apache.shiro.web.filter.authc.BearerHttpAuthenticationFilter |
invalidRequest | |
logout | |
noSessionCreation | |
perms | org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter |
port | |
rest | org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter |
roles | |
ssl | |
user |
启用和禁用过滤器
与任何过滤器链定义机制(web.xml
、Shiro 的 INI 等)的情况一样,只需将过滤器包含在过滤器链定义中即可启用过滤器,并通过将其从链定义中删除来禁用它。
但是 Shiro 1.2 中添加的一个新功能是能够启用或禁用过滤器,而无需从过滤器链中删除它们。如果启用(默认设置),则将按预期过滤请求。如果禁用,则过滤器将允许请求立即传递到FilterChain
. 您通常可以根据配置属性触发过滤器的启用状态,或者您甚至可以根据每个请求触发它。
这是一个强大的概念,因为根据某些要求启用或禁用过滤器通常比更改静态过滤器链定义更方便,因为静态过滤器链定义是永久性的和不灵活的。
Shiro 通过它的OncePerRequestFilter抽象父类实现了这一点。Shiro 的所有开箱即用的过滤器实现都是这个的子类,因此可以在不从过滤器链中删除它们的情况下启用或禁用它们。如果您也需要此功能,您可以为您自己的过滤器实现子类化此类*。
*https://issues.apache.org/jira/browse/SHIRO-224[SHIRO-224] 有望为任何过滤器启用此功能,而不仅仅是那些子类化OncePerRequestFilter
。如果这对您很重要,请为该问题投票。
一般启用/禁用
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 配置要容易得多。
特定于请求的启用/禁用
OncePerRequestFilter
实际上根据其isEnabled(request, response)
方法确定过滤器是启用还是禁用。
该方法默认返回enabled
属性的值,通常用于启用/禁用上述所有请求。如果您想根据请求特定条件启用或禁用过滤器,您可以覆盖该OncePerRequestFilter
isEnabled(request,response)
方法以执行更具体的检查。
特定于路径的启用/禁用
Shiro 的PathMatchingFilter(的子类OncePerRequestFilter
能够根据被过滤的特定路径对配置做出反应。这意味着除了传入的请求和响应之外,您还可以根据路径和特定于路径的配置启用或禁用过滤器。
如果您需要能够对匹配路径和特定于路径的配置做出反应,以确定过滤器是启用还是禁用,而不是覆盖OncePerRequestFilter
isEnabled(request,response)
方法,而是覆盖该PathMatchingFilter
isEnabled(request,response,path,pathConfig)
方法。
全局过滤器
从 Shiro 1.6 开始,添加了定义全局过滤器的功能。添加“全局过滤器”将为所有路由添加额外的过滤器,这包括以前配置的过滤器链以及未配置的路径。
默认情况下,全局过滤器包含invalidRequest
过滤器。此过滤器阻止已知的恶意攻击,请参阅下面的配置详细信息。
全局过滤器可以自定义或禁用,例如
[main]
...
# disable Global Filters
filterChainResolver.globalFilters = null
定义全局过滤器列表:
[main]
...
filterChainResolver.globalFilters = invalidRequest, port
过滤器阻止带有非 ascii 字符、分号和反斜杠的invalidRequest
请求,每个都可以单独禁用以实现向后兼容性。
[main]
...
invalidRequest.blockBackslash = true
invalidRequest.blockSemicolon = true
invalidRequest.blockNonAscii = true
...
如果您当前允许 URL 重写以允许在 URL 中使用 <code>jsessionid</code>,则必须设置 在 Java Servlet 规范的“7.1.3”部分中定义了URL 重写 |
HTTP 严格传输安全 (HSTS)
SslFilter (及其所有子类)支持启用/禁用 HTTP 严格传输安全 (HSTS) 。
例如,在 shiro.ini 中:
[main]
...
# configure Shiro's default 'ssl' filter to enabled HSTS:
ssl.enabled = true
ssl.hsts.enabled = true
ssl.hsts.includeSubDomains = true
[urls]
...
/some/path = ssl, authc
/another/path = ssl, roles[admin]
...
会话管理
Servlet 容器会话
在 Web 环境中,Shiro 的默认会话管理器SessionManager实现是ServletContainerSessionManager. 这个非常简单的实现将所有会话管理职责(如果 servlet 容器支持,包括会话集群)委托给运行时 Servlet 容器。它本质上是 Shiro 的会话 API 到 servlet 容器的桥梁,几乎没有其他作用。
使用此默认值的一个好处是,使用现有 servlet 容器会话配置(超时、任何容器特定的集群机制等)的应用程序将按预期工作。
此默认设置的一个缺点是您被绑定到 servlet 容器的特定会话行为。例如,如果您想要集群会话,但您使用 Jetty 进行测试并在生产中使用 Tomcat,那么您的容器特定配置(或代码)将无法移植。
Servlet 容器会话超时
如果使用默认的 servlet 容器支持,您可以在 Web 应用程序web.xml
文件中按预期配置会话超时。例如:
<session-config>
<!-- web.xml expects the session timeout in minutes: -->
<session-timeout>30</session-timeout>
</session-config>
本机会话
如果您希望会话配置设置和集群可以跨 servlet 容器移植(例如,测试中的 Jetty,但生产中的 Tomcat 或 JBoss),或者您想要控制特定的会话/集群功能,您可以启用 Shiro 的本地会话管理。
这里的“Native”一词意味着 Shiro 自己的企业会话管理实现将用于支持所有会话Subject
并HttpServletRequest
完全绕过 servlet 容器。但请放心 - Shiro 直接实现了 Servlet 规范的相关部分,因此任何现有的 web/http 相关代码都可以按预期工作,并且永远不需要“知道” Shiro 透明地管理会话。
DefaultWebSessionManager
要为您的 Web 应用程序启用本机会话管理,您需要配置一个支持 Web 的本机会话管理器,以覆盖默认的基于 servlet 容器的会话管理器。您可以通过DefaultWebSessionManager在 Shiro 的SecurityManager
. 例如,在shiro.ini
:
shiro.ini 本机网络会话管理
[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
声明后,您可以DefaultWebSessionManager
使用会话超时和集群配置等本机会话选项配置实例,如会话管理部分所述。
本机会话超时
配置DefaultWebSessionManager
实例后,按照会话管理:会话超时中的说明配置会话超时
会话 Cookie
支持两个特定于DefaultWebSessionManager
Web 的配置属性:
-
sessionIdCookieEnabled
(一个布尔值) -
sessionIdCookie
, 一个Cookie实例。
该sessionIdCookie
属性本质上是一个模板 - 您配置Cookie
实例属性,该模板将用于Cookie
在运行时使用适当的会话 ID 值设置实际的 HTTP 标头。
会话 Cookie 配置
DefaultWebSessionManager 的sessionIdCookie
默认实例是SimpleCookie. 这个简单的实现允许为您希望在 http Cookie 上配置的所有相关属性配置 JavaBeans 样式的属性。
例如,您可以设置 Cookie 域:
[main]
...
securityManager.sessionManager.sessionIdCookie.domain = foo.com
有关其他属性,请参阅SimpleCookie JavaDoc。
cookie 的默认名称JSESSIONID
符合 servlet 规范。此外,Shiro 的 cookie 支持HttpOnly和SameSite标志。sessionIdCookie
设置HttpOnly
totrue
和SameSite
toLAX
默认情况下以提高安全性。
Shiro 的 |
禁用会话 Cookie
如果您不希望使用会话 cookie,您可以通过将sessionIdCookieEnabled
属性配置为 false 来禁用它们。例如:
禁用本机会话 cookie
[main]
...
securityManager.sessionManager.sessionIdCookieEnabled = false
记住我服务
AuthenticationToken
如果实现了org.apache.shiro.authc.RememberMeAuthenticationToken接口,Shiro 将执行“rememberMe”服务。这个接口指定了一个方法:
boolean isRememberMe();
如果此方法返回true
,Shiro 将跨会话记住最终用户的身份。
用户名密码令牌和记住我
常用的 |
程序化支持
要以编程方式使用 rememberMe,您可以将值设置为true
支持此配置的类。例如,使用标准UsernamePasswordToken
:
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
token.setRememberMe(true);
SecurityUtils.getSubject().login(token);
...
基于表单的登录
对于 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"/> <br/>
Password: <input type="password" name="password"/>
...
<input type="checkbox" name="rememberMe" value="true"/>Remember Me?
...
</form>
默认情况下,FormAuthenticationFilter
将查找名为 和 的username
请求password
参数rememberMe
。如果这些与您在表单中使用的表单字段名称不同,您需要在FormAuthenticationFilter
. 例如,在shiro.ini
:
[main]
...
authc.loginUrl = /whatever.jsp
authc.usernameParam = somethingOtherThanUsername
authc.passwordParam = somethingOtherThanPassword
authc.rememberMeParam = somethingOtherThanRememberMe
...
Cookie 配置
您可以rememberMe
通过设置默认的 {{RememberMeManager}} 的各种 cookie 属性来配置 cookie 的功能。例如,在 shiro.ini 中:
[main]
...
securityManager.rememberMeManager.cookie.name = foo
securityManager.rememberMeManager.cookie.maxAge = blah
...
有关配置属性,请参阅CookieRememberMeManager和支持的SimpleCookieJavaDoc。
风俗RememberMeManager
应该注意的是,如果默认的基于 cookie 的RememberMeManager
实现不能满足您的需要,您可以将任何您喜欢的插入到securityManager
您将配置任何其他对象引用的类似内容中:
[main]
...
rememberMeManager = com.my.impl.RememberMeManager
securityManager.rememberMeManager = $rememberMeManager
JSP/GSP 标签库
Apache Shiro 提供了一个Subject
-aware JSP/GSP 标签库,允许您根据当前主题的状态控制您的 JSP、JSTL 或 GSP 页面输出。这对于根据当前查看网页的用户的身份和授权状态来个性化视图非常有用。
标签库配置
标记库描述符 (TLD) 文件捆绑在shiro-web.jar
文件中META-INF/shiro.tld
。要使用任何标签,将以下行添加到 JSP 页面的顶部(或定义页面指令的任何位置):
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
我们使用shiro
前缀来表示 shiro 标记库命名空间,但您可以指定任何您喜欢的名称。
现在我们将介绍每个标签并展示如何使用它来呈现页面。
guest
标签_
guest
仅当当前Subject
被认为是“访客”时,标签才会显示其包装的内容。客人是Subject
没有身份的任何人。也就是说,我们不知道用户是谁,因为他们没有登录,并且没有从以前的站点访问中记住他们(来自“记住我”服务)。
例子:
<shiro:guest>
Hi there! Please <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a> today!
</shiro:guest>
guest
标签是标签的逻辑反义词user。
user
标签_
user
仅当当前Subject
被认为是“用户”时,标签才会显示其包装的内容。在此上下文中,“用户”被定义为Subject
具有已知身份的用户,无论是来自成功的身份验证还是来自“RememberMe”服务。请注意,此标记在语义上与经过身份验证的标记不同,后者比此标记更具限制性。
例子:
<shiro:user>
Welcome back John! Not John? Click <a href="login.jsp">here<a> to login.
</shiro:user>
user
标签是标签的逻辑反义词guest。
authenticated
标签_
仅当当前用户在其当前会话期间成功通过身份验证时才显示正文内容。它比“用户”标签更具限制性。它在逻辑上与“notAuthenticated”标签相反。
仅当当前会话在当前会话期间成功通过身份验证时,该authenticated
标签才会显示其包装的内容。它是一个比user更具限制性的标签,用于保证敏感工作流中的身份。Subject
例子:
<shiro:authenticated>
<a href="updateAccount.jsp">Update your contact information</a>.
</shiro:authenticated>
authenticated
标签是标签的逻辑反义词notAuthenticated。
notAuthenticated
标签_
如果当前会话期间当前尚未成功验证,则该标签notAuthenticated
将显示其包装的内容。Subject
例子:
<shiro:notAuthenticated>
Please <a href="login.jsp">login</a> in order to update your credit card information.
</shiro:notAuthenticated>
notAuthenticated
标签是标签的逻辑反义词authenticated。
principal
标签_
该principal
标签将输出 Subject 的[# ]#getPrincipal--[ principal
](标识属性)或该主体的属性。
没有任何标签属性,标签将呈现toString()
主体的值。例如(假设主体是字符串用户名):
Hello, <shiro:principal/>, how are you today?
这(大部分)等同于以下内容:
Hello, <%= SecurityUtils.getSubject().getPrincipal().toString() %>, how are you today?
类型化的主体
默认情况下,该principal
标签假定要打印的主体是该subject.getPrincipal()
值。但是,如果您想打印一个不是主要主体的值,而是主题的 { [# ]#getPrincipals--[主体集合] 中的另一个值,您可以按类型获取该主体并打印该值。
例如,打印主题的用户 ID(而不是用户名),假设 ID 在主体集合中:
User ID: <principal type="java.lang.Integer"/>
这(大部分)等同于以下内容:
User ID: <%= SecurityUtils.getSubject().getPrincipals().oneByType(Integer.class).toString() %>
主要财产
但是,如果主体(默认的主主体或上面的“类型化”主体)是一个复杂对象而不是简单字符串,并且您想引用该主体上的属性怎么办?您可以使用该property
属性来指示要读取的属性的名称(必须可以通过与 JavaBeans 兼容的 getter 方法访问)。例如(假设主要主体是用户对象):
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
标签_
hasRole
仅当当前Subject
被分配指定角色时,标签才会显示其包装的内容。
例如:
<shiro:hasRole name="administrator">
<a href="admin.jsp">Administer the system</a>
</shiro:hasRole>
该标记与缺少角色hasRole
标记在逻辑上相反。
lacksRole
标签_
lacksRole
仅当当前Subject
未分配指定角色时,标签才会显示其包装内容。
例如:
<shiro:lacksRole name="administrator">
Sorry, you are not allowed to administer the system.
</shiro:lacksRole>
该标记与hasRolelacksRole
标记在逻辑上相反。
hasAnyRole
标签_
如果从逗号分隔的角色名称列表中为当前角色分配了任何指定角色,则该hasAnyRole
标签将显示其包装的内容。Subject
例如:
<shiro:hasAnyRoles name="developer, project manager, administrator">
You are either a developer, project manager, or administrator.
</shiro:hasAnyRoles>
该hasAnyRole
标签目前没有逻辑上相反的标签。
hasPermission
标签_
hasPermission
仅当当前Subject
“具有”(暗示)指定权限时,标签才会显示其包装内容。即,用户具有指定的能力。
例如:
<shiro:hasPermission name="user:create">
<a href="createUser.jsp">Create a new User</a>
</shiro:hasPermission>
该标记与missingsPermissionhasPermission
标记在逻辑上相反。
lacksPermission
标签_
lacksPermission
仅当当前Subject
不具有(暗示)指定权限时,标签才会显示其包装内容。也就是说,用户没有指定的能力。
例如:
<shiro:lacksPermission name="user:delete">
Sorry, you are not allowed to delete user accounts.
</shiro:lacksPermission>
该标记与hasPermissionlacksPermission
标记在逻辑上相反。