ActiveDirectory認証を既存のSpringWebアプリに統合しています。
現在、ユーザーの詳細はDBテーブルに保存されており、UserDetailsService
ユーザーを認証するカスタムを実装しました。
いくつかのチュートリアルに従って、アプリケーションにActiveDirectoryLdapAuthenticationProviderを介してActive Directoryサポートを実装しました。これは基本的に機能しますが、より具体的なものが必要です。
ADグループをアプリケーションの役割にマッピングする代わりに、ADユーザーをWebアプリの既存のユーザーにマッピングする必要があります。つまり、Users
テーブル内のユーザーに対してのみAD認証を有効にしたいのです。ユーザーは、アプリケーションDBに既に登録されている場合にのみ、AD資格情報を介してアクセスできます。
各ユーザーの認証情報はDBに保存されます。このようにして、各ユーザーはDBユーザー+パスワードまたはADの両方を介して認証できます。
Spring Securityでこれを達成することは可能ですか?そしてどうやって?
注私はSpringv3.2.9とSpringSecurity v3.2.3を使用しています。
回避策として、カスタムAuthenticationProvider
とカスタムを実装しますUserDetailsContextMapper
。
BecouseActiveDirectoryLdapAuthenticationProvider
は、次のようにfinal
、ADCustomAuthenticationProvider
viaコンポジションを実装したクラスです。
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);
}
}
(LdapUserDetailsを拡張しないmapUserToContext
カスタムUserDetails
実装を使用しているため、メソッドを実装する必要があります。そのため、逆変換プロセスで例外がスローされる可能性があります...)
注この方法で、同じクエリを(Users
テーブルに対して)2回繰り返します...単一のクエリを作成し、AuthenticationProvider間で結果を共有し、AuthenticationProviderとUserDetailsContextMapper
.e間で結果を共有する方法を見つけたいと思いますUserDetailsContextMapper
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加