![](/img/trans.png)
[英]Spring security in angularjs returns 403 forbidden for login
[英]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 表单中(这是默认行为,我检查它确实发送,但后端拒绝它??) 有任何想法吗? 默认的 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.