日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

springboo整合security——权限设置

發布時間:2025/1/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboo整合security——权限设置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 一、數據準備
      • 1.1 創建permission 表
      • 1.2 創建 entity、Mapper、Service
      • 1.3 修改接口
    • 二、PermissionEvaluator

一、數據準備

1.1 創建permission 表

創建一張permission表

CREATE TABLE `permission` (`id` int(11) NOT NULL AUTO_INCREMENT,`url` varchar(255) DEFAULT NULL,`role_id` int(11) DEFAULT NULL,`permission` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

初始化兩條數據

INSERT INTO chapter03.permission(id, url, role_id, permission) VALUES (1, ‘/admin’, 1, ‘c,r,u,d’);
INSERT INTO chapter03.permission(id, url, role_id, permission) VALUES (2, ‘/admin’, 2, ‘r’);

1.2 創建 entity、Mapper、Service

(1)、創建permission實體

package com.sl.entity;import java.io.Serializable; import java.util.Arrays; import java.util.List;/*** @author shuliangzhao* @Title: Permission* @ProjectName spring-boot-learn* @Description: TODO* @date 2019/8/6 19:22*/ public class Permission implements Serializable {private Integer id;private String url;private Integer roleId;private String permission;private List<String> permissions;public List<String> getPermissions() {return Arrays.asList(this.permission.trim().split(","));}public void setPermissions(List<String> permissions) {this.permissions = permissions;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public Integer getRoleId() {return roleId;}public void setRoleId(Integer roleId) {this.roleId = roleId;}public String getPermission() {return permission;}public void setPermission(String permission) {this.permission = permission;} }

這里需要注意的時相比于數據庫,多了一個 permissions 屬性,該字段將 permission 按逗號分割為了 list。
(2)、創建permissionMapper

@Mapper public interface PermissionMapper {@Select("SELECT * FROM permission where role_id = #{id}")List<Permission> selectListById(Integer id); }

(3)、創建permissionService

@Service public class PermissionService {@Autowiredprivate PermissionMapper permissionMapper;public List<Permission> selectListById(Integer id) {return permissionMapper.selectListById(id);} }

1.3 修改接口

@Controller public class LoginController {...@RequestMapping("/admin")@ResponseBody@PreAuthorize("hasPermission('/admin','r')")public String printAdminR() {return "如果你看見這句話,說明你訪問/admin路徑具有r權限";}@RequestMapping("/admin/c")@ResponseBody@PreAuthorize("hasPermission('/admin','c')")public String printAdminC() {return "如果你看見這句話,說明你訪問/admin路徑具有c權限";} } 讓我們修改下我們要訪問的接口,@PreAuthorize("hasPermission('/admin','r')")是關鍵,參數1指明了訪問該接口需要的url,參數2指明了訪問該接口需要的權限。

二、PermissionEvaluator

@Component public class CustomPermissionEvaluator implements PermissionEvaluator {@Autowiredprivate PermissionService permissionService;@Autowiredprivate RoleService roleService;@Autowiredprivate UserService userService;@Overridepublic boolean hasPermission(Authentication authentication, Object targetUrl, Object permission) {// 獲得loadUserByUsername()方法的結果/*String userName = (String) authentication.getPrincipal();User user = userService.selectByName(userName);*/// 獲得loadUserByUsername()中注入的角色Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();// 遍歷用戶所有角色for (GrantedAuthority authority:authorities) {String roleName = authority.getAuthority();Integer rId = roleService.selectByName(roleName).getId();// 得到角色所有的權限List<Permission> permissions = permissionService.selectListById(rId);// permissionsfor (Permission per:permissions) {//獲取權限集List<String> permissions1 = per.getPermissions();if (targetUrl.equals(per.getUrl()) && permissions1.contains(permission)) {return true;}}}return false;}@Overridepublic boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {return false;} }

在 hasPermission() 方法中,參數 1 代表用戶的權限身份,參數 2 參數 3 分別和 @PreAuthorize(“hasPermission(’/admin’,‘r’)”) 中的參數對應,即訪問 url 和權限。

思路如下:

  • 通過 Authentication 取出登錄用戶的所有 Role
  • 遍歷每一個 Role,獲取到每個Role的所有 Permission
  • 遍歷每一個 Permission,只要有一個 Permission 的 url 和傳入的url相同,且該 Permission 中包含傳入的權限,返回 true
  • 如果遍歷都結束,還沒有找到,返回false
  • 下面就是在 WebSecurityConfig 中注冊 CustomPermissionEvaluator

    @Bean
    public DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler() {
    DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
    defaultWebSecurityExpressionHandler.setPermissionEvaluator(customPermissionEvaluator);
    return defaultWebSecurityExpressionHandler;
    }

    總結

    以上是生活随笔為你收集整理的springboo整合security——权限设置的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。