Spring 对同一资源的安全 OAuth2 和 Ldap 身份验证
Spring Security OAuth2 and Ldap authentication to the same resourse
我有 Spring Boot 2 REST 应用程序,我想配置 Spring 安全性以支持 Google 对相同资源(例如 /employees)的登录或 LDAP 身份验证)
我已经通过 httpBasic(连接到 Apache AD LDAP 服务器)完成了身份验证。
我还通过 Google OAuth2 登录设置了身份验证。
这两个配置分别正确工作(我可以通过 Google 登录进行身份验证,但不能同时使用 LDAP,因为我必须重新设置 spring 安全性),现在我需要能够同时使用这两种方式进行身份验证。
我的 Spring LDAP 身份验证安全配置
@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 重新配置 Spring 安全性时的样子
@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 安全性,因此 OAuth2 和 httpBasic LDAP 可以一起工作,但我不知道该怎么做。
有可能。
基本身份验证使用 basic,其中 oauth 使用 bearer 作为 header 授权 header 的一部分。
我们可以使用自定义请求匹配器来检测基本身份验证并使用 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 2 REST 应用程序,我想配置 Spring 安全性以支持 Google 对相同资源(例如 /employees)的登录或 LDAP 身份验证)
我已经通过 httpBasic(连接到 Apache AD LDAP 服务器)完成了身份验证。
我还通过 Google OAuth2 登录设置了身份验证。 这两个配置分别正确工作(我可以通过 Google 登录进行身份验证,但不能同时使用 LDAP,因为我必须重新设置 spring 安全性),现在我需要能够同时使用这两种方式进行身份验证。
我的 Spring LDAP 身份验证安全配置
@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 重新配置 Spring 安全性时的样子
@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 安全性,因此 OAuth2 和 httpBasic LDAP 可以一起工作,但我不知道该怎么做。
有可能。
基本身份验证使用 basic,其中 oauth 使用 bearer 作为 header 授权 header 的一部分。
我们可以使用自定义请求匹配器来检测基本身份验证并使用 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"));
}