繁体   English   中英

Spring 安全 CSRF 403 成功登录时禁止

[英]Spring Security CSRF 403 Forbidden on successful login

I'm using Spring Security on a basic Thymeleaf setup with index.html and login.html, however the default login page always returns 403 Forbidden when the credentials are valid. (如预期的那样,当凭据不匹配时,它会给出 UI 错误)。

我相信这是由于 CSRF 令牌已经作为 cookie (XSRF-TOKEN) 包含在每个后端请求中。 我宁愿不简单地禁用 CSRF,所以我尝试以我可以在网上找到的几乎所有方式将此令牌包含到 POST 请求中:

  • 将目标更改为/login?_csrf=token
  • 插入<input type="hidden" name="_csrf"...到 Thymeleaf 表单中(这是默认行为,我检查它确实发送,但后端拒绝它??)
  • 从普通表单提交切换到 AJAX/fetch 并插入 X-XSRF-TOKEN header。 也不起作用,包括 JSON 和 x-www-form-urlencoded 编码请求。

有任何想法吗? 默认的 Spring Security /login POST 端点在请求中期望什么? 它对 CSRF 代币有何期待? 身份验证似乎有效,只是 CSRF 在成功登录时失败。 还是我完全想念的其他东西给了我403 Forbidden?

提前致谢!!

我的设置

Spring 引导版本:2.6.2

pom.xml 依赖项

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>com.zsoltfabok</groupId>
            <artifactId>sqlite-dialect</artifactId>
            <version>1.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

索引.html

<form th:action="@{/login}" method="post">
    <label for="username">Username</label>
    <input type="text" name="username" />
    <label for="password">Password</label>
    <input type="password" name="password" />
    <button type="submit">Submit</button>
<!-- there's also a hidden CSRF token generated automatically -->
</form>

WebSecurityConfigurerAdapter

@Configuration
@EnableGlobalAuthentication
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    // ...
    
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/favicon.ico").anonymous()
            .antMatchers("/static/**").anonymous()
            .mvcMatchers("/", "/login", "/signup").anonymous()
            .anyRequest().authenticated()
            .and()
            .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/")
            .and()
            .httpBasic()
            .and()
            .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    }
    
}

WebMvcConfigurer

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/login").setViewName("login");
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    }
    
}

Controller

@Controller
@RequestMapping("/")
public class WebController {

    @GetMapping
    public String index() {
        return "index";
    }
    
}

问题是您的安全规则。

.antMatchers("/favicon.ico").anonymous()
.antMatchers("/static/**").anonymous()
.mvcMatchers("/", "/login", "/signup").anonymous()

您将它们配置为匿名访问。 这意味着尚未经过身份验证的人。 它将阻止经过身份验证的用户访问任何这些 URL(或者如果您禁用匿名访问,则未经身份验证)。

修复允许使用permitAll()而不是anonymous()的任何人的访问权限。

.antMatchers("/favicon.ico").permitAll()
.antMatchers("/static/**").permitAll()
.mvcMatchers("/", "/login", "/signup").permitAll()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM