Spring Security 阻塞 Rest Controller

davidwang456 阅读:18 2024-11-01 17:39:52 评论:0

我的应用程序有 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> 


标签:Spring
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号