最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java輕松實(shí)現(xiàn)權(quán)限認(rèn)證管理的示例代碼

 更新時(shí)間:2023年12月17日 16:19:04   作者:大白貓~  
我們?cè)趯?shí)際開發(fā)中經(jīng)常會(huì)進(jìn)行權(quán)限認(rèn)證管理,給不同的人加上對(duì)應(yīng)的角色和權(quán)限,本文將實(shí)現(xiàn)一個(gè)簡(jiǎn)易的權(quán)限驗(yàn)證管理系統(tǒng),感興趣的小伙伴可以了解下

我們?cè)趯?shí)際開發(fā)中經(jīng)常會(huì)進(jìn)行權(quán)限認(rèn)證管理,給不同的人加上對(duì)應(yīng)的角色和權(quán)限,對(duì)于不同的登錄用戶要求根據(jù)他們所扮演的的角色和擁有的權(quán)限去訪問指定的接口,那具體該怎么實(shí)現(xiàn)呢

我這邊參考了各個(gè)框架的實(shí)現(xiàn)邏輯,發(fā)現(xiàn)還是蠻簡(jiǎn)單的,今天就實(shí)現(xiàn)一個(gè)簡(jiǎn)易的權(quán)限驗(yàn)證管理系統(tǒng)

首先需要角色和權(quán)限表

角色表:字段為用戶唯一標(biāo)識(shí)(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)限
  • 在每一個(gè)接口寫一個(gè)aop切面,在切面中判斷該登錄用戶是否含有對(duì)應(yīng)接口所需要的角色和權(quán)限

1.使用aop切面先加上依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2. 接下來創(chuàng)建權(quán)限注解(注解大致就是一個(gè)類,包含一些屬性,主要還是切面的邏輯)

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DbmAuthority {
    String value(); // 權(quán)限字符串,格式為"功能:角色:權(quán)限"
}

3.創(chuàng)建一個(gè)簡(jiǎn)單的用戶權(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查詢?cè)摻巧慕巧蜋?quán)限

public interface UserRepository {
    User getUserById(String userId);
}

實(shí)現(xiàn)這個(gè)接口

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.在注解實(shí)現(xiàn)aop邏輯,本質(zhì)和上面說的一樣,很簡(jiǎn)單

@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);
        
        // 獲取注解類對(duì)象
        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) {
        // 實(shí)際權(quán)限檢查邏輯,需要根據(jù)用戶的角色和權(quán)限信息以及 requiredAuthority 判斷
        // 這里只是一個(gè)示例,實(shí)際邏輯可能更復(fù)雜
        return user.getRoles().contains(requiredAuthority) || user.getPermissions().contains(requiredAuthority);
    }
 
    private String getUserIdFromRedis() {
        // 實(shí)際從Redis中獲取用戶ID的邏輯
        // redisutils.getkey...
        return "user123"; // 示例
    }
}

最后在需要加權(quán)限訪問的接口加上這個(gè)注解,寫上訪問這個(gè)接口所需要的角色和權(quán)限就行了

@RestController
public class MyController {
 
    @DbmAuthority("功能:角色:權(quán)限") //訪問這個(gè)功能登錄用戶所需要的角色和權(quán)限
    @GetMapping("/protectedEndpoint")
    public ResponseEntity<String> protectedEndpoint() {
        // 執(zhí)行需要權(quán)限驗(yàn)證的操作
        return ResponseEntity.ok("訪問成功");
    }
}

這樣一個(gè)簡(jiǎn)單的權(quán)限認(rèn)證就實(shí)現(xiàn)了

到此這篇關(guān)于Java輕松實(shí)現(xiàn)權(quán)限認(rèn)證管理的示例代碼的文章就介紹到這了,更多相關(guān)Java權(quán)限認(rèn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中檢查字符串是否以特定字符結(jié)尾

    Java中檢查字符串是否以特定字符結(jié)尾

    這篇文章主要介紹了Java中檢查字符串是否以特定字符結(jié)尾,文章圍繞主題展開字符串匹配問題,具有一定的參考價(jià)值需要的小伙伴可以參考一下
    2022-06-06
  • java實(shí)現(xiàn)單鏈表、雙向鏈表

    java實(shí)現(xiàn)單鏈表、雙向鏈表

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)單鏈表、雙向鏈表的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • SpringBoot+Mybatis項(xiàng)目使用Redis做Mybatis的二級(jí)緩存的方法

    SpringBoot+Mybatis項(xiàng)目使用Redis做Mybatis的二級(jí)緩存的方法

    本篇文章主要介紹了SpringBoot+Mybatis項(xiàng)目使用Redis做Mybatis的二級(jí)緩存的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java中怎樣使用JSON進(jìn)行文件解析

    Java中怎樣使用JSON進(jìn)行文件解析

    這篇文章主要介紹了Java中怎樣使用JSON進(jìn)行文件解析問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 初識(shí)Java設(shè)計(jì)模式適配器模式

    初識(shí)Java設(shè)計(jì)模式適配器模式

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式適配器模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • java定義受限制的類型參數(shù)操作

    java定義受限制的類型參數(shù)操作

    這篇文章主要介紹了java定義受限制的類型參數(shù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Mybatis?plus多租戶方案的實(shí)戰(zhàn)踩坑記錄

    Mybatis?plus多租戶方案的實(shí)戰(zhàn)踩坑記錄

    MybaitsPlus多租戶處理器是一個(gè)對(duì)于多租戶問題的解決方案,下面這篇文章主要給大家介紹了關(guān)于Mybatis?plus多租戶方案踩坑的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-12-12
  • Java異常詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java異常詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    異常是Java語言中的一部分,它代表程序中由各種原因引起的“不正常”因素。下面通過本文給大家介紹java異常的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2017-06-06
  • IDEA中配置文件格式為UTF-8的操作方法

    IDEA中配置文件格式為UTF-8的操作方法

    這篇文章主要介紹了IDEA中配置文件格式為UTF-8的操作方法,第一個(gè)需要設(shè)置文件編碼格式的位置,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-10-10
  • Spring Boot 注解 @SpringBootApplication的使用詳解

    Spring Boot 注解 @SpringBootApplication的使用詳解

    @SpringBootApplication 是 Spring Boot 提供的一個(gè)注解,通常用于啟動(dòng)類(主類)上,它是三個(gè)注解的組合,本文給大家介紹Spring Boot 注解 @SpringBootApplication的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2025-05-05

最新評(píng)論

乌鲁木齐市| 凌源市| 阳江市| 石嘴山市| 女性| 山阴县| 合作市| 顺义区| 通州区| 昭通市| 自贡市| 建德市| 巴林左旗| 杂多县| 宁蒗| 南宁市| 平远县| 卢氏县| 潢川县| 屯留县| 英德市| 满洲里市| 邛崃市| 鸡东县| 康定县| 龙游县| 县级市| 嘉祥县| 普兰县| 苏尼特右旗| 普定县| 育儿| 正阳县| 昌宁县| 沙田区| 富裕县| 兰考县| 九龙县| 墨竹工卡县| 介休市| 南靖县|