如何为 LDAP 和 JDBC 配置 Spring?

Posted

技术标签:

【中文标题】如何为 LDAP 和 JDBC 配置 Spring?【英文标题】:How to configure Spring for LDAP and JDBC? 【发布时间】:2015-04-11 18:50:12 【问题描述】:

在我的 Web 应用程序中,我必须使用 Spring Security 并使用 LDAP 获取用户的身份验证详细信息,并使用 JDBC 获取用户的授权详细信息。用户提交表单,我从中获取用户名和密码。

    如何在我的WebSecurityConfig 文件中获取用户名和密码? 如何配置授权和身份验证?

我的WebSecurityConfig

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests().anyRequest().authenticated().and().formLogin()
        .loginPage("/").permitAll();
    

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
            throws Exception 
        auth.ldapAuthentication().userDnPatterns("uid=0,ou=people")
                .groupSearchBase("ou=groups").contextSource(contextSource());
    

    @Bean
    public DefaultSpringSecurityContextSource contextSource() 
        DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource(
                "ldap://mjkoldc-03.red.com");
        contextSource.setUserDn("mj\\" + email);
        contextSource.setPassword(password);
        contextSource.setReferral("follow");
        contextSource.afterPropertiesSet();
        return contextSource;

    

之前我使用LDAPTemplate获取详细信息:

LdapQuery query = query().base("dc=metaljunction,dc=com")
            .attributes("GivenName", "sn", "mail", "MobilePhone")
            .where("ObjectClass").is("user").and("SamAccountName")
            .is(email);

【问题讨论】:

【参考方案1】:

如果您要再次验证 LDAP 和 Autorize(从 JDBC 获取用户角色),您应该实现 LdapAuthoritiesPopulator。

public class CustomAuthoritiesPopulator implements LdapAuthoritiesPopulator 

    @Override
    public Collection<? extends GrantedAuthority> getGrantedAuthorities(DirContextOperations userData, String username) 
        Collection<GrantedAuthority> gas = new HashSet<GrantedAuthority>();
        gas.add(new SimpleGrantedAuthority("ADMIN"));
        return gas;
    

并将其添加到您的 SecurityConfig

public class SecurityConfig extends WebSecurityConfigurerAdapter 

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
        auth        
            .ldapAuthentication()
                .ldapAuthoritiesPopulator(new CustomAuthoritiesPopulator())
                .userSearchFilter("yourfilter")             
            .contextSource(contextSource());    
    

这样,所有通过 LDAP 进行身份验证的用户都将自动获得“ROLE_ADMIN”。

【讨论】:

以上是关于如何为 LDAP 和 JDBC 配置 Spring?的主要内容,如果未能解决你的问题,请参考以下文章

如何为我的 Web 应用程序构建 LDAP 集成?

如何在春季测试 LDAP 安全配置?

Spring session jdbc - 如何为单个应用程序添加多个 HttpSessionIdResolver

如何为 DB2 的 JDBC 驱动程序配置 TCP keepAliveTimeout?

具有 BoneCP 连接池配置的 Spring JDBC 模板

如何为 DASH Plotly 应用程序实现 LDAP 身份验证?