Springboot整合JWT完成验证登录

一、引入依赖

 		<dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

二、JwtUtil 代码解读

这个Java类是一个工具类,用于生成和验证JSON Web Tokens(JWT)。JWT是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。这个信息可以被验证和信任,因为它是数字签名的。在这个例子中,使用了Java的jsonwebtoken库。

下面是对这个类每行代码的详细解释:

  1. import io.jsonwebtoken.*;:引入jsonwebtoken库的所有类。
  2. import java.util.Date;:引入java.util包下的Date类,用于处理日期和时间。
  3. import java.util.HashMap;:引入java.util包下的HashMap类,用于创建哈希映射。
  4. import java.util.Map;:引入java.util包下的Map接口,用于创建映射。
  5. public class JwtUtil {:声明一个公共类JwtUtil。
  6. private static final String SECRET_KEY = "your-secret-key";:在类中声明一个私有的、静态的、不可变的字符串变量SECRET_KEY,并初始化为"your-secret-key"。这个密钥用于JWT的签名和验证。
  7. public static String generateToken(String username) {:声明一个公共的、静态的方法generateToken,接收一个字符串参数username,并返回一个字符串。这个方法用于生成JWT。
  8. Map<String, Object> claims = new HashMap<>();:创建一个新的HashMap,用于存储JWT的载荷(claims)。
  9. claims.put("username", username);:将username添加到载荷中,键是"username",值是传递给generateToken方法的username参数。
  10. return Jwts.builder():使用Jwts类的builder方法开始构建一个新的JWT。
  11. .setClaims(claims):设置JWT的载荷。
  12. .setExpiration(new Date(System.currentTimeMillis() + 3600000)):设置JWT的过期时间。这里设置为当前时间之后的1小时(3600000毫秒)。
  13. .signWith(SignatureAlgorithm.HS256, SECRET_KEY):使用HS256算法和上面定义的SECRET_KEY对JWT进行签名。
  14. .compact();:生成JWT的字符串表示形式并返回。
  15. public static boolean validateToken(String token) {:声明一个公共的、静态的方法validateToken,接收一个字符串参数token,并返回一个布尔值。这个方法用于验证JWT。
  16. try {:开始一个try块,用于捕获可能出现的异常。
  17. Jwts.parser():使用Jwts类的parser方法开始解析JWT。
  18. .setSigningKey(SECRET_KEY):设置用于解析JWT的签名密钥。
  19. .parseClaimsJws(token):解析JWT,得到一个ClaimsJws对象。
  20. .getBody();:获取JWT的载荷。如果没有异常抛出,那么JWT是有效的,所以返回true。
  21. } catch (ExpiredJwtException e) {:捕获过期的JWT异常,返回false。
  22. } catch (UnsupportedJwtException e) {:捕获不支持的JWT类型异常,返回false。
  23. } catch (MalformedJwtException e) {:捕获格式错误的JWT异常,返回false。
  24. } catch (SignatureException e) {:捕获签名验证失败的JWT异常,返回false。
  25. } catch (IllegalArgumentException e) {:捕获其他非法情况的异常,返回false。
  26. }:结束try-catch块。
  27. }:结束validateToken方法。
  28. }:结束JwtUtil类。

三、LoginController 代码解读

这是一个使用Java语言和Spring框架编写的简单的登录控制器。下面是对这段代码的详细解释:

  • import com.minster.yanapi.common.ApiResponse;:导入名为ApiResponse的类,它可能是一个用于封装API响应的通用类,可能包含成功或失败的消息、状态码等信息。
  • import com.minster.yanapi.common.ResponseCode;:导入名为ResponseCode的枚举或类,可能包含API响应的状态码(例如,成功、失败、无效凭据等)。
  • import org.springframework.web.bind.annotation.*;:导入Spring MVC框架的注解,这些注解用于定义Web请求的处理方法。
  • @RestController:这是Spring MVC的注解,它表示该类是一个REST控制器。Spring会将此类中的方法返回的对象直接转化为JSON或XML等格式的响应数据。
  • @RequestMapping("/hello"):这是Spring MVC的注解,它定义了该控制器处理的基础URL路径。在这种情况下,所有路由都将以/hello开始。
  • public class LoginController {:定义了一个公开的类LoginController
  • @PostMapping("/login"):这是Spring MVC的注解,它定义了一个处理方法,该方法将处理向/hello/login路径发送的POST请求。
  • public ApiResponse login(@RequestParam("username") String username, @RequestParam("password") String password) {:定义了一个公开的方法login,它接收两个参数,分别是用户名和密码。这两个参数是通过POST请求中的参数提供的。这个方法返回一个ApiResponse对象。
  • if ("admin".equals(username) && "password".equals(password)) {:这是一个简单的验证过程,只检查用户名是否为"admin",密码是否为"password"。在真实的应用中,你应该连接数据库或其他数据源来验证凭据。
  • String token = JwtUtil.generateToken(username);:如果验证成功,它将生成一个JWT(JSON Web Token)并将其赋值给token变量。
  • return ApiResponse.success(token);:返回一个成功的ApiResponse,其中可能包含生成的JWT。
  • return ApiResponse.failed(ResponseCode.Invalid_credentials);:如果验证失败,返回一个失败的ApiResponse,并携带一个表示无效凭据的状态码。
  • }:结束login方法。
  • }:结束LoginController类。

四、整体代码


import io.jsonwebtoken.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtil {
    private static final String SECRET_KEY = "your-secret-key"; // 替换为你自己的密钥

    public static String generateToken(String username) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("username", username);

        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 设置过期时间为1小时
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    public static boolean validateToken(String token) {
        try {
            Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token)
                    .getBody();
            return true;
        } catch (ExpiredJwtException e) {
            return false; // 标记为过期的JWT
        } catch (UnsupportedJwtException e) {
            return false; // 不支持的JWT类型
        } catch (MalformedJwtException e) {
            return false; // 格式错误的JWT
        } catch (SignatureException e) {
            return false; // 签名验证失败的JWT
        } catch (IllegalArgumentException e) {
            return false; // 其他非法情况
        }
    }
}
import com.minster.yanapi.common.ApiResponse;
import com.minster.yanapi.common.ResponseCode;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/hello")
public class LoginController {
    @PostMapping("/login")
    public ApiResponse login(@RequestParam("username") String username, @RequestParam("password") String password) {
        // 在这里进行用户名和密码的验证,这里只是简单示例,实际情况下需要连接数据库等进行验证
        if ("admin".equals(username) && "password".equals(password)) { // 假设用户名为"admin",密码为"password"时验证通过
            String token = JwtUtil.generateToken(username); // 生成JWT并返回给客户端
            return ApiResponse.success(token);
        } else {
            return ApiResponse.failed(ResponseCode.Invalid_credentials); // 返回错误信息给客户端,表示验证失败
        }
    }
}

五、结果展示

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

吉屋安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值