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

Spring 安全性 OAuth2 和 LDAP 身份验证到同一资源

越姚石
2023-03-14

我有 Spring Boot 2 REST 应用程序,我想配置 Spring Security 以支持 Google 登录或对相同资源的 LDAP 身份验证(例如/员工)

我已经通过httpBasic(它连接到Apache AD LDAP服务器)完成了身份验证。

此外,我还通过Google OAuth2登录设置了身份验证。这两种配置都可以单独正确工作(我可以通过 Google 登录进行身份验证,但不能同时使用 LDAP,因为我必须重新识别 Spring 安全性),现在我需要能够同时使用这两种方式进行身份验证。

LDAP验证的我的Spring Security配置

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
            .disable()
            .authorizeRequests()
            .antMatchers("/", "/login**","/callback/", "/webjars/**", "/error**")
            .permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .httpBasic()
            .and()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }


    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .ldapAuthentication()
                .ldapAuthoritiesPopulator(customLdapAuthoritiesPopulator)
                .userDnPatterns("uid={0},ou=people")
                .groupSearchBase("ou=groups")
                .contextSource()
                .url(env.getProperty("spring.ldap.urls") + env.getProperty("spring.ldap.base"))
                .and()
                .passwordCompare()
                .passwordAttribute("userPassword")
                .passwordEncoder(new LdapShaPasswordEncoder());
    }

当我为Google OAuth2登录重新配置Spring Security时,它的外观就是这样。

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
            .disable()
            .authorizeRequests()
            .antMatchers("/", "/login**","/callback/", "/webjars/**", "/error**")
            .permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .oauth2Login()
            .userInfoEndpoint().oidcUserService(customOAuth2UserService);
    }

我需要的结果是:用户有两个选项:使用Oauth2进行身份验证,或者,如果他愿意,使用httpBasic LDAP进行身份验证。

我想有一种方法可以配置Spring Security,让OAuth2和httpBasic LDAP协同工作,但是我不知道该怎么做。

共有1个答案

益源
2023-03-14

这是可能的。

基本身份验证使用基本身份验证,其中oauth使用承载作为头授权头的一部分。

我们可以使用自定义请求匹配器来检测基本身份验证,并使用ldap进行身份验证。如果没有,它会流过oauth。

首先,将WebSecurityConfigurerAdapter设置为高于Oauth认证服务器

@Configuration
@Order(2)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

使用我们的自定义请求映射器,

http
            .csrf()
            .disable()
            .requestMatcher(new BasicRequestMatcher())
            .authorizeRequests()
            .antMatchers("/", "/login**","/callback/", "/webjars/**", "/error**")
            .permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .httpBasic()
            .and()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

自定义请求匹配器,

 private static class BasicRequestMatcher implements RequestMatcher {
    @Override
    public boolean matches(HttpServletRequest request) {
        String auth = request.getHeader("Authorization");
        return (auth != null && auth.startsWith("Basic"));
    }
 类似资料:
  • 我正在尝试为正在进行的 spring-boot 项目实现身份验证和授权服务。我已经实现了一个基于 JPA 的身份验证提供程序,它工作正常。如何将 LDAP 身份验证提供程序添加到同一项目并根据用户身份验证类型在身份验证方法之间切换? 下面是我的代码 虽然我的LDAP证书是正确的,但它没有达到那个方法。如何从DB ex(LDAP、JPA、SSO)获取我的应用程序的身份验证方法,并执行相应的身份验证提

  • 但是该实现假设身份验证也是通过存储在数据库中的密码(@Password注释)完成的。我们希望根据LDAP对用户进行身份验证,然后根据存储在数据库中的内容分配角色。 是否有可用的教程/拦截器?我为每一个输入感到高兴? PS:quarkus安全ldap扩展不是解决方案,因为它假设角色也存储在ldap中。

  • 我正在尝试让JDBC身份验证与我的小辅助项目一起工作,从表面上看,它应该可以工作,但它没有。所有的配置都遵循贝娄。 如果我切换到具有相同用户名/密码的inMemory身份验证,它就会非常工作。 这是我记录输出时得到的结果:

  • 我为我的web页面和web服务实现了数据库身份验证。这两者都很好,现在我必须添加Ldap身份验证。我必须通过远程Ldap服务器(使用用户名和密码)进行身份验证,如果用户存在,我必须使用我的数据库作为用户角色(在我的数据库中,用户名是相同的Ldap用户名)。因此我必须从实际代码切换到上面解释的Ldap和数据库身份验证。我的代码是:SecurityConfig类 MyUserDetailsServic

  • 我正在开发REST webService,我的一些客户机将使用我的webservices,所以为了识别真正的客户机,我决定给每个真正的客户机一个唯一的应用程序令牌。客户机将对这个令牌进行编码,他们将把这个令牌放在请求头中,我已经在我的REST webservices中配置了一个REST过滤器来验证令牌。我不想使用https。我的问题是,任何人都可以从我的客户端站点获取该令牌,并可以使用我的REST