一、apache shiro 标签库
Apache Shiro 提供了一个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 的principal collection,你可以通过类型来获取该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 没有拥有(蕴含)特定的权限。也就是说,用户没有特定的能力。