SpringBoot中實現(xiàn)Shiro控制ThymeLeaf界面按鈕級權(quán)限控制

需求簡述

在業(yè)績核算系統(tǒng)中,我們使用了SpringBoot作為項目的整體架構(gòu),使用ThymeLeaf作為前端界面框架,使用Shiro作為我們的權(quán)限控制框架,Shiro作為輕量級的權(quán)限框架,使用起來非常方便,但是在使用的過程中我發(fā)現(xiàn),Shiro作為頁面級的權(quán)限控制框架非常好用,它可以注入到Controller中對頁面級的訪問權(quán)限做控制,但是如果我們想要實現(xiàn)頁面中某個按鈕或者列表的權(quán)限顯示,單純的在Controller中添加注解就顯得捉襟見肘了。

解決方案

為了解決上述的需求,我們需要引入一個新的組件---------------Thymeleaf Extras Shiro ,這個組件的作用就是可以在thymeleaf中使用自定義標(biāo)簽并配合權(quán)限靈活的控制網(wǎng)頁上的組件顯示與否。
他的官方網(wǎng)站是:Github

集成方法

首先我們需要在Pom.xml中引入這個組件的dependency

<!-- https://mvnrepository.com/artifact/com.github.theborakompanioni/thymeleaf-extras-shiro -->
<dependency>
    <groupId>com.github.theborakompanioni</groupId>
    <artifactId>thymeleaf-extras-shiro</artifactId>
    <version>2.0.0</version>
</dependency>

引入完成后,直接啟動應(yīng)用會報錯,因為thymeleaf-extras-shiro這個組件需要thymeleaf3.0支持,而Springboot 1.58版本默認(rèn)的thymeleaf的版本是2.X的,所以我們還要將thymeleaf設(shè)置成3.0版本,具體代碼如下,還是在pom.xml里:

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <thymeleaf.version>3.0.0.RELEASE</thymeleaf.version>

        <thymeleaf-layout-dialect.version>2.0.0</thymeleaf-layout-dialect.version>
    </properties>

此處設(shè)置完畢后我們才是真正的將thymeleaf-extras-shiro引入進(jìn)來了,之后我們還要在Shiro的Config文件中對設(shè)置進(jìn)行相應(yīng)的修改:

 @Bean(name = "shiroDialect")
    public ShiroDialect shiroDialect(){
        return new ShiroDialect();
    }

添加這段代碼的目的就是為了在thymeleaf中使用shiro的自定義tag。
好了,現(xiàn)在基本上所有使用shiro-tag的條件都具備了,現(xiàn)在給出前端的代碼示例:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
    <meta charset="UTF-8" />
    <title>Insert title here</title>
</head>
<body>
<h3>index</h3>
<!-- 驗證當(dāng)前用戶是否為“訪客”,即未認(rèn)證(包含未記住)的用戶。 -->
<p shiro:guest="">Please <a href="login.html">login</a></p>


<!-- 認(rèn)證通過或已記住的用戶。 -->
<p shiro:user="">
    Welcome back John! Not John? Click <a href="login.html">here</a> to login.
</p>

<!-- 已認(rèn)證通過的用戶。不包含已記住的用戶,這是與user標(biāo)簽的區(qū)別所在。 -->
<p shiro:authenticated="">
    Hello, <span shiro:principal=""></span>, how are you today?
</p>
<a shiro:authenticated="" href="updateAccount.html">Update your contact information</a>

<!-- 輸出當(dāng)前用戶信息,通常為登錄帳號信息。 -->
<p>Hello, <shiro:principal/>, how are you today?</p>


<!-- 未認(rèn)證通過用戶,與authenticated標(biāo)簽相對應(yīng)。與guest標(biāo)簽的區(qū)別是,該標(biāo)簽包含已記住用戶。 -->
<p shiro:notAuthenticated="">
    Please <a href="login.html">login</a> in order to update your credit card information.
</p>

<!-- 驗證當(dāng)前用戶是否屬于該角色。 -->
<a shiro:hasRole="admin" href="admin.html">Administer the system</a><!-- 擁有該角色 -->

<!-- 與hasRole標(biāo)簽邏輯相反,當(dāng)用戶不屬于該角色時驗證通過。 -->
<p shiro:lacksRole="developer"><!-- 沒有該角色 -->
    Sorry, you are not allowed to developer the system.
</p>

<!-- 驗證當(dāng)前用戶是否屬于以下所有角色。 -->
<p shiro:hasAllRoles="developer, 2"><!-- 角色與判斷 -->
    You are a developer and a admin.
</p>

<!-- 驗證當(dāng)前用戶是否屬于以下任意一個角色。  -->
<p shiro:hasAnyRoles="admin, vip, developer,1"><!-- 角色或判斷 -->
    You are a admin, vip, or developer.
</p>

<!--驗證當(dāng)前用戶是否擁有指定權(quán)限。  -->
<a shiro:hasPermission="userInfo:add" href="createUser.html">添加用戶</a><!-- 擁有權(quán)限 -->

<!-- 與hasPermission標(biāo)簽邏輯相反,當(dāng)前用戶沒有制定權(quán)限時,驗證通過。 -->
<p shiro:lacksPermission="userInfo:del"><!-- 沒有權(quán)限 -->
    Sorry, you are not allowed to delete user accounts.
</p>

<!-- 驗證當(dāng)前用戶是否擁有以下所有角色。 -->
<p shiro:hasAllPermissions="userInfo:view, userInfo:add"><!-- 權(quán)限與判斷 -->
    You can see or add users.
</p>

<!-- 驗證當(dāng)前用戶是否擁有以下任意一個權(quán)限。  -->
<p shiro:hasAnyPermissions="userInfo:view, userInfo:del"><!-- 權(quán)限或判斷 -->
    You can see or delete users.
</p>
<a shiro:hasPermission="pp" href="createUser.html">Create a new User</a>
</body>
</html>

這里注意一個細(xì)節(jié),在html界面的頂部加一個tag標(biāo)簽引入:xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容