【问题标题】:LDAP + Spring: how to correctly authenticate?LDAP + Spring:如何正确认证?
【发布时间】:2019-10-01 12:18:42
【问题描述】:

我通过 Spring 实现了 LDAP 认证。就我而言,我使用ActiveDirectoryLdapAuthenticationProvider

看起来像这里:

    private Authentication authenticate(String username, String password, HelpDescUser userDetails) {
    String url = "ldap://" + ldapHost + ":" + port + "/";
    ActiveDirectoryLdapAuthenticationProvider ldapProvider =
            new ActiveDirectoryLdapAuthenticationProvider(domain, url, rootDn);
    String filterWithName = String.format(filter, username);
    ldapProvider.setSearchFilter(filterWithName);
    ldapProvider.setContextEnvironmentProperties(createProperties(username, password));
    ldapProvider.setConvertSubErrorCodesToExceptions(true);
    UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, password);

    Authentication authenticate;
    try {
        authenticate = ldapProvider.authenticate(authentication);
    } catch (Exception e) {
        throw new BadCredentialsException("Пользователь не авторизован (сервер LDAP не подтвердил авторизацию).");
    }
    if (Objects.nonNull(authenticate) && authenticate.isAuthenticated()) {
        return new UsernamePasswordAuthenticationToken(userDetails, password, userDetails.getAuthorities());
    } else {
        throw new BadCredentialsException("Пользователь не авторизован (сервер LDAP не подтвердил авторизацию).");
    }
}


private Map<String, Object> createProperties(String username, String password) {
        Map<String, Object> properties = new HashMap<>();
        properties.put(Context.SECURITY_PRINCIPAL, username);
        properties.put(Context.SECURITY_CREDENTIALS, password);
        return properties;
}

我有问题。

据我了解身份验证架构,当我们通过用户进行身份验证时,我们还需要有一个技术帐户。我们通过技术帐户绑定&比发送用户登录名&密码,&之后,我们收到答复。但是在这个模式中,我们绑定同一个用户进行身份验证,这是错误的——这个用户可能没有绑定权限。

请告诉我使用Spring ActiveDirectoryLdapAuthenticationProvider进行身份验证的有效解决方案?

【问题讨论】:

    标签: java spring ldap


    【解决方案1】:

    当你声明 ActiveDirectoryLdapAuthenticationProvider bean 时,你可以使用 setContextEnvironmentProperties() 方法。

    例如:

    @Bean
    public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
        ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider(null, ldapUrls, ldapBase);
        setContextEnvironmentProperties(provider);
        return provider;
    }
    
    private void setContextEnvironmentProperties(ActiveDirectoryLdapAuthenticationProvider provider) {
        Map<String, Object> contextEnvironmentProperties = new HashMap<>();
        if (StringUtils.isNotEmpty(ldapUsername)) {
            contextEnvironmentProperties.put(Context.SECURITY_PRINCIPAL, ldapUsername);
        }
        if (StringUtils.isNotEmpty(ldapPassword)) {
            contextEnvironmentProperties.put(Context.SECURITY_CREDENTIALS, ldapPassword);
        }
        if (!contextEnvironmentProperties.isEmpty()) {
            provider.setContextEnvironmentProperties(contextEnvironmentProperties);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-26
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 2011-11-17
      • 2015-08-12
      • 2012-10-09
      • 1970-01-01
      相关资源
      最近更新 更多