gpt4 book ai didi

java - Spring 安全 : how to map Active Directory users to application users?

转载 作者:行者123 更新时间:2023-11-30 08:58:51 27 4
gpt4 key购买 nike

我正在将 Active Directory 身份验证集成到现有的 Spring Web 应用程序中。

目前用户详细信息存储在数据库表中,我实现了自定义 UserDetailsS​​ervice 来验证用户。

按照几个教程,我通过 ActiveDirectoryLdapAuthenticationProvider 实现了 Active Directory 支持在我的应用程序中,它基本上可以工作,但我需要更具体的东西。

不是将 AD 组映射到应用程序角色,我需要将 AD 用户映射到我的网络应用程序中的现有用户。换句话说,我只想为我的 Users 表中的用户启用 AD 身份验证。用户可以通过 AD 凭据访问 ONLY IF 已经在应用程序数据库中注册。

每个用户的授权信息都存储在数据库中。这样,每个用户都可以通过数据库用户+密码或通过 AD 进行身份验证。

是否可以使用 Spring Security 实现这一点?如何?

注意我使用的是 Spring v 3.2.9 和 Spring Security v 3.2.3

最佳答案

作为解决方法,我实现了自定义 AuthenticationProvider 和自定义 UserDetailsContextMapper

因为 ActiveDirectoryLdapAuthenticationProvider 是一个 final 类,所以我通过组合实现了 ADCustomAuthenticationProvider,这样:

public class ADCustomAuthenticationProvider implements AuthenticationProvider {

@Autowired
private ActiveDirectoryLdapAuthenticationProvider adAuthProvider;
@Autowired
private UserDao uDao;

@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
String principal = authentication.getPrincipal().toString();
String username = principal.split("@")[0];
User utente = uDao.findByUsername(username);
if (utente == null) {
throw new ADUnregisteredUserAuthenticationException("user ["
+ principal + "] is not registered");
}
return adAuthProvider.authenticate(authentication);
}

@Override
public boolean supports(Class<?> authentication) {
return adAuthProvider.supports(authentication);
}

}

在映射器中,我扩展了 LdapUserDetailsMapper,仅实现了 mapUserFromContext 方法。

public class ADCustomUserDetailsContextMapper extends LdapUserDetailsMapper {

@Autowired
private UserDetailsService userDetailsService; // ... the service used for DB authentication

@Override
public UserDetails mapUserFromContext(DirContextOperations ctx,
String username, Collection<? extends GrantedAuthority> authorities) {
return userDetailsService.loadUserByUsername(username);
}
}

(我可能需要实现 mapUserToContext 方法,因为我使用的是未扩展 LdapUserDetails 的自定义 UserDetails 实现,因此反向转换过程可能会引发异常...)

注意 这样我重复相同的查询(对 Users 表)两次...我想找到一种方法来进行单个查询并在 AuthenticationProvider 和 UserDetailsContextMapper 之间共享结果。在 AuthenticationProvider 和 UserDetailsContextMapper 之间共享结果。

关于java - Spring 安全 : how to map Active Directory users to application users?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27480354/

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