問題描述:
如何讓前端的某個按鈕在用戶擁有該按鈕的權限時才顯示?如何讓后端的某個接口在用戶擁有該訪問的權限時才可以訪問?
解決方法:
基於前端的權限控制:前端某個按鈕的隱藏或顯示可以通過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”> |
<!-- 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"></i> 添加 </button> <button type="button" class="layui-btn" lay-event="deleteMenu" shiro:hasPermission="sys:permission:delete"> <i class="layui-icon"></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"></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; }