@Component public class JwtTokenUtil implements Serializable { public static final long JWT_TOKEN_VALIDITY = 5*60*60; @Value("${jwt.secret}") private String secret="javainuse"; public static void main(String[] args) { System.out.println(new BCryptPasswordEncoder().encode("b")); } public String generateToken(UserDetails userDetials){ Map<String,Object> claims = new HashMap<>(); return doGenerateToken(claims,userDetials.getUsername()); } private String doGenerateToken(Map<String, Object> claims, String subject) { return Jwts.builder() .setClaims(claims) .setSubject(subject) .setIssuedAt(new Date(System.currentTimeMillis())) .setExpiration(new Date(System.currentTimeMillis()+ JWT_TOKEN_VALIDITY*1000)) .signWith(SignatureAlgorithm.HS256,secret) .compact(); } public String getUsernameFromToken(String token){ return getClaimFromToken(token, Claims::getSubject); } public Date getExpirationDateFromToken(String token){ return getClaimFromToken(token, Claims::getExpiration); } public <T> T getClaimFromToken(String token, Function<Claims,T> claimsResolver) { final Claims claims = getAllClaimsFromToken(token); return claimsResolver.apply(claims); } private Claims getAllClaimsFromToken(String token) { return Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody(); } private Boolean isTokenExpired(String token){ final Date expiration = getExpirationDateFromToken(token); return expiration.before(new Date()); } public Boolean validateToken(String token,UserDetails userDetails){ final String username = getUsernameFromToken(token); return (username.equals(userDetails.getUsername())&&!isTokenExpired(token)); } }
@RestController @Slf4j @RequestMapping("restfood") public class JwtAuthenticationController { @Autowired private AuthenticationManager authenticationManager; @Autowired private JwtTokenUtil jwtTokenUtil; @Autowired private JwtUserDetailsService userDetailsService; @RequestMapping(value = "/hello") public String firstPage(){ return "hello world"; } @ApiOperation(value="用户登录操作") @ApiImplicitParams({ @ApiImplicitParam(name = "username",value = "用户名",required = true), @ApiImplicitParam(name = "pwd",value = "密码",required = true) }) @RequestMapping(value = "/resuser.action") public ResponseEntity<?> createAuthenticationToken(String username,String pwd) throws Exception { authenticate(username, pwd); final UserDetails userDetails = userDetailsService.loadUserByUsername(username); final String token = jwtTokenUtil.generateToken(userDetails); return ResponseEntity.ok(new JwtResponse(token)); } private void authenticate(String username, String password) throws Exception { try { authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password)); } catch (DisabledException e) { throw new Exception("USER_DISABLED", e); } catch (BadCredentialsException e) { throw new Exception("INVALID_CREDENTIALS", e); } } }
@Component public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint, Serializable { @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); } }
想要深入了解Spring Boot Security + JWT 参考以下链接Spring Boot Security + JWT Hello World Example | JavaInUse