当前位置: 首页 > 知识库问答 >
问题:

Spring Security如何添加/配置AuthenticationManagerBuilder?

东郭骁
2023-03-14

我正在研究基于Spring SecurityJava配置。

我已经创建了自己的身份验证提供者(MyAuthenticationProvider),我想在ProviderManager中注册它(AuthenticationManager的单个实例)。

我发现ProviderManager有一个提供者列表,我可以向其中注册我的单个身份验证提供者。

以下是我的配置部分:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(MyAuthenticationProvider);
    }
}

我发现AuthenticationManagerBuilder父母身份验证管理器defaultUserDetailsService和许多其他字段。

我的问题是:

>

configureGlobal方法的名称并不重要。但是,重要的是仅在使用@EnableWebSecurity、@EnableWebMvcSecurity、@EnableGlobalMethod odSecurity或@EnableGlobalAuthentication注释的类中配置AuthenticationManagerBuilder。否则会产生不可预测的结果。

共有2个答案

郑西岭
2023-03-14

3的答案:

是的。AuthenticationManagerBuilder的代码添加了您的提供商:

public AuthenticationManagerBuilder authenticationProvider(AuthenticationProvider authenticationProvider) {
    this.authenticationProviders.add(authenticationProvider);
    return this;
}

4的答案很简单:

这意味着,一旦有了其中一个注释,就可以根据需要命名方法:

@Configuration
@EnableWebSecurity  //or @EnableWebMvcSecurity or @EnableGlobalMethodSecurity....
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void myCoolMethodName(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(MyAuthenticationProvider);
    }
}

“否则会产生不可预测的结果”

如果保留名称而不保留注释,则可能无法正常工作。

郜彦
2023-03-14

启用Web安全(EnableWebSecurity)由启用全局身份验证(EnableGlobalAuthentication)进行元注释

...
@EnableGlobalAuthentication
@Configuration
public @interface EnableWebSecurity {
...

和EnableGlobalAuthentication导入AuthenticationConfiguration:

...
@Import(AuthenticationConfiguration.class)
@Configuration
public @interface EnableGlobalAuthentication {
}

在AuthenticationConfiguration中,您将看到声明了一个AuthenticationManagerBuilder bean:

...
@Bean
public AuthenticationManagerBuilder authenticationManagerBuilder(
        ObjectPostProcessor<Object> objectPostProcessor, ApplicationContext context) {
    ...
}

当您在Autowire上安装AuthenticationManagerBuilder时,您将得到一个。您可以使用多种方法轻松配置内存、jdbc、ldap等,。。。身份验证。

背景:

Spring Security Java配置通过几个阶段将您的配置与ApplicationContext无缝结合。这两者结合在一起的一个地方是WebSecurityConfigurerAdapter中的getHttp()方法。

例如,这是一段摘录:

AuthenticationManager authenticationManager = authenticationManager();

authenticationBuilder.parentAuthenticationManager(authenticationManager);

为了让您了解配置顺序的“不简单”,上面的authenticationManager变量将是:

  • 您通过覆盖配置(AuthenticationManagerBuilder auth)添加的身份验证管理器

默认情况下,我的意思是会有一些[…]authenticationProviders已在AuthenticationManagerBuilder中注册

如果查看AuthenticationConfiguration,您将看到默认情况下,InitializeUserDetailsBeanManagerConfiguration应用于AuthenticationManagerBuilder bean。只要它在上下文中找到一个UserDetailsService bean,并且没有添加其他提供者,它就会添加一个DaoAuthenticationProvider。这就是为什么在Spring Security参考中,只提供@Bean用户详细信息服务(UserDetailsService)就足够了。

但是,一旦您添加了身份验证提供程序,则不会注册“默认”提供程序。

 类似资料:
  • 你知道 Puppet 能做微创手术吗? 通常,我们不希望将整个配置文件交由 Puppet 管理而仅仅是在配置文件中添加某项设置 — 尤其是如果该文件是由别人管理,我们不能覆盖它的情况。 一种简单而有用的方法是,如果配置文件中不存在指定的行就添加这行配置。例如: 添加一个内核模块名到配置文件 /etc/modules 告知内核在启动时加载此模块。 你可以使用一个 exec 资源达成此任务。下面的例子

  • 我有一个当地的库伯内特斯环境,我基本上是复制的。将kube/config文件添加到我的本地文件中,并将“上下文”、“用户”和“集群”信息添加到我当前的“.kube/config”文件中。没关系,我可以连接到本地文件。 但是我想用命令将这些信息添加到我的本地配置文件中。 因此,关于这个页面,我可以使用“证书颁发机构数据”作为参数,如下所示:--- 但它会抛出如上所述的错误。我用的是kubernete

  • 如果我没有在结构中定义构造函数,我可以通过如下方式选择某个值来初始化它: 但是如果我添加新的默认构造函数,那么我就会失去这个功能: 两种方式都有可能吗? 我尝试添加默认构造函数,但似乎也不起作用。

  • 我想向我的kafka集群添加新用户,方法似乎是在zookeeper数据库中添加SCRAM-SHA-512/256配置,但我只知道如何使用命令行实用程序来完成,如下所示: 有没有使用Kafka API for Java的替代方法?

  • 我启用了Swagger open API 3.0,如下所示: 添加了以下依赖项 之后添加了下面的bean进行定制。 一切正常。我可以访问swagger-用户界面和api文档。 但是我有几个使用keycloak OAuth 2.0保护的api。当我试图访问这些安全的api时,我收到了未经授权的错误(这是意料之中的)。我也想从swagger open api 3.0中测试安全的api。 有人能帮我在s

  • 有了Web框架和ORM框架,我们就可以开始装配App了。 通常,一个Web App在运行时都需要读取配置文件,比如数据库的用户名、口令等,在不同的环境中运行时,Web App可以通过读取不同的配置文件来获得正确的配置。 由于Python本身语法简单,完全可以直接用Python源代码来实现配置,而不需要再解析一个单独的.properties或者.yaml等配置文件。 默认的配置文件应该完全符合本地开