gpt4 book ai didi

Spring-boot LDAP 自定义 UserDetails

转载 作者:行者123 更新时间:2023-12-03 17:43:58 44 4
gpt4 key购买 nike

我在 spring-boot 应用程序中使用 LDAP 身份验证(基于注释的配置)。我想自定义 UserDetails 对象。默认 UserDetails 实现是 LdapUserDetailsImpl 。我想扩展这个类并添加一些额外的 iterfaces 并绑定(bind)到 spring-security 中。
我的配置类:

@Configuration
protected static class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter {
@Autowired
private UserService userService;
@Autowired
private Environment env;

@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
AuthMethod authMethod = AuthMethod.valueOf(env.getRequiredProperty("auth_method"));
switch (authMethod) {
case LDAP:
auth.ldapAuthentication()
.userDnPatterns(env.getRequiredProperty("ldap.user_dn_patterns"))
.groupSearchBase(env.getRequiredProperty("ldap.group_search_base"))
.contextSource()
.url(env.getRequiredProperty("ldap.url"));
break;
default:
auth.userDetailsService(userService);
break;
}

}

@Bean
public LdapContextSource contextSource () {
LdapContextSource contextSource= new LdapContextSource();
contextSource.setUrl(env.getRequiredProperty("ldap.url"));
contextSource.setUserDn(env.getRequiredProperty("ldap.user"));
contextSource.setPassword(env.getRequiredProperty("ldap.password"));
contextSource.afterPropertiesSet();
return contextSource;
}
}

UserService 是自定义的身份验证方法(它是数据库/jpa 身份验证)。
UserDetails 访问器(当 auth 方法是 LDAP 时,它返回 LdapUserDetailsImpl 对象):
    @Component("activeUserAccessor")
public class ActiveUserAccessorImpl implements ActiveUserAccessor
{
public UserDetails getActiveUser()
{
return (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}
}

感谢您的帮助。

最佳答案

我的解决方案:

1.创建自定义UserDetailsContextMapper:

    @Bean
public UserDetailsContextMapper userDetailsContextMapper() {
return new LdapUserDetailsMapper() {
@Override
public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> authorities) {
UserDetails details = super.mapUserFromContext(ctx, username, authorities);
return new CustomLdapUserDetails((LdapUserDetails) details, env);
}
};
}

2.将UserDetailsContextMapper与LdapAuthenticationProviderConfigurer绑定(bind):
  auth.ldapAuthentication()
.userDetailsContextMapper(userDetailsContextMapper())
.userDnPatterns(env.getRequiredProperty("ldap.user_dn_patterns"))
.groupSearchBase(env.getRequiredProperty("ldap.group_search_base"))
.contextSource()
.url(env.getRequiredProperty("ldap.url"));

3.实现CustomLdapUserDetails(现在只改变isEnabled方法)。您可以向 CustomLdapUserDetails 添加一些额外的接口(interface)、方法并在 ActiveUserAccessor.getActiveUser() 中返回扩展类。
public class CustomLdapUserDetails implements LdapUserDetails {
private static final long serialVersionUID = 1L;

private LdapUserDetails details;
private Environment env;

public CustomLdapUserDetails(LdapUserDetails details, Environment env) {
this.details = details;
this.env = env;
}

public boolean isEnabled() {
return details.isEnabled() && getUsername().equals(env.getRequiredProperty("ldap.username"));
}

public String getDn() {
return details.getDn();
}

public Collection<? extends GrantedAuthority> getAuthorities() {
return details.getAuthorities();
}

public String getPassword() {
return details.getPassword();
}

public String getUsername() {
return details.getUsername();
}

public boolean isAccountNonExpired() {
return details.isAccountNonExpired();
}

public boolean isAccountNonLocked() {
return details.isAccountNonLocked();
}

public boolean isCredentialsNonExpired() {
return details.isCredentialsNonExpired();
}
}

关于Spring-boot LDAP 自定义 UserDetails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29007674/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com