Spring Boot 安全性 403 重定向

Posted

技术标签:

【中文标题】Spring Boot 安全性 403 重定向【英文标题】:Spring Boot Security 403 redirect 【发布时间】:2016-10-26 06:36:56 【问题描述】:

我正在使用 Spring Boot Security 对应用程序的 LDAP 用户进行身份验证。默认情况下,此配置会将未经授权的用户重定向到登录页面。我想调整这个配置来实现两件事:

    将尝试访问单页应用程序(在“/”处)的未经身份验证的用户重定向到登录。这已经适用于默认行为。 对于 api 调用(“/api/v1/...”),我想返回 403 错误消息而不是重定向。

我该怎么做?我已经看到其他一些问题给了我提示,但我仍然无法弄清楚。

这篇文章的最佳答案似乎是相关的,但他链接到了一种 XML 方法来执行此操作。我想用Java来做。 Spring Security - need 403 error, not redirect

任何帮助将不胜感激!

这是我目前的设置:

WebSecurityConfig.java

@Override
protected void configure(HttpSecurity http) throws Exception 

    http
        .authorizeRequests()
        .antMatchers("/css/**").permitAll()
        .anyRequest().authenticated();
    http
        .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/", true)
            .permitAll()
            .and()
        .httpBasic()
            .and()
        .csrf().disable()
        .logout()
            .logoutSuccessUrl("/login");


【问题讨论】:

【参考方案1】:

找到了一个似乎可行的解决方案(到目前为止,至少)

@Bean
public AuthenticationEntryPoint delegatingEntryPoint() 
    final LinkedHashMap<RequestMatcher, AuthenticationEntryPoint> map = new LinkedHashMap();
    map.put(new AntPathRequestMatcher("/"), new LoginUrlAuthenticationEntryPoint("/login"));
    map.put(new AntPathRequestMatcher("/api_v1/**"), new Http403ForbiddenEntryPoint());

    final DelegatingAuthenticationEntryPoint entryPoint = new DelegatingAuthenticationEntryPoint(map);
    entryPoint.setDefaultEntryPoint(new LoginUrlAuthenticationEntryPoint("/login"));

    return entryPoint;


@Override
protected void configure(HttpSecurity http) throws Exception 

    //delegates based on url (api vs root)
    http.exceptionHandling().authenticationEntryPoint(delegatingEntryPoint());

    http
        .authorizeRequests()
        .antMatchers("/css/**").permitAll()
        .anyRequest().authenticated();
    http
        .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/", true)
            .permitAll()
            .and()
        .httpBasic()
            .and()
        .csrf().disable()
        .logout()
            .logoutSuccessUrl("/login");

希望这对以后的人有所帮助。我知道我花了很长时间才找到答案。 :)

【讨论】:

我认为与其使用 Http403ForbiddenEntryPoint,不如使用 HttpStatusEntryPoint 和 401(未授权)状态码。 LinkedHashMap 的初始入口(与“/”绑定的那个)可能不是必需的,因为无论如何默认入口点都会处理它。

以上是关于Spring Boot 安全性 403 重定向的主要内容,如果未能解决你的问题,请参考以下文章

Linux 第三天 重定负管道符环境变量

Spring Boot 安全性中的 HTTP 403 禁止错误

Spring Boot 安全性:请求的 url 创建了不需要的 redis 会话

Spring Boot HEAD 请求返回 403

自动 IIS6 403.4 重定向到 SSL 不起作用

Spring-Boot:用于重定向的 Web 过滤器