我对Spring很新。
我的目标是让一些AuthenticationProvider
使用自定义authenticate
方法,该方法将Authenticate
对象作为参数,而不仅仅是用户名和密码。让我们说一个领域名称(当他们在不同的领域时,可以有2个用户具有相同的用户名)。我已经找到了我的问题的答案,但是关于身份验证问题的简单答案只解释了如何扩展AbstractUserDetailsAuthenticationProvider
,这不能满足我的需求,因为检索方法只需要用户名作为参数,而我需要领域名称以及检索用户。复杂的是关于扩展或实现各种不同的Spring类和接口,而不解释上下文。
所以简单的问题是:
如何实现/扩展AuthenticationProvider
以便能够从Authentication
对象中读取自定义数据?
我的通话看起来像这样(是的,我想获得一个OAuth2令牌):
curl -vX POST http://localhost:9001/oauth/token \
-d "client_id=myId&client_secret=secret&grant_type=password&username=myUser&password=1234&realm=realm3"
注意最后的realm=realm3
。
没有额外数据和我自己的AbstractUserDetailsAuthenticationProvider
子类的调用在只有一个领域时已经有效。
提前致谢!
答案 0 :(得分:1)
我如何实现/扩展AuthenticationProvider 能够从Authentication对象中读取自定义数据吗?
<强> RealmAuthenticationProvider 强>
public class RealmAuthenticationProvider implements AuthenticationProvider {
private RUPAuthenticator rupAuthenticator;
public RealmAuthenticationProvider(RUPAuthenticator rupAuthenticator) {
this.rupAuthenticator = rupAuthenticator;
}
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
Object principal = authentication.getPrincipal();
Object credentials = authentication.getCredentials();
Object realm = authentication.getDetails();
if (rupAuthenticator.authenticate(principal, credentials, realm)) {
List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>();
grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER")); //use any GrantedAuthorities you need
return new RealmAuthenticationToken(principal, credentials, realm, grantedAuths);
};
return null;
}
@Override
public boolean supports(Class<?> authentication) {
return RealmAuthenticationToken.class.isAssignableFrom(authentication);
}
}
<强> RealmAuthenticationToken 强>
public class RealmAuthenticationToken extends UsernamePasswordAuthenticationToken {
private Object realm;
public RealmAuthenticationToken(Object principal, Object credentials, Object realm, Collection<? extends GrantedAuthority> authorities) {
super(principal,credentials, authorities);
this.realm = realm;
}
}
<强> RUPAuthenticator 强>
public interface RUPAuthenticator {
boolean authenticate(Object username, Object password, Object realm);
}
您只需要为RUPAuthenticator提供一个实现,说明用户名,密码,领域组合是否正确。
然后将自定义AuthenticationProvider(RealmAuthenticationProvider)注册为bean。 以下是接受来自特定用户的请求的身份验证提供程序的示例:
@Bean
public AuthenticationManager authenticationManager() {
List<AuthenticationProvider> providers = new ArrayList<AuthenticationProvider>();
providers.add(new RealmAuthenticationProvider(new RUPAuthenticator() {
@Override
public boolean authenticate(Object username, Object password, Object realm) {
return (username.equals("sa") && password.equals("sa") && realm.equals("realm2"));
}
}));
return new ProviderManager(providers);
}
我希望这就是你要找的东西。