API访问的JWT安全校验——springboot整合jwt

39 篇文章 20 订阅

环境搭建

1.导入依赖

        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.19.0</version>
        </dependency>

2.JWTUtil

public class JWTUtil {
    private static String TOKEN = "xie_hao";
    /**
     * 生成token
     *
     * @param map
     * @return
     */
    public static String getToken(Map<String, String> map) {
        JWTCreator.Builder builder = JWT.create();
        map.forEach((k, v) -> {
            builder.withClaim(k, v);
        });
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.MINUTE, 10);
        builder.withExpiresAt(instance.getTime());
        return builder.sign(Algorithm.HMAC256(TOKEN)).toString();
    }
    /**
     * 获取token中的payload
     *
     * @param token
     * @return
     */
    public static DecodedJWT verify(String token) {
        return JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
    }
}

2.JWTInterceptors

public class JWTInterceptors implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Map<String, Object> map = new HashMap<>();
        // 获取请求头中的令牌
        String token = request.getHeader("token");
        try {
            JWTUtil.verify(token);// 验证令牌
            return true;//直接放行
        } catch (SignatureVerificationException e) {
            e.printStackTrace();
            map.put("msg", "无效签名");
        } catch (TokenExpiredException e) {
            e.printStackTrace();
            map.put("msg", "令牌过期");
        } catch (AlgorithmMismatchException e) {
            e.printStackTrace();
            map.put("msg", "把算法不一致");
        } catch (Exception e) {
            e.printStackTrace();
            map.put("msg", "令牌无效");
        }
        map.put("state", false);
        // map响应到前端
        String json = new ObjectMapper().writeValueAsString(map);
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().println(json);
        return false;
    }
}

4.InterceptorsConfig

@Configuration
public class InterceptorsConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new JWTInterceptors())
                .addPathPatterns("/hao/**")// 需要拦截的接口  /** 全部接口
                .excludePathPatterns("/hao/userInfo/login"); // 可以放行的接口
    }
}

实现login()

service层

public UserInfo login(UserInfo user) {
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper
                .eq("username", user.getUsername())
                .eq("password", user.getPassword());
        UserInfo userInfo = mapper.selectOne(queryWrapper);
        if(userInfo!=null){
            return userInfo;
        }
        throw new RuntimeException("登录失败");
    }

controller层

@Controller
@RequestMapping("/hao/userInfo")
public class UserInfoController {
    @Resource
    private UserInfoService service;

    @GetMapping("/getuser")
    @ResponseBody
    public Object getuser(@RequestParam("id") Integer id) {
        return service.findUserById(id);
    }

    @GetMapping("/login")
    @ResponseBody
    public Map<String, Object> login(@RequestParam("name") String name, @RequestParam("password") String password) {
        Map<String, Object> map = new HashMap<String, Object>();
        UserInfo user = new UserInfo();
        user.setUsername(name);
        user.setPassword(password);
        try {
            UserInfo userLogin = service.login(user);
            Map<String, String> payload = new HashMap<>();
            payload.put("id", userLogin.getId().toString());
            payload.put("name", userLogin.getUsername());
            payload.put("password", userLogin.getPassword());
            // 生成JWT令牌
            String token = JWTUtil.getToken(payload);
            map.put("state", true);
            map.put("msg", "登录成功");
            map.put("token", token);
        } catch (Exception e) {
            map.put("state", false);
            map.put("msg", e.getMessage());
        }
        return map;
    }

}

接口测试

断言:
/hao/userInfo//login请求不需要携带token进行拦截校验,由服务器返回token
/hao/userInfo//getuser请求需要携带登录时服务器返回的token进行拦截校验,否则无法获得数据
测试:
在这里插入图片描述
http://localhost:8080/hao/userInfo/login?name=hao&password=123获得token返回,可以利用该token进行访问getuser接口。
在这里插入图片描述
上图为访问getuser接口但不在请求头中携带token的返回结果
在这里插入图片描述
在请求头中携带第一次登录时服务器返回的token,发现此时可以通过jwt安全验证,获得数据。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot整合JWT是一种常用的实现权限验证功能的方式。JWT(Json Web Token)是一种基于JSON的开放标准,用于在网络应用环境中传递声明。在SpringBoot项目中整合JWT,可以实现用户身份验证和访问控制的功能。 整合JWT的步骤如下: 1. 在项目的pom文件中添加JWT依赖。可以使用com.auth0的java-jwt库,具体的依赖配置如下: ```xml <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.4.0</version> </dependency> ``` 2. 创建用户实体类。可以使用@Data注解自动生成getter和setter方法,示例如下: ```java package com.example.manageserve.controller.dto; import lombok.Data; @Data public class UserDTO { private String username; private String password; private String nickname; private String token; } ``` 3. 将拦截器注入到SpringMVC。创建一个配置类,实现WebMvcConfigurer接口,并重写addInterceptors方法,如下所示: ```java package com.example.manageserve.config; import com.example.manageserve.config.interceptor.JwtInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors (InterceptorRegistry registry){ registry.addInterceptor(jwtInterceptor()) .addPathPatterns("/**") //拦截所有请求,通过判断token是否合法来决定是否需要登录 .excludePathPatterns("/user/login","/user/register"); } @Bean public JwtInterceptor jwtInterceptor(){ return new JwtInterceptor(); } } ``` 通过以上步骤,我们可以实现SpringBootJWT整合,实现了用户的登录和权限验证功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [xmljava系统源码-JWT-DEMO:SpringBoot整合JWT完成权限验证功能示例](https://download.csdn.net/download/weixin_38641764/19408331)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [springboot集成JWT](https://blog.csdn.net/weixin_67958017/article/details/128856282)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值