亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringSecurity+jwt+captcha登錄認證授權流程總結

 更新時間:2024年11月15日 14:27:08   作者:慢生活的人。  
本文介紹了SpringSecurity、JWT和驗證碼在Spring Boot 3.2.0中的應用,包括登錄認證和授權流程的詳細步驟,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧

SpringSecurity+jwt+captcha登錄認證授權總結

版本信息:

springboot 3.2.0、springSecurity 6.2.0、mybatis-plus 3.5.5

認證授權思路和流程: 未攜帶token,訪問登錄接口:

1、用戶登錄攜帶賬號密碼

2、請求到達自定義Filter,自定義Filter(如JwtAuthenticationTokenFilter)繼承OncePerRequestFilter(此Filter只會進行一次過濾,在請求返回時,不會再進行調用),在SecurityConfig中配置,將自定義Filter添加到過濾器鏈中并加在UsernamePasswordAuthenticationFilter過濾器之前

3、自定義Filter邏輯

3.1、查詢到用戶未攜帶token,直接放行,進入到后面認證流程

3.2、將用戶信息封裝成Authentication對象,調用authticate()方法進行驗證,一直到DaoAuthenticationProvider中,會調用UserDetailService的loadUserByUserName()方法;自定義UserDetailServiceImpl繼承UserDetailService接口;重寫其loadUserByUserName()方法;查到用戶后,封裝成UserDetail對象返回

4、調用passwordEncoder的驗證方法進行用戶信息的認證(一般使用BCryptPasswordEncoder,創(chuàng)建此Bean并放入容器中)

5、認證通過后,使用JWT創(chuàng)建token并放到redis中;返回token到前端

攜帶token訪問:

1、請求到達自定義Filter中,獲取token,先驗證token的正確性,從token中獲取到userId,根據userId從redis中獲取用戶信息,將用戶信息封裝成Authentication對象,放進SecurityContextHolder中,后面的過濾器會在SecurityContextHolder中獲取用戶的信息

2、請求到達FilterSecurityInterceptor,在springSecurity中默認使用FilterSecurityInterceptor來進行權限校驗;FilterSecurityInterceptor會從SecurityContextHolder中獲取Authentication,然后獲取其中的權限信息,判斷當前用戶是否擁有當前資源的訪問權限;

3、通過權限判斷,獲取資源返回給前端;

登錄認證流程圖:

基于RBAC的授權控制: RBAC概念:

Role-Based Access Control,中文意思是:基于角色(Role)的訪問控制。這是一種廣泛應用于計算機系統(tǒng)和網絡安全領域的訪問控制模型。

簡單來說,就是通過將權限分配給角色,再將角色分配給用戶,來實現(xiàn)對系統(tǒng)資源的訪問控制。一個用戶擁有若干角色,每一個角色擁有若干權限。這樣,就構造成“用戶-角色-權限”的授權模型。在這種模型中,用戶與角色之間,角色與權限之間,一般是多對多的關系

模型:

在數(shù)據庫中主要體現(xiàn)用戶表角色表、菜單表、用戶角色關聯(lián)表、角色菜單關聯(lián)表五個模型:

CREATE TABLE "mySchema"."t_user"
(
"id" INT IDENTITY(1, 1) NOT NULL,
"username" VARCHAR(100) NOT NULL,
"password" VARCHAR(100) NOT NULL,
"email" VARCHAR(100) NOT NULL,
"phone" VARCHAR(100),
UNIQUE("id"),
UNIQUE("username"),
UNIQUE("email"),
UNIQUE("phone"),
NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "mySchema"."t_user" IS '用戶表';
COMMENT ON COLUMN "mySchema"."t_user"."id" IS '用戶id';
COMMENT ON COLUMN "mySchema"."t_user"."username" IS '用戶名';
COMMENT ON COLUMN "mySchema"."t_user"."password" IS '密碼';
COMMENT ON COLUMN "mySchema"."t_user"."email" IS '用戶郵箱';
COMMENT ON COLUMN "mySchema"."t_user"."phone" IS '電話';
CREATE TABLE "mySchema"."sys_role"
(
"id" BIGINT IDENTITY(1, 1) NOT NULL,
"name" VARCHAR(128) DEFAULT NULL,
"role_key" VARCHAR(100) DEFAULT NULL,
"status" CHAR(1) DEFAULT '0',
"del_flag" INT DEFAULT 0,
"create_by" BIGINT DEFAULT NULL,
"create_time" DATETIME(6) DEFAULT NULL,
"update_by" BIGINT DEFAULT NULL,
"update_time" DATETIME(6) DEFAULT NULL,
"remark" VARCHAR(500) DEFAULT NULL,
NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "mySchema"."sys_role" IS '角色表';
COMMENT ON COLUMN "mySchema"."sys_role"."id" IS '角色id';
COMMENT ON COLUMN "mySchema"."sys_role"."name" IS '角色名稱';
COMMENT ON COLUMN "mySchema"."sys_role"."role_key" IS '角色權限字符串';
COMMENT ON COLUMN "mySchema"."sys_role"."status" IS '角色狀態(tài)(0正常, 1停用)';
COMMENT ON COLUMN "mySchema"."sys_role"."del_flag" IS '刪除標志(0未刪除,1已刪除)';
COMMENT ON COLUMN "mySchema"."sys_role"."remark" IS '備注';
CREATE TABLE "mySchema"."sys_menu"
(
"id" BIGINT IDENTITY(2, 1) NOT NULL,
"menu_name" VARCHAR(64) DEFAULT 'NULL' NOT NULL,
"path" VARCHAR(200) DEFAULT NULL,
"component" VARCHAR(50) DEFAULT NULL,
"visible" CHAR(1) DEFAULT '0',
"status" CHAR(1) DEFAULT '0',
"perms" VARCHAR(100) DEFAULT NULL,
"icon" VARCHAR(100) DEFAULT '#',
"create_by" BIGINT DEFAULT NULL,
"create_time" DATETIME(6) DEFAULT CURRENT_TIMESTAMP,
"update_by" BIGINT DEFAULT NULL,
"update_time" DATETIME(6) DEFAULT CURRENT_TIMESTAMP,
"delete_f1ag" INT DEFAULT 0,
"remark" VARCHAR(500) DEFAULT NULL,
UNIQUE("id"),
NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "mySchema"."sys_menu" IS '菜單表';
COMMENT ON COLUMN "mySchema"."sys_menu"."menu_name" IS '菜單名';
COMMENT ON COLUMN "mySchema"."sys_menu"."path" IS '路由地址';
COMMENT ON COLUMN "mySchema"."sys_menu"."component" IS '組件路徑';
COMMENT ON COLUMN "mySchema"."sys_menu"."visible" IS '菜單狀態(tài)(0顯示1隱藏)';
COMMENT ON COLUMN "mySchema"."sys_menu"."status" IS '菜單狀態(tài)(0正常1停用)';
COMMENT ON COLUMN "mySchema"."sys_menu"."perms" IS '權限標識';
COMMENT ON COLUMN "mySchema"."sys_menu"."icon" IS '菜單圖標';
COMMENT ON COLUMN "mySchema"."sys_menu"."delete_f1ag" IS '是否刪除(0未刪除1已刪除)';
COMMENT ON COLUMN "mySchema"."sys_menu"."remark" IS '備注';
CREATE TABLE "mySchema"."sys_user_role"
(
"user_id" BIGINT DEFAULT 0 NOT NULL,
"role_id" BIGINT DEFAULT 0 NOT NULL,
NOT CLUSTER PRIMARY KEY("user_id", "role_id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "mySchema"."sys_user_role" IS '用戶角色表';
COMMENT ON COLUMN "mySchema"."sys_user_role"."user_id" IS '用戶id';
COMMENT ON COLUMN "mySchema"."sys_user_role"."role_id" IS '角色id';
CREATE TABLE "mySchema"."sys_role_menu"
(
"role_id" BIGINT DEFAULT 0 NOT NULL,
"menu_id" BIGINT DEFAULT 0 NOT NULL,
NOT CLUSTER PRIMARY KEY("role_id", "menu_id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "mySchema"."sys_role_menu" IS '角色菜單關聯(lián)表';
COMMENT ON COLUMN "mySchema"."sys_role_menu"."role_id" IS '角色id';
COMMENT ON COLUMN "mySchema"."sys_role_menu"."menu_id" IS '菜單id';

權限流程:

用戶表、角色表、菜單表、部門表、用戶角色關聯(lián)表、角色菜單關聯(lián)表;數(shù)據權限分為5種:個人、全部、本部門、指定部門、本部門及以下
鏈路:

1、用戶注冊,指定部門;創(chuàng)建角色,給角色賦菜單權限、數(shù)據權限;給用戶賦予角色;
2、用戶登錄,通過用戶的所有角色,獲取所有的菜單權限和最大數(shù)據權限;菜單數(shù)據直接展示在頁面;所有數(shù)據都有創(chuàng)建人,則數(shù)據的部門id是創(chuàng)建人的部門id;
3、在訪問數(shù)據接口時,通過mybatis的攔截器對用戶的數(shù)據進行過濾(拼接sql),返回給前端;

captcha圖片驗證碼:

實現(xiàn)思路:

1、圖片驗證碼獲取,并將驗證碼驗證碼存放起來(單機應用可放在session中,分布式應用放在redis中)

2、當用戶登錄時,攜帶驗證碼以及驗證碼的key,進入到后端從redis中獲取值進行驗證

<!-- 谷歌kaptcha驗證碼依賴 -->
<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>

代碼思路:

1、生成驗證碼

public Result<CaptchaVO> getCaptcha() throws IOException {
    // 生成文字驗證碼
    String content = defaultKaptcha.createText();
    // 生成圖片驗證碼
    ByteArrayOutputStream outputStream = null;
    BufferedImage image = defaultKaptcha.createImage(content);
    outputStream = new ByteArrayOutputStream();
    ImageIO.write(image, "jpg", outputStream);
    // 對字節(jié)數(shù)組Base64編碼
    String str = "data:image/jpeg;base64,";
    String base64Img = str + Base64.getEncoder().encodeToString(outputStream.toByteArray()).replace("\n", "").replace("\r", "");
    CaptchaVO captchaVO = captchaService.cacheCaptcha(content);
    captchaVO.setBase64Img(base64Img);
    return Result.success(captchaVO);
}

2、存儲驗證碼

@Service
public class CaptchaService {
    private Long timeout = 300L;
    @Autowired
    private RedisUtils redisUtils;
    private final String CAPTCHA_KEY_PREFIX = "captcha:verification:";
    public CaptchaVO cacheCaptcha(String captcha){
        //生成一個隨機標識符
        String randomStr = UUID.randomUUID().toString();
        //緩存驗證碼并設置過期時間
        String captchaKey = CAPTCHA_KEY_PREFIX.concat(randomStr);
        redisUtils.set(captchaKey, captcha, timeout, TimeUnit.SECONDS);
        CaptchaVO captchaVO = new CaptchaVO();
        captchaVO.setCaptchaKey(captchaKey);
        captchaVO.setExpire(timeout);
        captchaVO.setCaptcha(captcha);
        return captchaVO;
    }
}

3、校驗驗證碼

Object captcha = redisUtils.get(reqVO.getCaptchaKey());
if (Objects.isNull(captcha)) {
    return "驗證碼已過期";
}
if (!captcha.equals(reqVO.getCaptcha())) {
    return "驗證碼錯誤";
}

到此這篇關于SpringSecurity+jwt+captcha登錄認證授權總結的文章就介紹到這了,更多相關SpringSecurity jwt captcha認證授權內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Spring Boot中使用AOP統(tǒng)一處理Web請求日志

    詳解Spring Boot中使用AOP統(tǒng)一處理Web請求日志

    本篇文章主要介紹了詳解Spring Boot中使用AOP統(tǒng)一處理Web請求日志,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java工程mybatis實現(xiàn)多表查詢過程詳解

    Java工程mybatis實現(xiàn)多表查詢過程詳解

    這篇文章主要介紹了Java工程mybatis實現(xiàn)多表查詢過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Java實現(xiàn)簡單的學生教師管理系統(tǒng)

    Java實現(xiàn)簡單的學生教師管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單的學生教師管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • MyBatis-Plus中如何使用ResultMap的方法示例

    MyBatis-Plus中如何使用ResultMap的方法示例

    本文主要介紹了MyBatis-Plus中如何使用ResultMap,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 使用Spring的注解方式實現(xiàn)AOP實例

    使用Spring的注解方式實現(xiàn)AOP實例

    本篇文章主要介紹了使用Spring的注解方式實現(xiàn)AOP實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Spring?Security過濾器鏈加載執(zhí)行流程源碼解析

    Spring?Security過濾器鏈加載執(zhí)行流程源碼解析

    Spring?Boot?對于?Spring?Security?提供了自動化配置方案,可以使用更少的配置來使用?Spring?Security。那么這個過濾器鏈是怎么加載和實現(xiàn)攔截的呢,對Spring?Security過濾器鏈加載執(zhí)行流程感興趣的朋友一起看看吧
    2021-12-12
  • springBoot2.6.2自動裝配之注解源碼解析

    springBoot2.6.2自動裝配之注解源碼解析

    對于springboot個人認為它就是整合了各種組件,然后提供對應的自動裝配和啟動器(starter),基于這個流程去實現(xiàn)一個定義的裝配組件,下面這篇文章主要給大家介紹了關于springBoot2.6.2自動裝配之注解源碼解析的相關資料,需要的朋友可以參考下
    2022-01-01
  • Java的PriorityBlockingQueue優(yōu)先級阻塞隊列代碼實例

    Java的PriorityBlockingQueue優(yōu)先級阻塞隊列代碼實例

    這篇文章主要介紹了Java的PriorityBlockingQueue優(yōu)先級阻塞隊列代碼實例,PriorityBlockingQueue顧名思義是帶有優(yōu)先級的阻塞隊列,為了實現(xiàn)按優(yōu)先級彈出數(shù)據,存入其中的對象必須實現(xiàn)comparable接口自定義排序方法,需要的朋友可以參考下
    2023-12-12
  • 詳解Java的Spring框架中的注解的用法

    詳解Java的Spring框架中的注解的用法

    這篇文章主要介紹了Java的Spring框架中的注解的用法,包括對Java bean的定義的作用介紹,需要的朋友可以參考下
    2015-11-11
  • Java繪圖庫JFreeChart的使用教程

    Java繪圖庫JFreeChart的使用教程

    圖表是一種以簡單方式顯示信息的圖形,JFreeChart允許創(chuàng)建各種交互式和非交互式圖表,本文主要介紹了Java繪圖庫JFreeChart的使用教程,感興趣的可以了解一下
    2023-09-09

最新評論