当我在管理员授权后尝试添加新帖子时,看到此响应。
我具有基于Spring Boot安全性的基本授权:
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
//...declared fields
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.passwordEncoder(passwordEncoder())
.withUser("user")
.password("userpass")
.roles("USER")
.and()
.withUser("admin")
.password("adminpass")
.roles("ADMIN", "USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/logout").permitAll()
.anyRequest().authenticated()
.and()
.httpBasic()
.and().logout().permitAll()
.and()
.formLogin()
.loginProcessingUrl("/login")
.permitAll()
.and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/login");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
在授权后尝试添加新帖子时,我收到此消息:
{
"timestamp": "2018-07-04T12:19:25.638+0000",
"status": 403,
"error": "Forbidden",
"message": "Forbidden",
"path": "/post/create"
}
在我的控制器中:
@RestController
public class PostController {
@Autowired
private PostDAO postDAO;
@GetMapping("/posts")
public Page<Post> getAllPosts(Pageable pageable) {
return postDAO.findAll(pageable);
}
@PostMapping("/post/create")
public Post createPost(@Valid @RequestBody Post post) {
return postDAO.save(post);
}
//other end-points........
}
但是,从控制器读取操作的效果很好,但对于我无法访问的CRUD操作。
有我的依赖项
dependencies {
compile ('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.hibernate:hibernate-core')
compile('org.springframework.boot:spring-boot-starter-security')
runtime('mysql:mysql-connector-java')
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.springframework.security:spring-security-test')
testCompile('junit:junit')
}
有什么主意吗? 预先感谢!
答案 0 :(得分:9)
这是由于启用了CSRF
。 Java配置中默认启用CSRF
保护。我们仍然可以使用以下配置禁用CSRF
。
http .csrf().disable() .authorizeRequests() .anyRequest().permitAll();
从Spring 安全性4.x 开始–默认情况下,XML配置中也启用了CSRF
保护;当然,如果需要,我们仍然可以禁用它:
<http>
...
<csrf disabled="true"/>
</http>
注意:CSRF是一种攻击,迫使最终用户执行不必要的攻击 当前已通过身份验证的Web应用程序中的操作。
答案 1 :(得分:0)
原因如下: csrf 在 spring security 中自动启用,我建议您不要禁用 csrf。 通常,您的 html 表单标签应包含一个生成 csrf 令牌的隐藏字段,但是,thymeleaf 会自动为您执行此操作,您应该检查您的 html 标签以查看是否包含“th:”,如果没有,请包含“th” :" 在 form 标签中的 "action" 之前,执行此操作,thymeleaf 会不可见地生成 csrf 令牌。