Spring Security 5.2.2 + Spring Boot 2.2 + Автоконфигурация Oauth: разрешить некоторые uri и защитить только некоторые: ошибка 403 - PullRequest
0 голосов
/ 07 мая 2020

У меня есть сервер авторизации и сервер ресурсов. Я автоматически настроил реализацию OAuth по умолчанию. Код не требовался, и только конфигурация была сделана в

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri:<auth server configuration url here>

Maven Dependencies

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>
                spring-boot-starter-oauth2-resource-server
            </artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

В настоящее время все мои URL-адреса защищены.

@PostMapping(path = "/secure/test", consumes = "application/json", produces = "application/json")   
    public @ResponseBody String testService(@RequestBody String name ,@RequestHeader Map<String, String>headers) {
headers.forEach((K,V)->printHeaders(K,V));
}

Я хочу, чтобы мой URI ниже был доступен для всех,

@PostMapping(path = "/test", consumes = "application/json", produces = "application/json")  
    public @ResponseBody String testAuthService(@RequestBody String name ,@RequestHeader Map<String, String>headers) {
headers.forEach((K,V)->printHeaders(K,V));
}

Я попытался переопределить приведенный ниже, но получил ошибку 403 при попытке без токена-носителя

@Configuration
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) {
        try {
            http
                .authorizeRequests(authorize -> authorize
                    .mvcMatchers("/api/secure/**").authenticated()
                    .anyRequest().permitAll()
                )
                .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Ответ об ошибке

{
    "timestamp": "2020-05-07T14:28:22.729+0000",
    "status": 403,
    "error": "Forbidden",
    "message": "Forbidden",
    "path": "/api/test"
}

Как я могу разрешить аутентификацию только определенных URL-адресов с помощью Spring Security 5.2.2 + Spring Boot 2.2 + Автоконфигурация Oauth

1 Ответ

0 голосов
/ 07 мая 2020

Если вы получаете 403 при выполнении POST , вы, вероятно, забыли предоставить crsrf-token

Защита CSRF включен по умолчанию в конфигурации Java, но вы можете отключить его.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
      .csrf().disable()                 // <--- disable CSRF 
      .authorizeRequests(...
      ....

Или укажите токен в вашей форме.

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

Если вы используете JSON, вы не может отправить токен CSRF в качестве параметра. Вместо этого отправьте токен в заголовок.

<meta name="_csrf" content="${_csrf.token}"/>
<meta name="_csrf_header" content="${_csrf.headerName}"/>

JS, чтобы прикрепить заголовок.

var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");

$(document).ajaxSend(function(e, xhr, options) {
    xhr.setRequestHeader(header, token);
});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...