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

Spring?boot框架JWT實(shí)現(xiàn)用戶(hù)賬戶(hù)密碼登錄驗(yàn)證流程

 更新時(shí)間:2023年06月15日 14:26:14   作者:丘比特懲罰陸  
這篇文章主要介紹了Springboot框架JWT實(shí)現(xiàn)用戶(hù)賬戶(hù)密碼登錄驗(yàn)證,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1、JWT定義

JWT(JSON Web Token)是一種用于在網(wǎng)絡(luò)應(yīng)用間傳遞信息的安全傳輸方式。它是一種緊湊且自包含的方式,通過(guò)使用數(shù)字簽名來(lái)驗(yàn)證數(shù)據(jù)的完整性和真實(shí)性。

JWT由三部分組成,使用.進(jìn)行分隔:

  • Header(頭部):包含JWT的類(lèi)型(typ)和使用的簽名算法(alg)等信息。
  • Payload(負(fù)載):包含要傳輸?shù)臄?shù)據(jù),例如用戶(hù)身份信息、權(quán)限等。它是JWT的主要內(nèi)容,可以自定義添加其他需要的字段。
  • Signature(簽名):使用指定的算法對(duì)Header和Payload進(jìn)行簽名,以確保數(shù)據(jù)在傳輸過(guò)程中沒(méi)有被篡改。

1、1 JWT工作流程

  • 用戶(hù)使用有效的身份憑證(如用戶(hù)名和密碼)向服務(wù)器發(fā)送登錄請(qǐng)求。
  • 服務(wù)器驗(yàn)證用戶(hù)身份信息,如果驗(yàn)證通過(guò),生成一個(gè)JWT并將其返回給客戶(hù)端。
  • 客戶(hù)端在后續(xù)的請(qǐng)求中將JWT添加到請(qǐng)求的頭部、查詢(xún)參數(shù)或Cookie中進(jìn)行傳遞。
  • 服務(wù)器接收到請(qǐng)求后,使用密鑰驗(yàn)證JWT的簽名和完整性,并從中提取出有效的用戶(hù)信息和權(quán)限等數(shù)據(jù)進(jìn)行處理。
  • 如果JWT驗(yàn)證通過(guò),服務(wù)器處理請(qǐng)求并返回響應(yīng)給客戶(hù)端。

1、2 JWT優(yōu)點(diǎn)

   優(yōu)點(diǎn)包括:

  • 簡(jiǎn)單:JWT使用JSON格式存儲(chǔ)信息,易于理解和使用。
  • 自包含:JWT中攜帶了用戶(hù)的信息和權(quán)限等數(shù)據(jù),避免了頻繁查詢(xún)數(shù)據(jù)庫(kù)的開(kāi)銷(xiāo)。
  • 可擴(kuò)展:JWT的負(fù)載部分可以自定義添加需要的字段。
  • 跨平臺(tái)和語(yǔ)言支持:JWT在各種平臺(tái)和編程語(yǔ)言中都有對(duì)應(yīng)的實(shí)現(xiàn)和支持。
  • 無(wú)狀態(tài):JWT本身是無(wú)狀態(tài)的,服務(wù)器不需要保存用戶(hù)的會(huì)話(huà)信息,提高了可伸縮性。

2、添加依賴(lài)項(xiàng)到pom.xml 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt</artifactId>
  <version>0.9.1</version>
</dependency>

3、創(chuàng)建用戶(hù)實(shí)體類(lèi)

創(chuàng)建一個(gè)表示用戶(hù)的實(shí)體類(lèi),例如User,其中包含用戶(hù)名和密碼等屬性。

如下:

 4、實(shí)現(xiàn)認(rèn)證服務(wù)

創(chuàng)建一個(gè)類(lèi)實(shí)現(xiàn)Spring Security的UserDetailsService接口,用于加載用戶(hù)信息。在該類(lèi)中,根據(jù)用戶(hù)名查詢(xún)數(shù)據(jù)庫(kù),獲取用戶(hù)信息,包括密碼。

    public List<UserEntity> findAllService() {
        return userMapper.findAllUser();
    }
    public ResultResponse login(String name,String password) {
        UserEntity user=userMapper.checkPassword(name,password);
        if(user != null){
            //不等于null就開(kāi)始頒發(fā)jwt
            String token = jwtUtils.generateToken(name);
            System.out.println(token);
            return ResultResponse.returnToken(ResultResponse.success("頒發(fā)token成功",token));
        }
        return ResultResponse.illegalToken();
    }
    public ResultResponse info(String token) {
        String tokenString = token;
        String subject = JwtUtils.getSubject(tokenString);
        UserDTO userinfo=userMapper.getUserByUsername(subject);
        int status=userinfo.getStatus();
        if(status==1){
            String role=userinfo.getRoleName();
            Map<String, Object> map = new HashMap<>();
            String[] roles = {role};
            map.put("name", userinfo.getName());
            map.put("avatar", userinfo.getAvatar());
            map.put("roles", roles);
            return ResultResponse.returnToken(ResultResponse.success("用戶(hù)信息獲取成功",map));
        }
        return ResultResponse.returnToken(ResultResponse.fail("用戶(hù)已經(jīng)被禁用",userinfo));
    }

5、登錄請(qǐng)求處理

創(chuàng)建一個(gè)登錄請(qǐng)求處理的Controller,用于處理用戶(hù)登錄請(qǐng)求。在該Controller中,接收用戶(hù)名和密碼參數(shù),并進(jìn)行認(rèn)證。

    @CrossOrigin
    @PostMapping("/user/login")
    public ResultResponse login(@RequestBody UserEntity user) {
        String username = user.getUsername();
        String password = user.getPassword();
        // 生成JWT并返回給客戶(hù)端,用戶(hù)名和密碼正確就生成jwt
        return userService.login(username,password);
    }

6、生成JWT

在認(rèn)證成功后,使用JJWT庫(kù)生成JWT,并將JWT作為響應(yīng)返回給客戶(hù)端.

 
@Component
public class InterceptorConfig implements WebMvcConfigurer {
    private JdbcTemplate jdbcTemplate;
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HandlerInterceptor() {
            //給前端輸出json的方法
            private void returnJson(HttpServletResponse response, String json) throws Exception{
                PrintWriter writer = null;
                try {
                    writer = response.getWriter();
                    writer.write(json);
                } catch (IOException e) {
                } finally {
                    if (writer != null)
                        writer.close();
                }
            }
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                System.out.println("已經(jīng)進(jìn)入攔截器");
                // 設(shè)置跨域訪(fǎng)問(wèn)的響應(yīng)頭信息
                response.setHeader("Access-Control-Allow-Origin", "*");
                response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
                response.setHeader("Access-Control-Max-Age", "3600");
                response.setHeader("Access-Control-Allow-Headers", "Content-Type, X-Token");
                response.setCharacterEncoding("UTF-8");
                response.setContentType("text/html; charset=utf-8");
                // 獲取tokenHeader
                String tokenHeader = request.getHeader("x-token");
                System.out.println("前端傳入X-Token是============="+tokenHeader);
                // 進(jìn)行token合法性驗(yàn)證
                if(!JwtUtils.validateToken(tokenHeader)){
                    String jsonString = JSON.toJSONString(ResultResponse.illegalToken());
                    returnJson(response,jsonString);
                    System.out.println("未放行?。?!");
                    return false;
                }
                // 鑒權(quán)操作
                String path = request.getRequestURI();
                String sub = JwtUtils.getSubject(tokenHeader);
                System.out.println(path);
                // 從數(shù)據(jù)庫(kù)中查詢(xún)用戶(hù)角色id
                Integer roleId = jdbcTemplate.queryForObject("SELECT role FROM tskj_user WHERE name = ?", Integer.class, sub);
                String targets = jdbcTemplate.queryForObject("SELECT targets FROM tskj_role WHERE id = ?", String.class, roleId);
                String tarid = jdbcTemplate.queryForObject("SELECT id FROM tskj_target WHERE target = ? and status=1", String.class, path);
                if (targets.contains(tarid)) {
                    System.out.println("擁有此節(jié)點(diǎn)權(quán)限:"+path);
                } else {
                    String jsonString = JSON.toJSONString(ResultResponse.illegalToken());
                    returnJson(response,jsonString);
                    System.out.println("不擁有此節(jié)點(diǎn)權(quán)限:"+path);
                    return false;
                }
                return true;
            }
            @Override
            public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//                System.out.println("請(qǐng)求處理完畢,但還沒(méi)有進(jìn)行視圖渲染");
            }
            @Override
            public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//                System.out.println("整個(gè)請(qǐng)求處理完成,視圖已渲染完畢");
            }
        }).addPathPatterns("/**/*").excludePathPatterns("/tskj/user/login","/static/*","/tskj/setting/getSetData","/tskj/user/logout");
        System.out.println("攔截器已經(jīng)初始化并添加成功");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
    public InterceptorConfig(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
}

以上步驟是一個(gè)基本的實(shí)現(xiàn)流程。

到此這篇關(guān)于Spring boot框架 JWT實(shí)現(xiàn)用戶(hù)賬戶(hù)密碼登錄驗(yàn)證的文章就介紹到這了,更多相關(guān)Spring boot JWT用戶(hù)登錄驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Netty分布式ByteBuf使用的底層實(shí)現(xiàn)方式源碼解析

    Netty分布式ByteBuf使用的底層實(shí)現(xiàn)方式源碼解析

    這篇文章主要為大家介紹了Netty分布式ByteBuf使用底層實(shí)現(xiàn)方式源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • 簡(jiǎn)單的java讀取文件示例分享

    簡(jiǎn)單的java讀取文件示例分享

    這篇文章主要介紹了java讀取txt文件內(nèi)容,示例很簡(jiǎn)單,代碼里有注釋?zhuān)蠹抑苯涌创a吧
    2014-01-01
  • Java實(shí)現(xiàn)計(jì)算器的代碼

    Java實(shí)現(xiàn)計(jì)算器的代碼

    這篇文章主要為大家介紹了Java實(shí)現(xiàn)計(jì)算器的詳細(xì)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Hadoop組件簡(jiǎn)介

    Hadoop組件簡(jiǎn)介

    Hadoop作為一種分布式基礎(chǔ)架構(gòu),可以使用戶(hù)在不了解分布式底層細(xì)節(jié)的情況下,開(kāi)發(fā)分布式程序。接下來(lái)通過(guò)本文給大家分享Hadoop組件簡(jiǎn)介,感興趣的朋友一起看看吧
    2017-09-09
  • spring循環(huán)依賴(lài)策略解析

    spring循環(huán)依賴(lài)策略解析

    這篇文章主要為大家詳細(xì)介紹了spring循環(huán)依賴(lài)策略,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • SpringMVC集成Swagger實(shí)例代碼

    SpringMVC集成Swagger實(shí)例代碼

    本篇文章主要介紹了SpringMVC集成Swagger實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • java集合——Java中的equals和hashCode方法詳解

    java集合——Java中的equals和hashCode方法詳解

    本篇文章詳細(xì)介紹了Java中的equals和hashCode方法詳解,Object 類(lèi)是所有類(lèi)的父類(lèi),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2016-10-10
  • java如何獲取文件或目錄的路徑

    java如何獲取文件或目錄的路徑

    介紹了幾種獲取項(xiàng)目路徑的方法,包括System.getProperty("user.dir")、類(lèi)加載器getResource()、file.getPath()和file.getCanonicalPath(),并比較了它們的優(yōu)缺點(diǎn),推薦使用System.getProperty("user.dir")更為方便
    2025-11-11
  • JAVA進(jìn)階篇之詳細(xì)了解File文件的常用API

    JAVA進(jìn)階篇之詳細(xì)了解File文件的常用API

    這篇文章主要給大家介紹了關(guān)于JAVA進(jìn)階篇之詳細(xì)了解File文件的常用API的相關(guān)資料,File用于表示文件系統(tǒng)中的一個(gè)文件或目錄,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • java微信公眾號(hào)發(fā)送消息模板

    java微信公眾號(hào)發(fā)送消息模板

    這篇文章主要為大家詳細(xì)介紹了java微信公眾號(hào)發(fā)送消息模板,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08

最新評(píng)論

射阳县| 清远市| 茂名市| 商丘市| 东方市| 柳州市| 淄博市| 子洲县| 楚雄市| 通城县| 峨眉山市| 芜湖市| 松原市| 德惠市| 朔州市| 吐鲁番市| 拜城县| 商丘市| 五寨县| 县级市| 长丰县| 三江| 新宁县| 磴口县| 峨眉山市| 济宁市| 荃湾区| 昆明市| 扎兰屯市| 那曲县| 永川市| 英超| 新兴县| 伽师县| 三门县| 神农架林区| 南澳县| 云霄县| 鹤峰县| 稻城县| 鲜城|