SpringBoot:整合Shiro之Shiro標籤(.jsp和.ftl)

前言
上一篇部落格,我們說到如何在使用者請求的時候,攔截使用者請求進行操作,這一篇部落格我們來聊一下如何使用Shiro標籤在網頁之中進行使用者角色和許可權控制.那麼,我們就看一下具體的場景,假設頁面當中有一個新增使用者按鈕,我們需要當擁有admin角色的使用者登入認證完成之後顯示,普通使用者不顯示,那麼這時候我們就需要使用Shiro標籤來做處理了.例如這個例子,我們就可以用一下程式碼來實現.如果含有admin就會顯示,反之,則不會顯示.
<shiro:hashRole name = "admin"> <button >新增使用者</button> </shiro:hashRole>
JSP的Shiro標籤
在JSP中使用Shiro標籤比較簡單,我們只需要注意用法即可.下面我就把所以Shiro標籤放在下面了,各位看官自行查考.
<shiro:guest> 遊客訪問 <a href = "login.jsp"></a> </shiro:guest> user 標籤:使用者已經通過認證\記住我 登入後顯示響應的內容 <shiro:user> 歡迎[<shiro:principal/>]登入 <a href = "logout">退出</a> </shiro:user> authenticated標籤:使用者身份驗證通過,即 Subjec.login 登入成功 不是記住我登入的 <shiro:authenticted> 使用者[<shiro:principal/>] 已身份驗證通過 </shiro:authenticted> notAuthenticated標籤:使用者未進行身份驗證,即沒有呼叫Subject.login進行登入,包括"記住我"也屬於未進行身份驗證 <shiro:notAuthenticated> 未身份驗證(包括"記住我") </shiro:notAuthenticated> principal 標籤:顯示使用者身份資訊,預設呼叫 Subjec.getPrincipal()獲取,即Primary Principal <shiro:principal property = "username"/> hasRole標籤:如果當前Subject有角色將顯示body體內的內容 <shiro:hashRole name = "admin"> 使用者[<shiro:principal/>]擁有角色admin </shiro:hashRole> hasAnyRoles標籤:如果Subject有任意一個角色(或的關係)將顯示body體裡的內容 <shiro:hasAnyRoles name = "admin,user"> 使用者[<shiro:pricipal/>]擁有角色admin 或者 user </shiro:hasAnyRoles> lacksRole:如果當前 Subjec沒有角色將顯示body體內的內容 <shiro:lacksRole name = "admin"> 使用者[<shiro:pricipal/>]沒有角色admin </shiro:lacksRole> hashPermission:如果當前Subject有許可權將顯示body體內容 <shiro:hashPermission name = "user:create"> 使用者[<shiro:pricipal/>] 擁有許可權user:create </shiro:hashPermission> lacksPermission:如果當前Subject沒有許可權將顯示body體內容 <shiro:lacksPermission name = "org:create"> 使用者[<shiro:pricipal/>] 沒有許可權org:create </shiro:lacksPermission>
Freemark的Shiro標籤
在SpringBoot裡面並不是直接支援JSP檔案的,然後我就在專案中使用了Freemark,但是Shiro標籤並不能直接支援.ftl檔案,所以我們需要先引入一個Maven依賴.
<dependency> <groupId>net.mingsoft</groupId> <artifactId>shiro-freemarker-tags</artifactId> <version>0.1</version> </dependency>
然後,我們寫一個名為ShiroTagsFreeMarkerCfg配置類來對Freemark使用Shiro標籤進行配置.當然了,要確定配置類能被正確注入到Bean中,程式碼如下所示.
import com.jagregory.shiro.freemarker.ShiroTags; import freemarker.template.TemplateModelException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; import javax.annotation.PostConstruct; @Component public class ShiroTagsFreeMarkerCfg { @Autowired private FreeMarkerConfigurer freeMarkerConfigurer; @PostConstruct public void setSharedVariable() throws TemplateModelException { freeMarkerConfigurer.getConfiguration().setSharedVariable("shiro", new ShiroTags()); } }
配置類搞好之後,我們就可以在.ftl檔案中使用Shiro的許可權標籤了,標籤格式如下所示.
<@shiro.guest> 遊客訪問 <a href = "login.jsp"></a> </@shiro.guest> user 標籤:使用者已經通過認證\記住我 登入後顯示響應的內容 <@shiro.user> 歡迎[<@shiro.principal/>]登入,<a href="/logout.html">退出</a> </@shiro.user> authenticated標籤:使用者身份驗證通過,即 Subjec.login 登入成功 不是記住我登入的 <@shiro.authenticated> 使用者[<@shiro.principal/>]已身份驗證通過 </@shiro.authenticated> notAuthenticated標籤:使用者未進行身份驗證,即沒有呼叫Subject.login進行登入,包括"記住我"也屬於未進行身份驗證 <@shiro.notAuthenticated> 當前身份未認證(包括記住我登入的) </@shiro.notAuthenticated> principal 標籤:顯示使用者身份資訊,預設呼叫 Subjec.getPrincipal()獲取,即Primary Principal <@shiro.principal property="username"/> hasRole標籤:如果當前Subject有角色將顯示body體內的內容 <@shiro.hasRole name="admin"> 使用者[<@shiro.principal/>]擁有角色admin<br/> </@shiro.hasRole> hasAnyRoles標籤:如果Subject有任意一個角色(或的關係)將顯示body體裡的內容 <@shiro.hasAnyRoles name="admin,user,member"> 使用者[<@shiro.principal/>]擁有角色admin或user或member<br/> </@shiro.hasAnyRoles> lacksRole:如果當前 Subjec沒有角色將顯示body體內的內容 <@shiro.lacksRole name="admin"> 使用者[<@shiro.principal/>]不擁有admin角色 </@shiro.lacksRole> hashPermission:如果當前Subject有許可權將顯示body體內容 <@shiro.hasPermission name="user:add"> 使用者[<@shiro.principal/>]擁有user:add許可權 </@shiro.hasPermission> lacksPermission:如果當前Subject沒有許可權將顯示body體內容 <@shiro.lacksPermission name="user:add"> 使用者[<@shiro.principal/>]不擁有user:add許可權 </@shiro.lacksPermission>
結語
寫到這裡,前前後後寫了八篇Shiro整合部落格,這個系列的部落格到此就結束了,後期如果遇到新的問題會繼續補充,歡迎繼續關注騷棟.內心騷棟,未忘初心.
ofollow,noindex">參考部落格
