gpt4 book ai didi

java - 使用不带 LoadTimeWeaving 的服务自定义 UserDetails

转载 作者:行者123 更新时间:2023-12-01 09:41:07 26 4
gpt4 key购买 nike

我需要使用对象列表进行访问控制。获取该列表的查询非常复杂且冗长,因此当用户通过服务器进行身份验证时,我想将其缓存在用户对象中。我决定尝试通过 UserDetailService 和 WebSecurityConfig 的自定义实现来解决这个问题:

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

...


@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
String ldapURI = "ldap://" + ldaHost + ":" + ldapPort + "/" + ldapBasis;

DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource(ldapURI);
contextSource.setUserDn(ldapUser);
contextSource.setPassword(ldapPassword);
contextSource.afterPropertiesSet();

LdapAuthenticationProviderConfigurer<AuthenticationManagerBuilder> ldapAuthenticationProviderConfigurer = auth
.ldapAuthentication().userDetailsContextMapper(new LdapUserDetailsContextMapper());

ldapAuthenticationProviderConfigurer
.userSearchFilter("(&(criteria={0}))")
.userSearchBase("ou=usersearchbase").contextSource(contextSource);
}
}

ContextMapper 用数据填充用户对象:

public class LdapUserDetailsContextMapper implements UserDetailsContextMapper {

private final org.slf4j.Logger log = LoggerFactory.getLogger(this.getClass());

private DataService dataService;

public UserDetails mapUserFromContext(DirContextOperations ctx, String username,
Collection<? extends GrantedAuthority> authorities) {

AppUser user = new AppUser();
user.setUsername(ctx.getStringAttribute("uid"));
user.setName(ctx.getStringAttribute("cn"));
user.setSurname(ctx.getStringAttribute("sn"));
user.setMail(ctx.getStringAttribute("mail"));
user.setRoleUser();

user.setManaged(dataService.getManagedData(user.getMail()));

return user;
}

问题是我看不到如何将我的 DataService 注入(inject)到这个进程中 - ContextMapper 和 @Configure 类都不是托管 bean,这使得 @Autowired 不可能。我想避免 LoadTimeWeaving 因为使用它会使部署变得非常困难 - 我还有其他选择吗?

我发现这两个类似的问题:Why is my Spring @Autowired field null?在Controller类中也有同样的问题,可以将其变成托管bean;其他提到的解决方案对我不起作用(dataService 始终为空)并且 Spring Boot, @Autowire into an unmanaged class using @Configurable and load time weaving再次推荐LoadTimeWeaving。

我还发现了明显的解决方案,提到在 init 方法中使用 @Autowired,但我也无法让它工作(尝试使用注入(inject)的 dataService 调用 ContextMapper 构造函数)

最佳答案

只需将其设为 Spring 管理的 bean 即可。

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

...


@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
String ldapURI = "ldap://" + ldaHost + ":" + ldapPort + "/" + ldapBasis;

DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource(ldapURI);
contextSource.setUserDn(ldapUser);
contextSource.setPassword(ldapPassword);
contextSource.afterPropertiesSet();

LdapAuthenticationProviderConfigurer<AuthenticationManagerBuilder> ldapAuthenticationProviderConfigurer = auth
.ldapAuthentication().userDetailsContextMapper(userDetailsContextMapper());

ldapAuthenticationProviderConfigurer
.userSearchFilter("(&(criteria={0}))")
.userSearchBase("ou=usersearchbase").contextSource(contextSource);
}
@Bean
public LdapUserDetailsContextMapper userDetailsContextMapper() {
return new LdapUserDetailsContextMapper();
}
}

并使用 @Autowired 注释 LdapUserDetailsContextMapper 内的字段。

关于java - 使用不带 LoadTimeWeaving 的服务自定义 UserDetails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38433283/

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