一、apache shiro 标签库
ApacheShiro提供了一个JSP/GSP标签库,它允许你控制你的JSP,JSTL或GSP页面基于当前Subject的状态进行输出。
这对于根据用户身份和当前用户的授权状态来提供个性化视图是相当有用的。
标签库的描述文件(TLD)保存在shiro-web.jar里的META-INF/shiro.tld文件。要使用任何标签,需要在你JSP页面(或任何你定义的页面指令)的顶部添加下面一行:
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
1、shiro:guest
<shiro:guest>
<a href="#" >注册</a><br/>
</shiro:guest>
guest标签将显示它包含的内容,仅当当前的Subject被认为是’guest’时。'guest’是指没有身份ID的任何Subject。也就是说,我们并不知道用户是谁,因为他们没有登录并且他们没有在上一次的访问中被记住(RememberMe服务)。
2、shiro:user
<shiro:user>
welcome ! login success !
</shiro:user>
user标签将显示它包含的内容,仅当当前的Subject被认为是’user’时。'user’在上下文中被定义为一个已知身份ID的Subject,或是成功通过身份验证及通过’RememberMe’服务的。
3、shiro:authenticated
<shiro:authenticated>
<a href = "updateAccount.jsp">update account</a>
</shiro:authenticated>
authenticated标签只有当当前Subject在其当前的会话中成功地通过了身份验证才会显示包含的内容。它比user标签更为严格,
authenticated标签通常在敏感的工作流中用来确保身份ID是可靠的。它在逻辑上与’notAuthenticated’标签相反。
4、shiro:notAuthenticated
<shiro:notAuthenticated>
<a href = "login.jsp">login system</a>
</shiro:notAuthenticated>
notAuthenticated标签将会显示它所包含的内容,如果当前Subject还没有在其当前会话中成功地通过验证。
5、shiro:principal
welcome : <shiro:principal></shiro:principal> <---> welcome : <%=?SecurityUtils.getSubject().getPrincipal().toString()?%>
principal标签将会输出Subject的主体(标识属性)或主要的属性。
若没有任何标签属性,则标签将使用principal的toString()值来呈现页面。
但若你想输出一个不是主要principal的值,而是属于另一个Subject的principalcollection,你可以通过类型来获取该principal并输出该值。
User ID: <principal type="java.lang.Integer"/> <---> User?ID:?<%=?SecurityUtils.getSubject().getPrincipals().oneByType(Integer.class).toString()?%>
但如果该principal是一个复杂的对象而不是一个简单的字符串,而且你希望引用该principal上的一个属性该怎么办呢?你可以使用property属性来来表示property的名称来理解(必须通过JavaBeans兼容的getter方法访问)。例如(假设principal是一个User对象):
Hello, <shiro:principal property="firstName"/> <--->Hello,?<%=?SecurityUtils.getSubject().getPrincipal().getFirstName().toString()?%>
如果结合属性类型如下:
Hello, <shiro:principal type="com.foo.User" property="firstName"/>
<---> Hello,?<%=?SecurityUtils.getSubject().getPrincipals.oneByType(com.foo.User.class).getFirstName().toString()?%>
6、<shiro:hasRole name=“xxxx”>
<shiro:hasRole name="admin">
<a href = "admin.jsp">admin system</a>
</shiro:hasRole>
hasRole标签将会显示它所包含的内容,仅当当前Subject被分配了具体的角色。hasRole标签与lacksRole标签逻辑相反。
7、<shiro:lacksRole name=“admin”>
<shiro:lacksRole name="admin">
<a href = "admin.jsp">admin system</a>
</shiro:lacksRole>
lacksRole标签将会显示它所包含的内容,仅当当前Subject未被分配具体的角色。
8、<shiro:hasAnyRoles name=“admin,common”>
<shiro:hasAnyRoles name="admin,common">
current roles : admin common
</shiro:hasAnyRoles>
如果当前的Subject被分配了任意一个来自于逗号分隔的角色名列表中的具体角色,hasAnyRole 标签将会显示它所包含的内容。
9、<shiro:hasPermission name=“user:create”>
<shiro:hasPermission name="user:create">
<a href = "create.jsp">create new user</a>
</shiro:hasPermission>
hasPermission标签将会显示它所包含的内容,仅当当前Subject“拥有”(蕴含)特定的权限。也就是说,用户具有特定的能力。
hasPermission标签与lacksPermission标签逻辑相反。
10、<shiro:lacksPermission name=“user:delete”>
<shiro:lacksPermission name="user:delete">
has not delete operation
</shiro:lacksPermission>
lacksPermission标签将会显示它所包含的内容,仅当当前Subject没有拥有(蕴含)特定的权限。也就是说,用户没有特定的能力。