GET 和 POST 上的不同身份验证

Different authentication on GET and POST

我一直在关注 spring 安全示例,但我无法理解它。一个简单的 RestController 在 GetMapping("/hello") 上用 200 状态码回复你好。将其更改为 PostMapping 后,我会收到 401 以发送相同的凭据。

似乎我在这里遗漏了一些基本的东西,因为我希望这两个请求都是 return 200 状态代码。

安全配置:

@Configuration
public class ProjectConfig extends WebSecurityConfigurerAdapter {

    @Override
    @Bean
    public UserDetailsService userDetailsService() {
        return new InMemoryUserDetailsManager(
                List.of(
                        User.withUsername("john")
                                .password("12345")
                                .authorities("ROLE_ADMIN")
                                .build(),
                        User.withUsername("jane")
                                .password("12345")
                                .authorities("ROLE_MANAGER")
                                .build()
                )
        );
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.httpBasic()
                .and()
                .authorizeRequests()
                .anyRequest()
                .hasRole("ADMIN");
    }
}

具有以下获取映射的 RestController returns 200 用于此调用:

curl -v -u john:12345 localhost:8080/hello

和这个映射:

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello!";
    }
}

具有以下 post 映射的 RestController returns 401 用于此调用:

curl -X POST -v -u john:12345 localhost:8080/hello

和这个映射:

@RestController
public class HelloController {

    @PostMapping("/hello")
    public String hello() {
        return "Hello!";
    }
}

Spring 的 CSRF 保护在 Spring 安全性中默认启用。 POST 请求受此行为影响。

通过以下方式禁用它:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
}

正如@Matheus Cirillo 指出的那样,CSRF protection is enabled by default

很想禁用 CSRF 保护,因为我们使用的是 restful api,但是 consider what happens 如果您使用的是 browser-based 单页应用程序与服务器交互。同样经过身份验证的 session 在浏览器中仍然可用,应用程序仍然容易受到 CSRF 攻击。

您可以在 header 或响应参数中找到 some examples of how to work with csrf protection in your own application in the docs. In a restful api, you can also provide an endpoint that returns the csrf token