Java
Java
@RequiredArgsConstructor
public class UserService {
@Service
@RequiredArgsConstructor
public class JwtTokenService {
@Service
@RequiredArgsConstructor
public class AuthUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws
UsernameNotFoundException {
return userRepository.findByUsername(username)
.map(AuthUser::new)
.orElseThrow(() -> new UsernameNotFoundException("User not found: "
+ username));
}
}
@Service
@RequiredArgsConstructor
public class AuthService {
@Entity
@Table(name = "users")
@Data
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@RequiredArgsConstructor
public class AuthUser implements UserDetails {
@Override
public String getUsername() { return user.getUsername(); }
@Override
public String getPassword() { return user.getPassword(); }
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
// Return a list of roles or authorities assigned to the user.
return List.of();
}
@Override
public boolean isAccountNonExpired() { return true; }
@Override
public boolean isAccountNonLocked() { return true; }
@Override
public boolean isCredentialsNonExpired() { return true; }
@Override
public boolean isEnabled() { return true; }
@Data
public class RegisterRequest {
private String username;
private String password;
private String firstName;
private String lastName;
}
@RestController
@RequestMapping("/user")
public class UserController {
private final UserService userService;
UserController(UserService userService) {
this.userService = userService;
}
@RequestMapping("/create")
public User createUser(@RequestBody RegisterRequest user) {
return userService.register(user);
@RestController
@RequestMapping("/user")
public class UserController {
private final UserService userService;
UserController(UserService userService) {
this.userService = userService;
}
@RequestMapping("/create")
public User createUser(@RequestBody RegisterRequest user) {
return userService.register(user);
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/auth")
public class AuthController {
@PostMapping("/token")
public AuthResponse login(@RequestBody AuthRequest authRequest) {
return authService.authenticate(authRequest);
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AuthResponse {
private String token;
private String username;
private Long expiresAt;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AuthRequest {
private String username;
private String password;
}
@Configuration
public class JwtConfig {
@Value("${jwt.key}")
private String jwtKey;
@Bean
public JwtEncoder jwtEncoder() {
return new NimbusJwtEncoder(new ImmutableSecret<>(jwtKey.getBytes()));
}
@Bean
public JwtDecoder jwtDecoder() {
byte[] bytes = jwtKey.getBytes();
SecretKeySpec originalKey = new SecretKeySpec(bytes, 0,
bytes.length,"RSA");
return NimbusJwtDecoder.withSecretKey(originalKey)
.macAlgorithm(MacAlgorithm.HS256)
.build();
}
}
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws
Exception {
return http
.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(auth -> {
auth.requestMatchers("/api/auth/token","/user/create").permitAll();
auth.anyRequest().authenticated();
})
.sessionManagement(session ->
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.oauth2ResourceServer(oauth2 -> {
oauth2.jwt(withDefaults());
})
.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(10);
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration
config) throws Exception {
return config.getAuthenticationManager();
}
}s