我的应用程序有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登录 但是我在管理面板功能方面遇到了一些问题。
这是控制器我试图通过管理员面板请求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
有谁能告诉我我做错了什么?
答案 0 :(得分:1)
最有可能403 Forbidden错误是因为弹簧默认启用csrf保护。 您可以在配置中禁用csrf或在POST方法中包含CSRF令牌。
在config中禁用csrf:
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/**").permitAll()
.anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/login")
.and()
.logout()
.logoutSuccessUrl("/admin/v1/logout");
在表单提交中包含CSRF令牌:
<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>