Я использую безопасность Spring для защиты некоторых конечных точек в моей службе REST.
вот класс конфигурации безопасности:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, jsr250Enabled = true, prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// Other methods
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors()
.and()
.csrf()
.disable()
.exceptionHandling()
.authenticationEntryPoint(this.jwtAuthenticationEntryPoint)
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/",
"/favicon.ico",
"/**/*.png",
"/**/*.gif",
"/**/*.svg",
"/**/*.jpg",
"/**/*.html",
"/**/*.css",
"/**/*.js")
.permitAll()
.antMatchers(HttpMethod.POST, "/api/auth/**")
.permitAll()
.anyRequest()
.authenticated();
// Add our custom JWT security filter
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}
}
Как видите, мне предоставлен полный доступ к / api / auth / регистрация и / API / аутентификация / вход, используя: .antMatchers(HttpMethod.POST, "/api/auth/**").permitAll()
по какой-то причине, когда я попробовал этот запрос в почтальоне, запрос "зарегистрироваться" работал нормально, но "войти" не работает и дает мне «401 неавторизованный»
я пробовал также .antMatchers("/**").permitAll()
вот мой контроллер:
@RestController
public class UserController {
private UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@PostMapping("/api/auth/signup")
public ResponseEntity<RestResponse> registerUser(@Valid @RequestBody SignUpRequest signUpRequest,
UriComponentsBuilder uriComponentsBuilder) {
RestResponse restResponse = this.userService.register(signUpRequest);
UriComponents uriComponents = uriComponentsBuilder.path("/users").buildAndExpand();
return ResponseEntity.created(uriComponents.toUri()).body(restResponse);
}
@PostMapping("/api/auth/signin")
public ResponseEntity<JwtAuthenticationResponse> authenticateUser(@Valid @RequestBody LoginRequest loginRequest) {
return ResponseEntity.ok(this.userService.login(loginRequest));
}
}
это дает мне 403 запрещенных
Покажите свою реализацию JwtAuthenticationFilter.
@Ayoubk Ваша конфигурация выглядит нормально - можете ли вы попробовать удалить HttpMethod.POST и сделать его antMatchers ("/ api / auth / **") только для целей тестирования. Можете ли вы подтвердить, что отправляете правильные типы HTTP-запросов от Postman при вызове конечных точек REST?
Пожалуйста, добавьте к вопросу запрос signin.




В последний раз я помню, что порядок важен.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors()
.and()
.csrf()
.disable()
.exceptionHandling()
.authenticationEntryPoint(this.jwtAuthenticationEntryPoint)
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers(HttpMethod.POST, "/api/auth/**")
.permitAll()
.antMatchers("/",
"/favicon.ico",
"/**/*.png",
"/**/*.gif",
"/**/*.svg",
"/**/*.jpg",
"/**/*.html",
"/**/*.css",
"/**/*.js")
.permitAll()
.anyRequest()
.authenticated();
// Add our custom JWT security filter
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}
У меня была такая же проблема, не уверен, но я думаю, вам нужен такой порядок:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers(HttpMethod.POST, "/api/auth/**")
.permitAll()
.antMatchers("/",
"/favicon.ico",
"/**/*.png",
"/**/*.gif",
"/**/*.svg",
"/**/*.jpg",
"/**/*.html",
"/**/*.css",
"/**/*.js")
.permitAll()
.anyRequest()
.authenticated()
.and()
.cors()
.and()
.exceptionHandling()
.authenticationEntryPoint(this.jwtAuthenticationEntryPoint)
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.csrf()
.disable();
// Add our custom JWT security filter
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}
В чем проблема у меня: http.authorizeRequests (). AntMatchers (HttpMethod.GET, "/ get / **"). AllowAll (); Я все еще получаю несанкционированную ошибку.
Я попробовал именно так, как вы указали выше, и ничего такого, все еще давая код состояния 401.
Ваша конфигурация не работает из-за порядка, в котором оценивается antMatcher
.and()
.authorizeRequests()
.antMatchers("/",
"/favicon.ico",
"/**/*.png",
"/**/*.gif",
"/**/*.svg",
"/**/*.jpg",
"/**/*.html",
"/**/*.css",
"/**/*.js")
.permitAll()
.antMatchers(HttpMethod.POST, "/api/auth/**")
.permitAll()
.anyRequest()
.authenticated();
Порядок правила соответствия запроса имеет значение, и в первую очередь должны быть указаны более конкретные правила. Существует некоторый конфликт между обоими правилами antMatcher, поэтому второе правило, то есть .antMatchers (HttpMethod.POST, "/ api / auth / ") **, игнорируется.
Следовательно, порядок должен быть следующим: -
.antMatchers(HttpMethod.POST, "/api/auth/**")
.permitAll()
.antMatchers("/",
"/favicon.ico",
"/**/*.png",
"/**/*.gif",
"/**/*.svg",
"/**/*.jpg",
"/**/*.html",
"/**/*.css",
"/**/*.js")
.permitAll()
Вам необходимо добавить в свой метод настройки следующее: / error - это откат по умолчанию, когда в приложении возникает ошибка из-за какого-либо исключения, и по умолчанию он защищен.
protected void configure(HttpSecurity httpSecurity) throws Exception {
//disable CRSF
httpSecurity
//no authentication needed for these context paths
.authorizeRequests()
.antMatchers("/error").permitAll()
.antMatchers("/error/**").permitAll()
.antMatchers("/your Urls that dosen't need security/**").permitAll()
Также приведенный ниже фрагмент кода
@Override
public void configure(WebSecurity webSecurity) throws Exception
{
webSecurity
.ignoring()
// All of Spring Security will ignore the requests
.antMatchers("/error/**")
}
Теперь вы не получите 401 и не получите исключение 500 с подробностями, когда возникло исключение для разрешений на все URL
У меня была такая же проблема, и это было связано с тем, что Я не использовал схему jdbc по умолчанию, поэтому я передавал запросы, необходимые для UserDetailsService по умолчанию, а моя таблица полномочий была пустой, поэтому поиск по имени пользователя не получал результатов.
Можете попробовать отключить строчку
.authenticationEntryPoint(this.jwtAuthenticationEntryPoint)? Обычно методы точки входа также возвращают статус 401.