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。
我一直在关注 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。