SpringBoot:整合Shiro之Shiro標籤(.jsp和.ftl)
阿新 • • 發佈:2019-02-13
前言
上一篇部落格,我們說到如何在使用者請求的時候,攔截使用者請求進行操作,這一篇部落格我們來聊一下如何使用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整合部落格,這個系列的部落格到此就結束了,後期如果遇到新的問題會繼續補充,歡迎繼續關注騷棟.內心騷棟,未忘初心.