【问题标题】:Kerb4j - How to get role name from SPNEGO Token?Kerb4j - 如何从 SPNEGO 令牌获取角色名称?
【发布时间】:2022-01-22 04:15:39
【问题描述】:

我正在尝试从 Active Directory 返回的 SPNEGO 令牌中获取角色名称,以用于 Spring Security 授权。我使用kerb4j 进行身份验证,因为我的理解是它可以使用this code 从令牌(而不是后续的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 仅获得 SID,例如 (S-1-2-20-132925241-12333....),而不是 AD 组名称,例如 ADMIN。怎么写ExtractGroupsUserDetailsService来提取群名? SPNEGO 令牌中是否提供此信息?

更新

简单地将hasRole SpEL 中的 ROLE_ADMIN 替换为 SID 不起作用。

更新 2

给定的 SID 字符串与传入 hasRole 的 SID 字符串不匹配,因为 hasRole 附加了 ROLE_ 传入的字符串。一旦我将ExtractGroupsUserDetailsService 更改为 SID 的前缀“ROLE_”(例如 ROLE_S-1-2-20-132925241-12333....),匹配就起作用了。

尽管如此...如何在 ExtractGroupsUserDetailsService 中获取组名(例如 ADMIN)而不是 SID?

【问题讨论】:

    标签: spring-security active-directory kerberos spnego spring-security-kerberos


    【解决方案1】:

    ExtractGroupsUserDetailsS​​ervice 仅获取诸如 (S-1-2-20-132925241-12333....) 之类的 SID,而不是诸如 ADMIN 之类的 AD 组名称。怎么写ExtractGroupsUserDetailsS​​ervice来提取组名呢? SPNEGO 令牌中是否提供此信息?

    不,Kerberos PAC 仅包含 SID,不包含名称。 (Windows 访问控制从不基于名称。)您仍然需要对这些名称进行 LDAP 搜索。

    【讨论】:

    • 这使得 PAC 数据无用,因为所有这些都可以离线发生,并且 LDAP 访问会给您的请求增加巨大的开销。使用 SID,喜欢 SID。
    • 我打算按照@Michael-O 的建议使用 SID。
    • 我建议将 SID 映射到应用程序中的逻辑角色。这也是我所做的。现在工作了 10 年。
    猜你喜欢
    • 2018-01-09
    • 1970-01-01
    • 2021-04-07
    • 2019-12-30
    • 1970-01-01
    • 2020-10-02
    • 2019-07-11
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多