Задать вопрос
@Uzi82

Почему при запросах после аутентификации выдаёт 403?

Всем привет, уважаемые эксперты! Пишу проект и хочу перейти с 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
  • Вопрос задан
  • 86 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@soymun
Попробуйте исправить на:

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()
                )
                .securityContext(securityContext -> {
                    securityContext.requireExplicitSave(false);
                    securityContext.securityContextRepository(new HttpSessionSecurityContextRepository());
                })
        return http.build();
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы