使用 Spring Security Java 配置时禁用基本身份验证

Posted

技术标签:

【中文标题】使用 Spring Security Java 配置时禁用基本身份验证【英文标题】:Disable Basic Authentication while using Spring Security Java configuration 【发布时间】:2014-10-27 15:37:47 【问题描述】:

我正在尝试使用 Spring Security java 配置来保护 Web 应用程序。

这是配置的样子:-

@Configuration
@EnableWebMvcSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter 

    private String googleClientSecret;

    @Autowired
    private CustomUserService customUserService;

    /*
     * (non-Javadoc)
     * 
     * @see org.springframework.security.config.annotation.web.configuration.
     * WebSecurityConfigurerAdapter
     * #configure(org.springframework.security.config
     * .annotation.web.builders.HttpSecurity)
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception 

        // @formatter:off
        http
            .authorizeRequests()
                .antMatchers(HttpMethod.GET, "/","/static/**", "/resources/**","/resources/public/**").permitAll()
                .anyRequest().authenticated()
            .and()
                .formLogin()
                    .and()
                .httpBasic().disable()
            .requiresChannel().anyRequest().requiresSecure();
        // @formatter:on
        super.configure(http);
    

    @Override
    protected void configure(AuthenticationManagerBuilder auth)
            throws Exception 
        // @formatter:off
        auth
            .eraseCredentials(true)
            .userDetailsService(customUserService);
        // @formatter:on
        super.configure(auth);
    

请注意,我已使用以下命令明确禁用 HTTP Basic 身份验证:-

.httpBasic().disable()

在访问安全 URL 时,我仍然收到 HTTP Authenticaton 提示框。为什么?

请帮我解决这个问题。 我只想呈现捆绑的默认登录表单。

Spring Boot Starter 版本:1.1.5 Spring 安全版本:3.2.5

谢谢

【问题讨论】:

security.basic.enabled=false 添加到您的application.properties。此外,您不应该从覆盖的方法中调用 super.configure @M.Deinum 修复了它。但是为什么我在 java config 中明确禁用时它没有被禁用? 您可以有多个WebSecurityConfigurer,每个配置对整体配置都有贡献。很可能您的网站的其余部分受到基本身份验证和带有表单的普通网站的保护。您可以创建 2 个WebSecurityConfigurer 一个用于休息,一个用于形式。您可能还想查看docs.spring.io/spring-boot/docs/current/reference/html/…(Spring Boot 参考,安全部分)。 @M.Deinum 你不需要在 *Configurer 类中调用原始实现,它们只是用一个空的主体实现接口的所有方法,所以你可以覆盖你想要的使用。 我遇到了类似的问题,security.basic.enabled=false 不再可用。任何其他解决方案。 @M.Deinum 【参考方案1】:

首先,调用super.configure(http); 将覆盖您之前的整个配置。

试试这个:

http
    .authorizeRequests()
        .anyRequest().authenticated()
        .and()
    .formLogin()
        .and()
    .httpBasic().disable();

【讨论】:

小修正..应该是.httpBasic().disable()。 我很抱歉,但我是 java 新手,我们使用的是带角度前端和 java 后端的 jhipster。我在哪里插入此代码?这是在网关吗?还是微服务?应该寻找什么文件?谢谢 - @GelSisaed 这可能完全是一个单独的问题。通常,这取决于您在哪里进行身份验证,但是对于 jhipster,在网关中进行身份验证是非常典型的,所以这就是我要开始的地方。发布您自己的问题(带有 jhipster 标签)也不错,例如“如何在 JHipster 中禁用 HTTP Basic?”【参考方案2】:

如果您使用 Spring Boot,documentation 声明:

在 Web 中完全关闭引导默认配置 应用程序,您可以使用 @EnableWebSecurity 添加一个 bean

因此,如果您想完全自定义自己,这可能是一种选择。

只是为了说清楚......您只需将@EnableWebSecurity 注解放在您的主应用程序类或应用程序配置类上。

【讨论】:

这对我不起作用(我将 @EnableWebSecurity 放在我的主 Spring Boot 类上并扩展了 WebSecurityConfigurerAdapter)。 “使用@EnableWebSecurity 添加一个bean”实际上意味着什么?【参考方案3】:

您可以通过 HttpSecurity 实例禁用 formLogin,如下所示:

http.authorizeRequests().antMatchers("/public/**").permitAll()
        .antMatchers("/api/**").hasRole("USER")
        .anyRequest().authenticated() 
        .and().formLogin().disable();

这将导致在尝试访问任何安全资源时收到 403 Http 错误

【讨论】:

【参考方案4】:

匿名选项对我有用。我的代码喜欢

  http.csrf().disable().headers().frameOptions().sameOrigin().and().
   authorizeRequests().anyRequest().anonymous().and().httpBasic().disable();

【讨论】:

【参考方案5】:

适合 Spring Boot 或使用 OAuth 的人

@Profile("test")
@EnableWebSecurity
static class BasicWebSecurityConfiguration extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.csrf().disable().authorizeRequests().anyRequest().anonymous().and().httpBasic().disable();
    

如果您使用@EnableOAuth2Client 或@EnableResourceServer,则在测试配置文件中切换到基本身份验证,然后将其禁用。在 Spring Boot 中,要在 Web 应用程序中完全关闭 Spring Security 默认配置,您需要添加一个带有 @EnableWebSecurity 的 bean

【讨论】:

【参考方案6】:

以下内容对我有用:

            http
                .authorizeRequests()
                .anyRequest().permitAll();

【讨论】:

这不会禁用基本安全,它只会忽略所有请求的安全检查。

以上是关于使用 Spring Security Java 配置时禁用基本身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security + Auth LDAP:BindRequest 和 UnbindRequest?

Spring Security 4 和 JSF 2 集成

如何使用 Spring-Security 3 和 Hibernate 4 将 spring security xml 配置 hibernate 转换为 java config

使用带有 Java 配置的 Spring Security 注销

Spring Security入门(2-2)Spring Security 的运行原理 2

Spring Security sec:使用 Java Config 授权标签