LoginSuccessHandler.java 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package timing.ukulele.auth.security.handler;
  2. import jakarta.servlet.http.HttpServletRequest;
  3. import jakarta.servlet.http.HttpServletResponse;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.http.MediaType;
  6. import org.springframework.security.core.Authentication;
  7. import org.springframework.security.core.GrantedAuthority;
  8. import org.springframework.security.oauth2.jwt.*;
  9. import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
  10. import timing.ukulele.auth.config.property.TimingSecurityProperties;
  11. import timing.ukulele.auth.model.Result;
  12. import timing.ukulele.auth.util.JsonUtils;
  13. import java.io.IOException;
  14. import java.nio.charset.StandardCharsets;
  15. import java.time.Instant;
  16. import java.util.List;
  17. import java.util.stream.Collectors;
  18. /**
  19. * 登录成功处理类
  20. */
  21. @Slf4j
  22. public class LoginSuccessHandler implements AuthenticationSuccessHandler {
  23. private final JwtEncoder encoder;
  24. private final TimingSecurityProperties securityProperties;
  25. public LoginSuccessHandler(JwtEncoder encoder, TimingSecurityProperties securityProperties) {
  26. this.encoder = encoder;
  27. this.securityProperties = securityProperties;
  28. }
  29. @Override
  30. public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException {
  31. log.debug("登录成功.");
  32. Result<String> success = Result.success();
  33. Instant now = Instant.now();
  34. long expiry = 36000L;
  35. // @formatter:off
  36. List<String> scopes = authentication.getAuthorities().stream()
  37. .map(GrantedAuthority::getAuthority)
  38. .collect(Collectors.toList());
  39. JwtClaimsSet claims = JwtClaimsSet.builder()
  40. .issuer(securityProperties.getIssuerUrl())
  41. .issuedAt(now)
  42. .expiresAt(now.plusSeconds(expiry))
  43. .subject(authentication.getName())
  44. .claim("scope", scopes)
  45. .claim("userInfo", authentication.getPrincipal())
  46. .claim("authorities", authentication.getAuthorities())
  47. .build();
  48. String tokenValue = encoder.encode(JwtEncoderParameters.from(claims)).getTokenValue();
  49. success.setData(tokenValue);
  50. response.setCharacterEncoding(StandardCharsets.UTF_8.name());
  51. response.setContentType(MediaType.APPLICATION_JSON_VALUE);
  52. response.getWriter().write(JsonUtils.objectCovertToJson(success));
  53. response.getWriter().flush();
  54. }
  55. }