SpringBoot、uniapp项目整合token验证

SpringBoot、uniapp项目整合token验证

由于本小项目前端uniapp使用token进行验证,所以在写后端的时候我也学习了相关token的使用方法。

什么是token?

简单理解就是token是在服务端生成的一个字符串,传给客户端作为请求携带的令牌。当用户第一次登录的时候,服务器就会生成一个token返回给客户端,之后客户端的请求都会携带这个令牌,服务器解析会拦截这些请求并判断令牌是否有效,如果没有token令牌或者失效就会拦截下来。

前端配置

首先在前端配置好网格拦截器,对于请求都带上token以便后端进行身份验证,前端使用的是uView框架,安装并配置好uView之后,下面就是interceptor拦截器,在mian.js中引入

module.exports = (vm) => {
      // 初始化请求配置
      uni.$u.http.setConfig((config) => {
          /* config 为默认全局配置*/
          config.baseURL = 'http://192.168.194.251'; /* 根域名 */
          return config
      })
  	
  	// 请求拦截,使请求携带token
  	uni.$u.http.interceptors.request.use((config) => { 
      const token = uni.getStorageSync("token");
      config.header.Authorization = "Bearer " + token;
      config.header.Accept = "application/json";
      return config;
  	})
  	
  	//响应拦截
  	uni.$u.http.interceptors.response.use((response) => {
      console.log(response)
      if (response.statusCode != 200) {
        console.log('响应拦截成功!=200')
      	return response;
      } else {
        console.log('响应拦截返回')
      	return response;
      }
    }, (response) => { 
        console.log('这是响应错误的返回')
        console.log(response)
    		return response
    	})
  }
//引入拦截器
require('@/common/http.interceptor.js')(app)

后端配置

pom引入
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>
application.yml
audience:
  clientId: 098f6bcd4621d373cade4e832627b4f6
   # 密钥, 经过Base64加密, 可自行替换。Base64加解密工具:http://tool.chinaz.com/Tools/Base64.aspx
  base64Secret: eXViYW9aSk5VU0NFTkVSWVYxLjA=
  # JWT的签发主体,存入issuer
  iss: issued by yubao
  # 过期时间毫秒
  expiresSecond: 604800000
Audience

新建配置信息的实体类,以便获取JWT配置:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@ConfigurationProperties(prefix = "audience")
@Component
public class Audience {
    //代表这个JWT的接收对象,存入audience
    private String aud;
    private String base64Secret;
    //JWT的签发主体,存入issuer
    private String iss;
    private int expiresSecond;

}
创建JWT工具类
package com.yubao.zjnu_demo.utils;


import com.yubao.zjnu_demo.common.CustomException;
import com.yubao.zjnu_demo.entity.Audience;
import io.jsonwebtoken.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.Base64Utils;

import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Base64;
import java.util.Date;
@Slf4j
public class JwtTokenUtil {

    public static final String AUTH_HEADER_KEY = "Authorization";

    public static final String TOKEN_PREFIX = "Bearer ";

    /**
     * 解析jwt
     *
     * @param jsonWebToken
     * @param base64Security
     * @return
     */
    public static Claims parseJWT(String jsonWebToken, String base64Security) {
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(DatatypeConverter.parseBase64Binary(base64Security))
                    .parseClaimsJws(jsonWebToken).getBody();
            return claims;
        } catch (ExpiredJwtException eje) {
            log.error("===== Token过期 =====", eje);
            throw new CustomException("PERMISSION_TOKEN_EXPIRED");
        } catch (Exception e) {
            log.error("===== token解析异常 =====", e);
            throw new CustomException("PERMISSION_TOKEN_INVALID");
        }
    }

    /**
     * 构建jwt
     *
     * @param userId
     * @param username
     * @param audience
     * @return
     */
    public static String createJWT(String userId, String username, Audience audience) {
        try {
            // 使用HS256加密算法
            SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

            long nowMillis = System.currentTimeMillis();
            Date now = new Date(nowMillis);

            //生成签名密钥
            byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(audience.getBase64Secret());
            Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());

            //添加构成JWT的参数
            JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT")
                    // 可以将基本不重要的对象信息放到claims
                    .claim("userId", userId)
                    .setSubject(username)           // 代表这个JWT的主体,即它的所有人
                    .setIssuer(audience.getIss())              // 代表这个JWT的签发主体;
                    .setIssuedAt(new Date())        // 是一个时间戳,代表这个JWT的签发时间;
                    .setAudience(audience.getAud())          // 代表这个JWT的接收对象;
                    .signWith(signatureAlgorithm, signingKey);
            //添加Token过期时间
            int TTLMillis = audience.getExpiresSecond();
            if (TTLMillis >= 0) {
                long expMillis = nowMillis + TTLMillis;
                Date exp = new Date(expMillis);
                builder.setExpiration(exp)  // 是一个时间戳,代表这个JWT的过期时间;
                        .setNotBefore(now); // 是一个时间戳,代表这个JWT生效的开始时间,意味着在这个时间之前验证JWT是会失败的
            }

            //生成JWT
            return builder.compact();
        } catch (Exception e) {
            log.error("签名失败", e);
            throw new CustomException("PERMISSION_SIGNATURE_ERROR");
        }
    }

    /**
     * 从token中获取用户名
     *
     * @param token
     * @param base64Security
     * @return
     */
    public static String getUsername(String token, String base64Security) {
        return parseJWT(token, base64Security).getSubject();
    }

    /**
     * 从token中获取用户ID
     *
     * @param token
     * @param base64Security
     * @return
     */
    public static String getUserId(String token, String base64Security) {
        Claims claims= parseJWT(token,base64Security);
        String userId = (String)claims.get("userId");
        return userId;
    }

    /**
     * 是否已过期
     *
     * @param token
     * @param base64Security
     * @return
     */
    public static boolean isExpiration(String token, String base64Security) {
        return parseJWT(token, base64Security).getExpiration().before(new Date());
    }
}
拦截器

拦截前端传来的请求,验证其是否携带令牌以及令牌是否有效

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * token验证拦截器
 */
@Slf4j
public class JwtInterceptor implements HandlerInterceptor {

    @Autowired
    private Audience audience;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 忽略带JwtIgnore注解的请求, 不做后续token认证校验
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            JwtIgnore jwtIgnore = handlerMethod.getMethodAnnotation(JwtIgnore.class);
            if (jwtIgnore != null) {
                return true;
            }
        }

        if (HttpMethod.OPTIONS.equals(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
            return true;
        }

        // 获取请求头信息authorization信息
        final String authHeader = request.getHeader(JwtTokenUtil.AUTH_HEADER_KEY);
        log.info("## authHeader= {}", authHeader);

        if (StringUtils.isBlank(authHeader) || !authHeader.startsWith(JwtTokenUtil.TOKEN_PREFIX)) {
            log.info("### 用户未登录,请先登录 ###");
            throw new CustomException("USER_NOT_LOGGED_IN");
        }

        // 获取token
        final String token = authHeader.substring(7);

        if (audience == null) {
            BeanFactory factory = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
            audience = (Audience) factory.getBean("audience");
        }

        // 验证token是否有效--无效已做异常抛出,由全局异常处理后返回对应信息
        JwtTokenUtil.parseJWT(token, audience.getBase64Secret());

        return true;
    }

}
编写JwtIgnore注解

忽略携带JwtIgnore的请求,不会做后续的token验证

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface JwtIgnore {
    boolean required() default true;
}
配置拦截器

在配置类中配置拦截器

@Override
public void addInterceptors(InterceptorRegistry registry) {
    //拦截路径可自行配置多个 可用 ,分隔开
    registry.addInterceptor(new JwtInterceptor()).addPathPatterns("/**");
}

/**
 * 跨域支持
 *
 * @param registry
 */
@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
            .allowedOriginPatterns("*")
            .allowCredentials(true)
            .allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH", "OPTIONS", "HEAD")
            .maxAge(3600 * 24);
}
用户登录接口
//用户登录
@PostMapping("/login")
@JwtIgnore
public R<JSONObject> loginUser(User user, HttpServletResponse response){
    LambdaQueryWrapper<User> queryWrapper =new LambdaQueryWrapper<>();
    User loginUser=null;
    if(user.getName()!=null){
        String password= DigestUtils.md5Hex(user.getPassword());
        user.setPassword(password);
        queryWrapper.eq(User::getName,user.getName());
        queryWrapper.eq(User::getPassword,user.getPassword());
        loginUser=userService.getOne(queryWrapper);
    }else{
        Object codeInSession=stringRedisTemplate.opsForValue().get(user.getPhone());
        if(codeInSession!=null&&codeInSession.equals(user.getVerifiableCode())) {
            queryWrapper.eq(User::getPhone, user.getPhone());
            loginUser = userService.getOne(queryWrapper);
        }else{
            return R.error("登陆失败");
        }
    }
    if(loginUser==null){
        return R.error("登录失败");
    }

    // 创建token
    String token = JwtTokenUtil.createJWT(loginUser.getId().toString(), loginUser.getName(), audience);
    log.info("### 登录成功, token={} ###", token);

    // 将token放在响应头
    response.setHeader(JwtTokenUtil.AUTH_HEADER_KEY, JwtTokenUtil.TOKEN_PREFIX + token);
    // 将token响应给客户端
    JSONObject result = new JSONObject();
    result.put("token", token);

    return R.success(result);
}

这样我们就将这个token传递给了前端,前端将token存起来,每次请求的时候都会在拦截器中携带

uni.setStorageSync('token', token)

对于携带token请求的处理

在许多接口中我们都需要获取当前用户的id,姓名等等,但是请求中都不会携带这些信息,我们只能从token中解析,怎么样优雅的在需要的接口中解析token信息呢?

我们使用方法参数解析器,参考这篇文章

Spring提供了多种解析器Resolver,比如常用的统一处理异常的HandlerExceptionResolver。同时,还提供了用来处理方法参数的解析器HandlerMethodArgumentResolver。它包含2个方法:supportsParameter和resolveArgument。其中前者用来判断是否满足某个条件,当满足条件(返回true)则可进入resolveArgument方法进行具体处理操作。

基于HandlerExceptionResolver,我们可以分以下部分来进行实现:

  • 自定义注解@CurrentUser,用于Controller方法上的User参数;
  • 自定义LoginUserHandlerMethodArgumentResolver,实现HandlerMethodArgumentResolver接口,通过supportsParameter检查符合条件的参数,通过resolveArgument方法来将token转换成User对象,并赋值给参数。
  • 注册HandlerMethodArgumentResolver到MVC当中。

下面来看具体的实现,先定义注解@CurrentUser:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}

注解就是用来做标识用的,标识指定的参数需要进行处理。对于注解了@CurrentUser的参数是由自定义的LoginUserHandlerMethodArgumentResolver来进行判断处理的:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

@Component
public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Autowired
    private Audience audience;

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(CurrentUser.class) &&
                parameter.getParameterType().isAssignableFrom(User.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,
                                  NativeWebRequest request, WebDataBinderFactory factory) {

        final String authHeader = request.getHeader(JwtTokenUtil.AUTH_HEADER_KEY);
        // 获取token
        final String token = authHeader.substring(7);

        Long userId = Long.valueOf(JwtTokenUtil.getUserId(token,audience.getBase64Secret()));
        String name=JwtTokenUtil.getUsername(token,audience.getBase64Secret());
        // TODO 根据userId获取User信息,这里省略,直接创建一个User对象。
        User user = new User();
        user.setName(name);
        user.setId(userId);
        return user;
    }
}

supportsParameter方法中通过两个条件来过滤参数,首先参数需要使用CurrentUser注解,同时参数的类型为User。当满足条件时返回true,进入resolveArgument进行处理。

在resolveArgument中,从header中获取token,然后根据token获取对应User信息,这里可以注入UserService来获得更多的用户信息,然后将构造好的User对象返回。这样,后续就可以将返回的User绑定到Controller中的参数上。

但此时自定义的Resolver并没有生效,还需要添加到MVC当中:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Resource
    private LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(loginUserHandlerMethodArgumentResolver);
    }

}

至此,便可以在Controller中使用该注解来获取用户信息了,具体使用如下:

public R<FeedDto> getById(@PathVariable Long id,@CurrentUser User currentUser){

在参数前添加注解CurrentUser,这个user参数就是当前登录的用户了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring Boot 集成 JWT 验证 Token 的步骤如下: 1. 引入相关依赖包 2. 实现自定义 JWT 验证过滤器 3. 在 Security 配置中配置 JWT 验证过滤器 4. 在需要验证的接口上添加 @PreAuthorize 注解 5. 处理 Token 相关操作(生成、刷新、验证等) 请注意,以上步骤仅是大致流程,具体实现可能会有所不同。如需细节请参考Spring Boot 官方文档或搜索相关教程。 ### 回答2: Spring Boot是一款非常方便的框架,可以快速搭建应用程序。同样的,JWT(JSON Web Token)也是一种非常流行的身份验证机制,使用标准的JSON格式,并且使用了数字签名方式验证身份。本文将介绍Spring Boot整合JWT验证Token。 首先,通过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> ``` 接下来创建JWTUtils类来处理Token的创建与验证: ``` @Component public class JWTUtils { // 密钥 private static final String SECRET = "mySecret"; // 过期时间毫秒 private static final long EXPIRATION_TIME = 1800000; // 创建token public static String createToken(String username, String role) { return Jwts.builder() .setSubject(username) .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) .claim("roles", role) .signWith(SignatureAlgorithm.HS512, SECRET) .compact(); } // 验证token public static boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token); return true; } catch (SignatureException | ExpiredJwtException e) { return false; } } // 获取用户名 public static String getUsernameFromToken(String token) { return Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody().getSubject(); } // 获取角色 public static String getRoleFromToken(String token) { return Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody().get("roles").toString(); } } ``` 其中,createToken方法用于创建Token,validateToken方法用于验证Token,getUsernameFromToken和getRoleFromToken用于获取Token中的信息。 接下来,在Spring Boot中配置WebSecurityConfig: ``` @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() .authorizeRequests() .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() // 跨域请求会先进行一次options请求 .antMatchers("/auth/**").permitAll() // 登录注册接口放行 .anyRequest().authenticated() .and() .addFilter(new JWTAuthenticationFilter(authenticationManager())) .addFilter(new JWTAuthorizationFilter(authenticationManager())) .headers().cacheControl(); } @Override public void configure(WebSecurity web) { web.ignoring().antMatchers( "/error", "/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/**", "/swagger-ui.html", "/webjars/**"); } @Autowired public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { authenticationManagerBuilder.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder()); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } } ``` 其中,configure方法配置了安全规则,addFilter方法添加了JWT的过滤器,configureAuthentication方法配置用户认证方式。 最后,在Controller中使用接口进行调用: ``` @RestController public class UserController { @Autowired private UserService userService; @PostMapping("/auth/register") public String register(@RequestBody UserDTO userDTO) { if (userService.register(userDTO)) { return "注册成功"; } else { return "注册失败"; } } @PostMapping("/auth/login") public ResponseEntity<TokenDTO> login(@RequestParam String username, @RequestParam String password) { String role = "ROLE_USER"; // 这里演示只有ROLE_USER角色 String token = JWTUtils.createToken(username, role); return ResponseEntity.ok(new TokenDTO(token)); } @GetMapping("/user/info") public String userInfo(Authentication authentication) { String username = authentication.getName(); String role = JWTUtils.getRoleFromToken(((JwtUserDetails) authentication.getPrincipal()).getToken()); return username + "-" + role; } } ``` 其中,login方法用于登录获取Token,userInfo方法用于获取当前用户信息。这里使用了Spring Security提供的authentication对象来获取用户信息。 综上,Spring Boot整合JWT验证Token并不复杂,通过相关依赖包、JWTUtils、WebSecurityConfig和Controller的配置,即可完成Token身份验证,保证接口的安全性。 ### 回答3: Spring Boot是一个Java开发框架,它可以减少Web应用程序的开发时间和复杂性。在开发Web应用程序时,安全性是一个关键问题,可以使用JWT(Json Web Token)来提高应用程序的安全性。 JWT是一种基于JSON的安全令牌,可以在用户与应用程序之间传递信息。JWT包含了许多有用的信息,例如用户的ID、角色、权限等等。在Spring Boot中,我们可以使用jwt.io上的库来生成和解码JWT令牌。 首先,在pom.xml文件中添加jwt库的依赖项,如下所示: ``` <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.2</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.11.2</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.11.2</version> <scope>runtime</scope> </dependency> ``` 接下来,我们需要创建一个JWTUtils工具类。该类将用于编码、解码和验证JWT令牌。实现代码如下: ``` import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.Date; @Component public class JWTUtils { @Value("${jwt.secret}") private String secret; @Value("${jwt.expiration}") private Long expiration; public String generateToken(String username) { Date now = new Date(); Date expiryDate = new Date(now.getTime() + expiration * 1000); return Jwts.builder() .setSubject(username) .setIssuedAt(now) .setExpiration(expiryDate) .signWith(SignatureAlgorithm.HS512, secret) .compact(); } public String getUsernameFromToken(String token) { Claims claims = Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody(); return claims.getSubject(); } public boolean validateToken(String token, UserDetails userDetails) { String username = getUsernameFromToken(token); return (username.equals(userDetails.getUsername()) && !isTokenExpired(token)); } private boolean isTokenExpired(String token) { Date expiryDate = Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody() .getExpiration(); return expiryDate.before(new Date()); } } ``` 在上面的代码中,我们使用@Value注释从application.properties文件中读取秘密和过期时间。generateToken方法是用于生成JWT令牌的方法。setSubject()定义了JWT令牌的主题,setIssuedAt()是JWT生成时间,setExpiration()是JWT令牌的超时时间。最后,我们使用signWith()进行签名和压缩。 getUsernameFromToken()方法获取JWT令牌中的用户名。validateToken()用于验证JWT令牌是否有效。isTokenExpired()方法检查JWT令牌是否已过期。 为了让Spring Boot知道我们在哪里可以找到JWTUtils类,我们需要在Application.java类中添加@ComponentScan注解,如下所示: ``` @SpringBootApplication @ComponentScan({"com.example.jwt"}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 最后,我们在Spring Boot中创建一个Controller类。该类有一个login()方法,该方法接收用户名和密码并验证该用户是否存在。如果用户存在,则生成JWT令牌并将其返回给客户端。如下所示: ``` import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.web.bind.annotation.*; import com.example.jwt.JWTUtils; @RestController @RequestMapping("/api/auth") public class AuthController { @Autowired private AuthenticationManager authenticationManager; @Autowired private JWTUtils jwtUtils; @Autowired private UserDetailsService userDetailsService; @PostMapping("/login") public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) throws AuthenticationException { try { authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword())); } catch (UsernameNotFoundException e) { throw new RuntimeException("User not found"); } final UserDetails userDetails = userDetailsService.loadUserByUsername(loginRequest.getUsername()); final String token = jwtUtils.generateToken(userDetails.getUsername()); return ResponseEntity.ok(new AuthResponse(token)); } } ``` 在上面的代码中,我们使用@Autowired注释从其他类中获取所需的依赖项。login()方法中,我们使用authenticationManager.authenticate()方法验证用户是否存在。如果该用户不存在,则会抛出一个异常。然后,我们使用userDetailsService.loadUserByUsername()方法加载用户详细信息。最后,我们调用JWTUtils.generateToken()方法生成JWT令牌。 在上面的代码中,我们还创建了一个名为AuthResponse的简单类,该类是返回的响应对象,包含JWT令牌。 ``` public class AuthResponse { private String token; public AuthResponse(String token) { this.token = token; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } } ``` 以上就是Spring Boot整合JWT验证token的简单代码示例。该代码示例可以让开发者更加容易地理解Spring Boot如何使用JWT来增强应用程序的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值