Всем привет, уважаемые эксперты! Пишу проект и хочу перейти с JWT на JSESSIONID, чтобы упростить работу фронтам. Написал тестовый минипроект с помощью документации и нейросети, т.к сам в сессии пока не умею. Проблема заключается в том, что после успешной аутентификации по идее при последующих запросах Spring Security должен проверять контекст JSESSIONID и понимать, что этот пользователь это определённый user из бд. Однако, к сожалению, я получаю 403. Потратил на проблему 2 дня, >40 запросов у нейронки, 2 часа гуглинга и ещё хз сколько на доку. Прошу помочь. Прилагаю весь код, который считаю необходимым:
SecurityCfg.java
@Configuration
@AllArgsConstructor
@EnableWebSecurity
public class SecurityCfg {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.ignoringRequestMatchers("/api/**"))
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/api/auth/**").permitAll()
.requestMatchers("/api/private").authenticated()
.anyRequest().permitAll()
)
.sessionManagement(
session -> session.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
);
return http.build();
}
}
AuthController.java
@RestController
@AllArgsConstructor
@RequestMapping("/api/auth")
public class AuthController {
private AuthService authService;
@PostMapping("/signin")
public ResponseEntity<?> signIn(@RequestBody LoginRequest request) {
return authService.login(request);
}
@PostMapping("/signup")
public ResponseEntity<?> signUp(@RequestBody CreateUserRequest request) {
return authService.createUser(request);
}
}
AuthService.java
@Service
@AllArgsConstructor
@Slf4j
public class AuthService {
private UserService userService;
private RoleService roleService;
private AuthenticationManager authenticationManager;
public ResponseEntity<?> login(LoginRequest request) {
try {
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(request.getUsername(), request.getPassword());
Authentication authentication = authenticationManager.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(authentication);
return new ResponseEntity<>(authentication, HttpStatus.OK);
} catch (AuthenticationException ex) {
log.error(ex.getMessage());
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
}
}
public ResponseEntity<?> createUser(CreateUserRequest request) {
User user = new User();
user.setUsername(request.getUsername());
user.setPassword(request.getPassword());
user.setRoles(List.of(roleService.getUserRole()));
return userService.createUser(user);
}
}
AuthenticationManagerCfg.java
@Configuration
@AllArgsConstructor
public class AuthenticationManagerCfg {
private PasswordEncoder passwordEncoder;
private UserService userService;
@Bean
public AuthenticationManager authenticationManager() {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setUserDetailsService(userService);
provider.setPasswordEncoder(passwordEncoder);
return new ProviderManager(provider);
}
}
User.java (На всякий случай)
@Entity
@Data
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
@ManyToMany
@JoinTable(
name = "users_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id")
)
private List<Role> roles;
}
Запросы тестировал через Postman