Java輕松實現(xiàn)權(quán)限認證管理的示例代碼
我們在實際開發(fā)中經(jīng)常會進行權(quán)限認證管理,給不同的人加上對應(yīng)的角色和權(quán)限,對于不同的登錄用戶要求根據(jù)他們所扮演的的角色和擁有的權(quán)限去訪問指定的接口,那具體該怎么實現(xiàn)呢
我這邊參考了各個框架的實現(xiàn)邏輯,發(fā)現(xiàn)還是蠻簡單的,今天就實現(xiàn)一個簡易的權(quán)限驗證管理系統(tǒng)
首先需要角色和權(quán)限表
角色表:字段為用戶唯一標識(user_id),該用戶所扮演的角色(role_name)
權(quán)限表:字段為用戶所含有的角色(user_roles),該角色所擁有的權(quán)限(permission)
數(shù)據(jù)庫腳本
-- 創(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
);
接下來該敲代碼了,依舊是熟悉的套路,依賴配置寫代碼
核心邏輯如下
- 根據(jù)jwt登錄得到redis的用戶key獲取用戶信息,比如id,根據(jù)id拿到角色和權(quán)限
- 在每一個接口寫一個aop切面,在切面中判斷該登錄用戶是否含有對應(yīng)接口所需要的角色和權(quán)限
1.使用aop切面先加上依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2. 接下來創(chuàng)建權(quán)限注解(注解大致就是一個類,包含一些屬性,主要還是切面的邏輯)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DbmAuthority {
String value(); // 權(quán)限字符串,格式為"功能:角色:權(quán)限"
}
3.創(chuàng)建一個簡單的用戶權(quán)限類,如下
@Data
public class User {
private String id; //用戶ID
private List<String> roles; //角色
private List<String> permissions; //權(quán)限
}
4.模擬從數(shù)據(jù)庫根據(jù)登錄用戶id查詢該角色的角色和權(quán)限
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) {
//根據(jù)id獲取該用戶扮演的角色
List<String> roles = rolesMapper.selectAll(userId);
//根據(jù)id獲取該用戶擁有的權(quán)限
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;
}
}用戶的角色和權(quán)限一般都是一起查出來,參考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邏輯,本質(zhì)和上面說的一樣,很簡單
@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 {
// 獲取當(dāng)前用戶的ID(從Redis中獲取)
String userId = getUserIdFromRedis();
// 根據(jù)用戶ID查詢用戶信息
User user = userRepositoryimpl.getUserById(userId);
// 獲取注解類對象
Signature signature = point.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
DbmAuthority annotation = method.getAnnotation(DbmAuthority.class);
// 檢查用戶是否具有所需的角色和權(quán)限
if (userHasRequiredAuthority(user, annotation.value())) {
// 用戶具有權(quán)限,允許訪問
} else {
throw new SecurityException("權(quán)限不夠,拒絕訪問");
}
} catch (Exception ex) {
throw new RuntimeException("權(quán)限處理異常");
}
}
private boolean userHasRequiredAuthority(User user, String requiredAuthority) {
// 實際權(quán)限檢查邏輯,需要根據(jù)用戶的角色和權(quán)限信息以及 requiredAuthority 判斷
// 這里只是一個示例,實際邏輯可能更復(fù)雜
return user.getRoles().contains(requiredAuthority) || user.getPermissions().contains(requiredAuthority);
}
private String getUserIdFromRedis() {
// 實際從Redis中獲取用戶ID的邏輯
// redisutils.getkey...
return "user123"; // 示例
}
}最后在需要加權(quán)限訪問的接口加上這個注解,寫上訪問這個接口所需要的角色和權(quán)限就行了
@RestController
public class MyController {
@DbmAuthority("功能:角色:權(quán)限") //訪問這個功能登錄用戶所需要的角色和權(quán)限
@GetMapping("/protectedEndpoint")
public ResponseEntity<String> protectedEndpoint() {
// 執(zhí)行需要權(quán)限驗證的操作
return ResponseEntity.ok("訪問成功");
}
}
這樣一個簡單的權(quán)限認證就實現(xiàn)了
到此這篇關(guān)于Java輕松實現(xiàn)權(quán)限認證管理的示例代碼的文章就介紹到這了,更多相關(guān)Java權(quán)限認證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+Mybatis項目使用Redis做Mybatis的二級緩存的方法
本篇文章主要介紹了SpringBoot+Mybatis項目使用Redis做Mybatis的二級緩存的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12
Mybatis?plus多租戶方案的實戰(zhàn)踩坑記錄
MybaitsPlus多租戶處理器是一個對于多租戶問題的解決方案,下面這篇文章主要給大家介紹了關(guān)于Mybatis?plus多租戶方案踩坑的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2021-12-12
Java異常詳解_動力節(jié)點Java學(xué)院整理
異常是Java語言中的一部分,它代表程序中由各種原因引起的“不正?!币蛩?。下面通過本文給大家介紹java異常的相關(guān)知識,感興趣的朋友一起看看吧2017-06-06
Spring Boot 注解 @SpringBootApplication的使用詳解
@SpringBootApplication 是 Spring Boot 提供的一個注解,通常用于啟動類(主類)上,它是三個注解的組合,本文給大家介紹Spring Boot 注解 @SpringBootApplication的相關(guān)知識,感興趣的朋友一起看看吧2025-05-05

