国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring boot框架 JWT實現(xiàn)用戶賬戶密碼登錄驗證

這篇具有很好參考價值的文章主要介紹了Spring boot框架 JWT實現(xiàn)用戶賬戶密碼登錄驗證。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

1、JWT定義

1、1 JWT工作流程

1、2 JWT優(yōu)點

2、添加依賴項到pom.xml?

3、創(chuàng)建用戶實體類

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

5、登錄請求處理

6、生成JWT


1、JWT定義

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

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

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

1、1 JWT工作流程

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

1、2 JWT優(yōu)點

? ?優(yōu)點包括:

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

2、添加依賴項到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>

Spring boot框架 JWT實現(xiàn)用戶賬戶密碼登錄驗證

3、創(chuàng)建用戶實體類

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

如下:

Spring boot框架 JWT實現(xiàn)用戶賬戶密碼登錄驗證

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

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

    public List<UserEntity> findAllService() {
        return userMapper.findAllUser();
    }

    public ResultResponse login(String name,String password) {
        UserEntity user=userMapper.checkPassword(name,password);
        if(user != null){
            //不等于null就開始頒發(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("用戶信息獲取成功",map));
        }
        return ResultResponse.returnToken(ResultResponse.fail("用戶已經(jīng)被禁用",userinfo));
    }

5、登錄請求處理

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

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

6、生成JWT

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



@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è)置跨域訪問的響應(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合法性驗證
                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ù)庫中查詢用戶角色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é)點權(quán)限:"+path);
                } else {
                    String jsonString = JSON.toJSONString(ResultResponse.illegalToken());
                    returnJson(response,jsonString);
                    System.out.println("不擁有此節(jié)點權(quán)限:"+path);
                    return false;
                }
                return true;
            }


            @Override
            public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//                System.out.println("請求處理完畢,但還沒有進(jìn)行視圖渲染");
            }

            @Override
            public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//                System.out.println("整個請求處理完成,視圖已渲染完畢");
            }
        }).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;
    }

}

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

,結(jié)束!下課!文章來源地址http://www.zghlxwxcb.cn/news/detail-468897.html

到了這里,關(guān)于Spring boot框架 JWT實現(xiàn)用戶賬戶密碼登錄驗證的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包