“状态”:403,“错误”:“禁止”,“消息”:“禁止”,“路径”:“ / post / create”

时间:2018-07-04 13:13:04

标签: spring-boot spring-security

当我在管理员授权后尝试添加新帖子时,看到此响应。

我具有基于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')
}

有什么主意吗? 预先感谢!

2 个答案:

答案 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 令牌。