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

将多个Spring Security身份验证提供者组合为定制的单个提供者

尚鸿才
2023-03-14

我的目标是使用凭据进行两步身份验证。第一步是检查具有主体的用户是否在特殊数据库表中具有角色。其次是执行标准ldap身份验证。

我需要的是同时执行这两项检查,但身份验证提供程序的常见方法是在任何身份验证提供程序首次成功后声明身份验证成功。因此,我决定创建一个自定义的 AuthenticationProvider 实现,它调用 LdapAuthenticationProvider,然后执行数据库检查逻辑,但它不起作用,因为没有什么可以自动连接 AbstractLdapAuthenticationProvider。

请告诉我是否

  1. 解决此类问题的方法是理性的
  2. 如果它是理性的,我如何注入AbstractLdapAuth的提供者?

安全配置代码为

@Autowired
private DBRoleAuthenticationProvider dbRoleAuthenticationProvider;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.ldapAuthentication()
            .contextSource()
            .url("...")
            .managerDn("...")
            .managerPassword("...")
            .and()
            .userSearchFilter("uid={0}");
    auth.authenticationProvider(dbRoleAuthenticationProvider);
}

自定义身份验证提供程序是

@Component
public class DBRoleAuthenticationProvider implements AuthenticationProvider {

    @Autowired
    private UserHasRoleInDBService userHasRoleInDBService;

    @Autowired
    private AbstractLdapAuthenticationProvider ldapAuthenticationProvider;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        authentication = ldapAuthenticationProvider.authenticate(authentication);
        if (!authentication.isAuthenticated()) {
            return authentication;
        }
        try {
            String loginToSearch = (String) authentication.getPrincipal();
            if (!userHasRoleInDBService.userHasRole(loginToSearch)) {
                authentication.setAuthenticated(false);
            }
        } catch (Exception e) {
            authentication.setAuthenticated(false);
        }
        return authentication;
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
}

提前感谢!

共有1个答案

锺离声
2023-03-14

看起来像<code>身份验证。身份验证提供程序(dbRoleAuthenticationProvider)正在击败auth.ldapAuthentication()

您应该通过查看LdapAuthenticationProviderConfigurer的userDetailsContextMapper(UserDetailsContentMapper userDetails ContextMaper)和ldapAuthoritiesPopulator(Ldapauthorities PopulatorldapAuthentitiesPopulattor)文档来自定义为经过身份验证的用户检索权限的方式

 类似资料:
  • 问题内容: 我的Web应用程序有多个身份验证管理器(一个用于API,一个用于WEB访问)。该api应该仅具有基本的身份验证服务- 通过spring安全标记进行配置,如下所示: 我无法内联身份验证提供程序,因为我希望它可以被子bean配置覆盖。 我的问题是我无法在security:authentication-provider元素上定义别名/ id以在身份验证管理器中引用它。有一个简单的解决方法吗?

  • 我在调试身份验证问题时遇到了这个代码片段: 我在调试和摆弄用户凭证时注意到,如果第一个身份验证提供者(即< code > userdailsservice )无法对我的用户进行身份验证,那么就会远程调用我的LDAP服务器来尝试对我的用户进行身份验证。但是,如果第一个身份验证提供者成功地对我的用户进行了身份验证,则不会调用第二个身份验证提供者。 我的问题是,列出这些身份验证提供者的工作方式是否使得如

  • 问题内容: 使用Passport.js是否可以为同一路由指定多个身份验证提供程序? 例如(在护照指南中),我可以在以下示例路线中使用本地策略以及Facebook和Twitter策略吗? 问题答案: Passport的中间件的构建方式使您可以在一个呼叫中使用多种策略。 但是,它是用OR顺序定义的。也就是说,只有在所有策略均未成功返回的情况下,它才会失败。 这是您将如何使用它: 换句话说,使用它的方法

  • 我的问题是,我希望有两个身份验证提供商 之前:我有我的UserDetailServiceImpl,我根据数据库中的数据验证了用户的身份(不确定是哪个提供者) 现在:我使用了ActiveDirectoryLdapAuthentiation提供程序,如下所示 我成功了,所以我可以认证。 问题是: 我现在无法再使用数据库用户登录,现在只有LDAP。 未使用UserDetailsService,因此用户具

  • 我希望我的web应用程序的用户通过LDAP和额外的自定义身份验证进行身份验证。这是一个用Kotlin编写的Spring Boot应用程序。我将AuthenticationManagerBuilder配置为 我希望链接身份验证,以便如果CustomAuthenticationProvider成功地进行身份验证(函数authenticate不抛出),身份验证将继续使用LDAP身份验证提供程序。 正如所

  • 我正在尝试创建一个委托身份验证提供程序来执行逻辑,然后根据一些任意逻辑决定选择哪个身份验证提供程序;为了这个例子,如果用户名以前缀开头。 我当前的SecurityConfig将一次尝试一个身份验证提供程序: 根据用户名,我想选择是否要使用try a provider,这样,如果用户名不是以特定前缀(“ldap”、“custom”、“ad”等)开头,它们就不会被调用...),所以: 我似乎无法以这种