魯春利的工做筆記,好記性不如爛筆頭html
Shiro 提供了JSTL標籤用於在JSP/GSP 頁面進行權限控制,如根據登陸用戶顯示相應的頁面按鈕。java
導入標籤庫web
<%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
標籤庫定義在shiro-web.jar包下的META-INF/shiro.tld 中定義。apache
自定義標籤tag-class定義jsp
package org.apache.shiro.web.tags; public class GuestTag extends SecureTag { //TODO - complete JavaDoc private static final Logger log = LoggerFactory.getLogger(GuestTag.class); public int onDoStartTag() throws JspException { if (getSubject() == null || getSubject().getPrincipal() == null) { if (log.isTraceEnabled()) { log.trace("Subject does not exist or does not have a known identity (aka 'principal'). " + "Tag body will be evaluated."); } return TagSupport.EVAL_BODY_INCLUDE; } else { if (log.isTraceEnabled()) { log.trace("Subject exists or has a known identity (aka 'principal'). " + "Tag body will not be evaluated."); } return TagSupport.SKIP_BODY; } } } package org.apache.shiro.web.tags; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; /** * @since 0.1 */ public abstract class SecureTag extends TagSupport { //TODO - complete JavaDoc private static final Logger log = LoggerFactory.getLogger(SecureTag.class); public SecureTag() { } protected Subject getSubject() { return SecurityUtils.getSubject(); } protected void verifyAttributes() throws JspException { } public int doStartTag() throws JspException { verifyAttributes(); return onDoStartTag(); } public abstract int onDoStartTag() throws JspException; }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>未受權</title> </head> <body> <shiro:guest> 歡迎遊客訪問,<a href="${pageContext.request.contextPath}/login">登陸</a> </shiro:guest> <shiro:user> 歡迎[<shiro:principal/>]登陸,<a href="${pageContext.request.contextPath}/logout">退出</a> </shiro:user> </body> </html>
guest標籤ide
<shiro:guest> 歡迎遊客訪問,<a href="${pageContext.request.contextPath}/login.jsp">登陸</a> </shiro:guest>
用戶沒有身份驗證時顯示相應信息,即遊客訪問信息。學習
user標籤ui
<shiro:user> 歡迎[<shiro:principal/>]登陸,<a href="${pageContext.request.contextPath}/logout">退出</a> </shiro:user>
用戶已經身份驗證/記住我登陸後顯示相應的信息。lua
authenticated標籤spa
<shiro:authenticated> 用戶[<shiro:principal/>]已身份驗證經過 </shiro:authenticated>
用戶已經身份驗證經過,即Subject.login登陸成功,不是記住我登陸的。
notAuthenticated標籤
<shiro:notAuthenticated> 未身份驗證(包括記住我) </shiro:notAuthenticated>
用戶已經身份驗證經過,即沒有調用Subject.login進行登陸,包括記住我自動登陸的也屬於未進行身份驗證。
principal標籤
<shiro: principal/>
顯示用戶身份信息,默認調用Subject.getPrincipal()獲取,即Primary Principal。
<shiro:principal type="java.lang.String"/>
至關於Subject.getPrincipals().oneByType(String.class)。
<shiro:principal type="java.lang.String"/>
至關於Subject.getPrincipals().oneByType(String.class)。
<shiro:principal property="username"/>
至關於((User)Subject.getPrincipals()).getUsername()。
hasRole標籤
<shiro:hasRole name="admin"> 用戶[<shiro:principal/>]擁有角色admin<br/> </shiro:hasRole>
若是當前Subject有admin角色。
hasAnyRoles標籤
<shiro:hasAnyRoles name="admin,user"> 用戶[<shiro:principal/>]擁有角色admin 或user<br/> </shiro:hasAnyRoles>
若是當前Subject有任意一個角色(或的關係)。
lacksRole標籤
<shiro:lacksRole name="abc"> 用戶[<shiro:principal/>]沒有角色abc<br/> </shiro:lacksRole>
沒有角色abc將執行的代碼。
hasPermission標籤
<shiro:hasPermission name="user:create"> 用戶[<shiro:principal/>]擁有權限user:create<br/> </shiro:hasPermission>
判斷是否有指定的權限(有權限才能。。。)。
lacksPermission標籤
<shiro:lacksPermission name="org:create"> 用戶[<shiro:principal/>]沒有權限org:create<br/> </shiro:lacksPermission>
判斷是否有指定的權限(無權限才能。。。)。
導入自定義標籤庫
<%@taglib prefix="lucl" tagdir="/WEB-INF/tags" %>
在頁面中的應用
<lucl:hasAnyPermissions name="user:create,abc:update"> 用戶[<shiro:principal/>]擁有權限user:create或abc:update<br/> </lucl:hasAnyPermissions>
說明:經過hasAnyPermissions.tag來實現,參考Apache Shiro學習筆記(八)自定義標籤。