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
(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 和權限。
思路如下:
下面就是在 WebSecurityConfig 中注冊 CustomPermissionEvaluator
@Bean
public DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler() {
DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
defaultWebSecurityExpressionHandler.setPermissionEvaluator(customPermissionEvaluator);
return defaultWebSecurityExpressionHandler;
}
總結
以上是生活随笔為你收集整理的springboo整合security——权限设置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot 整合Securit
- 下一篇: Push代码:Git@github.co