欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java輕松實現(xiàn)權限認證管理的示例代碼

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

我們在實際開發(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 boot如何使用POI讀取Excel文件

    spring boot如何使用POI讀取Excel文件

    本文主要介紹使用POI進行Excel文件的相關操作,涉及讀取文件,獲取sheet表格,對單元格內容進行讀寫操作,以及合并單元格的操作
    2021-08-08
  • Java多線程實戰(zhàn)之交叉打印的兩種方法

    Java多線程實戰(zhàn)之交叉打印的兩種方法

    今天小編就為大家分享一篇關于Java多線程實戰(zhàn)之交叉打印的兩種方法,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • ocp開閉原則_動力節(jié)點Java學院整理

    ocp開閉原則_動力節(jié)點Java學院整理

    這篇文章主要為大家詳細介紹了ocp開閉原則的相關資料,ocp開閉原則指導我們如何建立一個穩(wěn)定的、靈活的系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Spring?Security權限想要細化到按鈕實現(xiàn)示例

    Spring?Security權限想要細化到按鈕實現(xiàn)示例

    這篇文章主要為大家介紹了Spring?Security權限想要細化到按鈕實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Java基礎之查找文本特定內容后進行修改

    Java基礎之查找文本特定內容后進行修改

    這篇文章主要介紹了Java基礎之查找文本特定內容后進行修改,文中有非常詳細的代碼示例,對正在學習java基礎的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • SpringBoot整合MongoDB實現(xiàn)文檔存儲功能

    SpringBoot整合MongoDB實現(xiàn)文檔存儲功能

    MongoDB是可以應用于各種規(guī)模的企業(yè)、各個行業(yè)以及各類應用程序的開源數(shù)據庫,本文將結合MongoDB和SpringBoot實現(xiàn)文檔存儲功能,需要的可以參考下
    2024-12-12
  • 通過Java代碼技巧改善性能

    通過Java代碼技巧改善性能

    在本篇文章里小編給大家分享了關于通過Java代碼技巧改善性能的相關知識點,需要的朋友們參考下。
    2019-05-05
  • JAVA Future類的使用詳解

    JAVA Future類的使用詳解

    這篇文章主要介紹了JAVA Future類的使用詳解,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-04-04
  • SpringBoot監(jiān)控模塊Actuator的用法詳解

    SpringBoot監(jiān)控模塊Actuator的用法詳解

    Spring?Boot?Actuator?是?Spring?Boot?自帶的一個功能模塊,提供了一組已經開箱即用的生產環(huán)境下常用的特性和服務,比如應用程序的健康檢查、信息暴露、度量收集、日志記錄等,本文將給大家詳細SpringBoot監(jiān)控模塊Actuator的用法
    2023-06-06
  • java數(shù)據結構與算法之冒泡排序詳解

    java數(shù)據結構與算法之冒泡排序詳解

    這篇文章主要介紹了java數(shù)據結構與算法之冒泡排序,結合實例形式詳細分析了java冒泡排序的原理、實現(xiàn)技巧與相關注意事項,需要的朋友可以參考下
    2017-05-05

最新評論