Spring Security 阻塞 Rest Controller
我的应用程序有 Spring boot 1.3.2,我正在尝试将 Spring MVC 与 Spring Security 结合使用。
我在 http://localhost:8080/admin 下有管理面板和我的普通用户页面内容在http://localhost:8080/下
如果您尝试打开管理面板 ( http://localhost:8080/admin ) 您必须登录,如果您是普通用户,只需输入 http://localhost:8080/玩得开心,无需登录。
我的安全配置类:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin")
.password("password")
.roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/**").permitAll()
.anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/login");
}
}
上面的配置让我要求从/admin 登录 但是我在使用管理面板功能时遇到了一些问题。
这是 Controller ,我正尝试从管理面板通过 POST 请求:
@RestController
@RequestMapping("/admin/v1")
public class AdminController {
@RequestMapping(value = "/logout", method = RequestMethod.POST)
public String logout(HttpServletRequest request, HttpServletResponse response) {
String hello = "hi!";
return hello;
}
}
所以我可以登录,浏览器为我呈现管理面板,但是当我单击注销按钮时,它从上面的 Controller 请求 POST 注销方法。 App 告诉我 403 Forbidden
谁能告诉我我做错了什么?
请您参考如下方法:
403 Forbidden 错误很可能是因为 spring 默认启用了 csrf 保护。 您可以在配置中禁用 csrf 或在 POST 方法中包含 CSRF token 。
在配置中禁用 csrf:
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/**").permitAll()
.anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/login")
.and()
.logout()
.logoutSuccessUrl("/admin/v1/logout");
在表单提交中包含 CSRF token :
<c:url var="logoutUrl" value="/admin/v1/logout"/>
<form action="${logoutUrl}" method="post">
<input type="submit" value="Log out" />
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。