Java輕松實現(xiàn)權限認證管理的示例代碼
我們在實際開發(fā)中經常會進行權限認證管理,給不同的人加上對應的角色和權限,對于不同的登錄用戶要求根據他們所扮演的的角色和擁有的權限去訪問指定的接口,那具體該怎么實現(xiàn)呢
我這邊參考了各個框架的實現(xiàn)邏輯,發(fā)現(xiàn)還是蠻簡單的,今天就實現(xiàn)一個簡易的權限驗證管理系統(tǒng)
首先需要角色和權限表
角色表:字段為用戶唯一標識(user_id),該用戶所扮演的角色(role_name)
權限表:字段為用戶所含有的角色(user_roles),該角色所擁有的權限(permission)
數(shù)據庫腳本
-- 創(chuàng)建Roles表 CREATE TABLE Roles ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, role_name VARCHAR(255) NOT NULL ); -- 創(chuàng)建Permissions表 CREATE TABLE Permissions ( id INT AUTO_INCREMENT PRIMARY KEY, user_roles VARCHAR(255) NOT NULL, permission VARCHAR(255) NOT NULL );
接下來該敲代碼了,依舊是熟悉的套路,依賴配置寫代碼
核心邏輯如下
- 根據jwt登錄得到redis的用戶key獲取用戶信息,比如id,根據id拿到角色和權限
- 在每一個接口寫一個aop切面,在切面中判斷該登錄用戶是否含有對應接口所需要的角色和權限
1.使用aop切面先加上依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
2. 接下來創(chuàng)建權限注解(注解大致就是一個類,包含一些屬性,主要還是切面的邏輯)
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface DbmAuthority { String value(); // 權限字符串,格式為"功能:角色:權限" }
3.創(chuàng)建一個簡單的用戶權限類,如下
@Data public class User { private String id; //用戶ID private List<String> roles; //角色 private List<String> permissions; //權限 }
4.模擬從數(shù)據庫根據登錄用戶id查詢該角色的角色和權限
public interface UserRepository { User getUserById(String userId); }
實現(xiàn)這個接口
public class UserRepositoryimpl implements UserRepository{ @Resource private RolesMapper rolesMapper; @Resource private Permissions permissionsMapper; @Override public User getUserById(String userId) { //根據id獲取該用戶扮演的角色 List<String> roles = rolesMapper.selectAll(userId); //根據id獲取該用戶擁有的權限 List<String> permissions = new ArrayList<>(); roles.stream().forEach(a->{ List<String> permission =permissionsMapper.selectAll(a); permission.stream().forEach(a->{ permissions.add(a); }); }); User user= new User(userId,roles,permissions); return user; } }
用戶的角色和權限一般都是一起查出來,參考sql如下
SELECT R.id AS id, GROUP_CONCAT(R.role_name) AS role_list, GROUP_CONCAT(P.permission) AS permission_list FROM Roles R LEFT JOIN Permissions P ON R.role_name = P.user_roles WHERE R.id = 1; -- 你的特定id GROUP BY R.id;
5.在注解實現(xiàn)aop邏輯,本質和上面說的一樣,很簡單
@Aspect @Component public class DbmAuthorityAspect { @Resource private UserRepositoryimpl userRepositoryimpl; @Resource private RedisUtils redisutils; @Pointcut("@annotation(com.dabaimao.DbmAuthority)") public void authorityCheckPointcut(JoinPoint joinPoint) { } @Before("@annotation(com.dabaimao.DbmAuthority)") public void checkDbmAuthority(JoinPoint joinPoint) { try { // 獲取當前用戶的ID(從Redis中獲取) String userId = getUserIdFromRedis(); // 根據用戶ID查詢用戶信息 User user = userRepositoryimpl.getUserById(userId); // 獲取注解類對象 Signature signature = point.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; Method method = methodSignature.getMethod(); DbmAuthority annotation = method.getAnnotation(DbmAuthority.class); // 檢查用戶是否具有所需的角色和權限 if (userHasRequiredAuthority(user, annotation.value())) { // 用戶具有權限,允許訪問 } else { throw new SecurityException("權限不夠,拒絕訪問"); } } catch (Exception ex) { throw new RuntimeException("權限處理異常"); } } private boolean userHasRequiredAuthority(User user, String requiredAuthority) { // 實際權限檢查邏輯,需要根據用戶的角色和權限信息以及 requiredAuthority 判斷 // 這里只是一個示例,實際邏輯可能更復雜 return user.getRoles().contains(requiredAuthority) || user.getPermissions().contains(requiredAuthority); } private String getUserIdFromRedis() { // 實際從Redis中獲取用戶ID的邏輯 // redisutils.getkey... return "user123"; // 示例 } }
最后在需要加權限訪問的接口加上這個注解,寫上訪問這個接口所需要的角色和權限就行了
@RestController public class MyController { @DbmAuthority("功能:角色:權限") //訪問這個功能登錄用戶所需要的角色和權限 @GetMapping("/protectedEndpoint") public ResponseEntity<String> protectedEndpoint() { // 執(zhí)行需要權限驗證的操作 return ResponseEntity.ok("訪問成功"); } }
這樣一個簡單的權限認證就實現(xiàn)了
到此這篇關于Java輕松實現(xiàn)權限認證管理的示例代碼的文章就介紹到這了,更多相關Java權限認證內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring?Security權限想要細化到按鈕實現(xiàn)示例
這篇文章主要為大家介紹了Spring?Security權限想要細化到按鈕實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07SpringBoot整合MongoDB實現(xiàn)文檔存儲功能
MongoDB是可以應用于各種規(guī)模的企業(yè)、各個行業(yè)以及各類應用程序的開源數(shù)據庫,本文將結合MongoDB和SpringBoot實現(xiàn)文檔存儲功能,需要的可以參考下2024-12-12SpringBoot監(jiān)控模塊Actuator的用法詳解
Spring?Boot?Actuator?是?Spring?Boot?自帶的一個功能模塊,提供了一組已經開箱即用的生產環(huán)境下常用的特性和服務,比如應用程序的健康檢查、信息暴露、度量收集、日志記錄等,本文將給大家詳細SpringBoot監(jiān)控模塊Actuator的用法2023-06-06