ApacheShiro提供了一个JSP/GSP标签库,它允许你控制你的JSP,JSTL或GSP页面基于当前Subject的状态进行输出。这对于根据用户身份和当前用户的授权状态来提供个性化视图是相当有用的。
标签库的描述文件(TLD)保存在shiro-web.jar里的META-INF/shiro.tld文件。要使用任何标签,需要在你JSP页面(或任何你定义的页面指令)的顶部添加下面一行:
<%@taglibprefix="shiro"uri="http://shiro.apache.org/tags"%> |
我们使用shiro前缀用以表明shiro标签库命名空间,当然你可以指定任何你喜欢的名字。
下面将分别介绍每一个标签,并展示它是如何用来渲染页面的。
Theguesttag
guest标签将显示它包含的内容,仅当当前的Subject被认为是'guest'时。'guest'是指没有身份ID的任何Subject。也就是说,我们并不知道用户是谁,因为他们没有登录并且他们没有在上一次的访问中被记住(RememberMe服务)。例如:
<shiro:guest> Hithere!Please<ahref="login.jsp">Login</a>or<ahref="signup.jsp">Signup</a>today! </shiro:guest> |
guest标签与user标签逻辑相反。
Theusertag
user标签将显示它包含的内容,仅当当前的Subject被认为是'user'时。'user'在上下文中被定义为一个已知身份ID的Subject,或是成功通过身份验证及通过'RememberMe'服务的。请注意这个标签在语义上与authenticated标签是不同的,authenticated标签更为严格。例如:
<shiro:user> WelcomebackJohn!NotJohn?Click<ahref="login.jsp">here<a>tologin. </shiro:user> |
usre标签与guest标签逻辑相反。
Theauthenticatedtag
仅仅只当当前用户在当前会话中成功地通过了身份验证authenticated标签才会显示包含的内容。它比'user'标签更为严格。它在逻辑上与'notAuthenticated'标签相反。
authenticated标签只有当当前Subject在其当前的会话中成功地通过了身份验证才会显示包含的内容。它比user标签更为严格,authenticated标签通常在敏感的工作流中用来确保身份ID是可靠的。例如:
<shiro:authenticated> <ahref="updateAccount.jsp">Updateyourcontactinformation</a>. </shiro:authenticated> |
authenticated标签与notAuthenticated标签逻辑相反。
ThenotAuthenticatedtag
notAuthenticated标签将会显示它所包含的内容,如果当前Subject还没有在其当前会话中成功地通过验证。例如:
<shiro:notAuthenticated> Please<ahref="login.jsp">login</a>inordertoupdateyourcreditcardinformation. </shiro:notAuthenticated> |
notAuthenticated标签与Authenticated标签逻辑相反。
Theprincipaltag
principal标签将会输出Subject的主体(标识属性)或主要的属性。
若没有任何标签属性,则标签将使用principal的toString()值来呈现页面。例如(假设principal是一个字符串的用户名):
Hello,<shiro:principal/>,howareyoutoday? |
这一般等价于下面:
Hello,<%=SecurityUtils.getSubject().getPrincipal().toString()%>,howareyoutoday? |
principal标签默认情况下,假定该principal输出的是subject.getPrincipal()的值。但若你想输出一个不是主要principal的值,而是属于另一个Subject的principalcollection,你可以通过类型来获取该principal并输出该值。
例如,输出Subject的用户ID(并不是username),假设该ID属于principalcollection:
UserID:<principaltype="java.lang.Integer"/> |
这一般等价于下面:
UserID:<%=SecurityUtils.getSubject().getPrincipals().oneByType(Integer.class).toString()%> |
但如果该principal是一个复杂的对象而不是一个简单的字符串,而且你希望引用该principal上的一个属性该怎么办呢?你可以使用property属性来来表示property的名称来理解(必须通过JavaBeans兼容的getter方法访问)。例如(假设principal是一个User对象):
Hello,<shiro:principalproperty="firstName"/>,howareyoutoday? |
这一般等价于下面:
Hello,<%=SecurityUtils.getSubject().getPrincipal().getFirstName().toString()%>,howareyoutoday? |
如果结合属性类型如下:
Hello,<shiro:principaltype="com.foo.User"property="firstName"/>,howareyoutoday? |
这一般等价于下面:
Hello,<%=SecurityUtils.getSubject().getPrincipals.oneByType(com.foo.User.class).getFirstName().toString()%>,howareyoutoday? |
ThehasRoletag
hasRole标签将会显示它所包含的内容,仅当当前Subject被分配了具体的角色。例如:
<shiro:hasRolename="administrator"> <ahref="admin.jsp">Administerthesystem</a> </shiro:hasRole> |
hasRole标签与lacksRole标签逻辑相反。
ThelacksRoletag
lacksRole标签将会显示它所包含的内容,仅当当前Subject未被分配具体的角色。例如:
<shiro:lacksRolename="administrator"> Sorry,youarenotallowedtoadministerthesystem. </shiro:lacksRole> |
lacksRole标签与hasRole标签逻辑相反。
ThehasAnyRoletag
hasAnyRole标签将会显示它所包含的内容,如果当前的Subject被分配了任意一个来自于逗号分隔的角色名列表中的具体角色。例如:
<shiro:hasAnyRolename="developer,projectmanager,administrator"> Youareeitheradeveloper,projectmanager,oradministrater. </shiro:hasAnyRole> |
hasAnyRole标签目前还没有与之逻辑相反的标签。
ThehasPermissiontag
hasPermission标签将会显示它所包含的内容,仅当当前Subject“拥有”(蕴含)特定的权限。也就是说,用户具有特定的能力。例如:
<shiro:hasPermissionname="user:create"> <ahref="createUser.jsp">CreateanewUser</a> </shiro:hasPermission> |
hasPermission标签与lacksPermission标签逻辑相反。
ThelacksPermissiontag
lacksPermission标签将会显示它所包含的内容,仅当当前Subject没有拥有(蕴含)特定的权限。也就是说,用户没有特定的能力。例如:
<shiro:lacksPermissionname="user:delete"> Sorry,youarenotallowedtodeleteduseraccounts. </shiro:hasPermission> |
lacksPermission标签与hasPermission标签逻辑相反。