我正试图从Active Directory返回的SPNEGO令牌中获取角色名称,以便与Spring Security授权一起使用。我使用kerb4j进行身份验证,因为我的理解是,它可以通过使用此代码从令牌(而不是随后的LDAP查询(中获取组(即角色(信息。
在我的Spring web安全配置中,我有以下内容:
class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Value("${app.service-principal}")
private String servicePrincipal;
@Value("${app.keytab-location}")
private String keytabLocation;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.exceptionHandling()
.authenticationEntryPoint(spnegoEntryPoint())
.and()
.authorizeRequests().antMatchers("/", "/home").permitAll()
.antMatchers("/hello").access("hasRole('ROLE_ADMIN')")
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login").permitAll()
.and()
.logout().permitAll().and() //spring
.addFilterBefore(spnegoAuthenticationProcessingFilter(authenticationManagerBean()),
BasicAuthenticationFilter.class);
}
@Bean
public SpnegoAuthenticationProvider kerberosServiceAuthenticationProvider() {
SpnegoAuthenticationProvider provider = new SpnegoAuthenticationProvider();
provider.setTicketValidator(sunJaasKerberosTicketValidator());
provider.setExtractGroupsUserDetailsService(new ExtractGroupsUserDetailsService());
provider.setServerSpn(servicePrincipal);
return provider;
}
ExtractGroupsUserDetailsService
仅获得诸如(S-1-2-20-132925241-12333…(之类的SID,而不是诸如ADMIN之类的AD组名称。如何编写ExtractGroupsUserDetailsService
来提取组的名称?SPNEGO令牌中有此信息吗?
更新
简单地用SID替换hasRole
SpEL中的ROLE_ADMIN是行不通的。
更新2
给定的SID字符串与传递到hasRole
中的SID字符串不匹配,因为hasRole
会将传递的字符串附加到ROLE_
中。一旦我将CCD_ 7改为前缀"0";ROLE_";到SID(例如ROLE_S-1-2-20-132925241-12333…(,匹配起作用。
尽管如此。。。如何在ExtractGroupsUserDetailsService
中获取组名(例如ADMIN(而不是SID?
ExtractGroupsUserDetailsService只获取SID(如S-1-2-20-132925241-12333…(,而不获取AD组名(如ADMIN(。如何编写ExtractGroupsUserDetailsService来提取组的名称?SPNEGO令牌中有此信息吗?
否,Kerberos PAC只包含SID,不包含名称。(Windows访问控制从不基于名称。(您仍然需要对这些名称进行LDAP搜索。