shiro系列9:基於前端的權限控制和基於后端的權限控制


問題描述:

如何讓前端的某個按鈕在用戶擁有該按鈕的權限時才顯示?如何讓后端的某個接口在用戶擁有該訪問的權限時才可以訪問?

 

解決方法:

基於前端的權限控制:前端某個按鈕的隱藏或顯示可以通過shiro的頁面標簽來控制,當用戶擁有該權限時,我們就讓該按鈕顯示,否則隱藏;

基於后端的權限控制:后端的某個接口我們可以通過shiro的注解來控制是否允許訪問,當用戶擁有該權限時,我們就允許訪問,否則不允許訪問;

一、基於前端的權限控制

標簽名 作用
shiro:guest 允許游客訪問的代碼塊
shiro:user 允許已經驗證或者通過"記住我"登錄的用戶才能訪問的代碼塊。
shiro:authenticated 只有通過登錄操作認證身份,而並非通過"記住我"登錄的用戶才能訪問的代碼塊。
shiro:notAuthenticated 未登錄的用戶顯示的代碼塊。
shiro:principal 顯示當前登錄的用戶信息。
<shiro:hasRole name=“admin”> 只有擁有admin角色的用戶才能訪問的代碼塊。
<shiro:hasAnyRoles name=“admin,manager”> 只有擁有admin或者manager角色的用戶才能訪問的代碼塊。
<shiro:lacksRole name=“admin”> 沒有admin角色的用戶顯示的代碼塊
<shiro:hasPermission name=“admin:delete”> 只有擁有"admin:delete"權限的用戶才能訪問的代碼塊。
<shiro:lacksPermission name=“admin:delete”> 沒有"admin:delete"權限的用戶顯示的代碼塊。

 

1、添加依賴

<!-- springboot 集成shiro依賴-->
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.4.0</version>
</dependency>
<!-- 因為shiro默認是jsp頁面的,官方文檔上的標簽也只支持taglib,所以需要thymeleaf額外集成shiro標簽支持 -->
<dependency>
    <groupId>com.github.theborakompanioni</groupId>
    <artifactId>thymeleaf-extras-shiro</artifactId>
    <version>2.0.0</version>
</dependency>

 

2、在頁面頭上加標簽支持

<html  xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">

 

3、配置shiro標簽

//配置ShiroDialect:用於thymeleaf和shiro標簽配合使用
@Bean
public ShiroDialect getShiroDialect(){
    return new ShiroDialect();
}

 

4、在頁面中使用shiro標簽進行權限控制:有兩種方式

<script type="text/html" id="toolbar">
    <!--方式1-->
    <div class="layui-btn-group">
        <button type="button" class="layui-btn" lay-event="addMenu" shiro:hasPermission="sys:permission:add">
            <i class="layui-icon">&#xe608;</i> 添加
        </button>
        <button type="button" class="layui-btn" lay-event="deleteMenu" shiro:hasPermission="sys:permission:delete">
            <i class="layui-icon">&#xe608;</i> 刪除
        </button>
    </div>
    <!--方式2-->
    <shiro:hasPermission name=“sys:permission:update”>
    <div class="layui-btn-group">
        <button type="button" class="layui-btn" lay-event="updateMenu">
            <i class="layui-icon">&#xe608;</i> 更新
        </button>
    </div>
    <shiro:hasPermission>
</script>

 

 

二、基於后端的權限控制

@RequiresAuthentication:表示當前Subject已經通過login 進行了身份驗證;即 Subject. isAuthenticated() 返回 true。
@RequiresUser:表示當前 Subject 已經身份驗證或者通過記住我登錄的。
@RequiresGuest:表示當前Subject沒有身份驗證或通過記住我登錄過,即是游客身份。
@RequiresRoles(value={“admin”, “user”}, logical= Logical.AND):表示當前 Subject 需要 admin 和 user 角色。
@RequiresPermissions (value={“user:a”, “user:b”}, logical= Logical.OR):表示當前 Subject 需要 user:a 或 user:b 權限

 

1、添加依賴

<!-- springboot 集成shiro依賴-->
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.4.0</version>
</dependency>
<!-- 因為shiro默認是jsp頁面的,官方文檔上的標簽也只支持taglib,所以需要thymeleaf額                外集成shiro標簽支持 -->
<dependency>
    <groupId>com.github.theborakompanioni</groupId>
    <artifactId>thymeleaf-extras-shiro</artifactId>
    <version>2.0.0</version>
</dependency>

 

2、配置注解支持

/**
 * 開啟shiro aop注解支持.
 */
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
    AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor =       new AuthorizationAttributeSourceAdvisor();
    authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
    return authorizationAttributeSourceAdvisor;
}

 

3、在控制層接口上添加注解

@GetMapping("/users")
@RequiresPermissions("sys:user:list") //只有擁有該權限的用戶才能訪問該接口
public DataResult<List<User>> getAllDept(User user){
    DataResult result =DataResult.success();
    result.setData(this.userService.getUser());
    return result;
}

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM