デイブ、迅速な対応に感謝します。私は実際にあなたが参加した完璧な解決策を見つけました。それは「カスタム許可」トークン付与者と関係があります... https://jira.spring.io/browse/SECOAUTH-347
かなり古いバージョンの 1.0.0.M5 を更新していたら、それらについて知っていたかもしれません。
私のアプローチはAbstractTokenGranter
、カスタム許可タイプをサポートするクラスで拡張することでした (私はそれを「studentCard」と呼んでいます)。ここで認証リクエストが行われると、 と同じようResourceOwnerPasswordTokenGranter
にパラメーター リストを調べますが、代わりにカスタムの「cardNumber」パラメーターを探します。次に、独自の ID ベースのバージョンをUsernamePasswordAuthenticationToken
AuthenticationProvider に渡します。AuthenticationProvider は、ID カードに基づいてユーザーを認証する方法を知っています。
これが私が思いついたカスタム トークン グランター クラスです。
public class StudentCardTokenGranter extends AbstractTokenGranter {
private static final String GRANT_TYPE = "studentCard";
private final AuthenticationManager authenticationManager;
public StudentCardTokenGranter(AuthenticationManager authenticationManager,
AuthorizationServerTokenServices tokenServices, ClientDetailsService clientDetailsService) {
super(tokenServices, clientDetailsService, GRANT_TYPE);
this.authenticationManager = authenticationManager;
}
@Override
protected OAuth2Authentication getOAuth2Authentication(AuthorizationRequest clientToken) {
Map<String, String> parameters = clientToken.getAuthorizationParameters();
String cardNumber = parameters.get("cardNumber");
Authentication userAuth = new StudentCardAuthenticationToken(cardNumber);
try {
userAuth = authenticationManager.authenticate(userAuth);
} catch (BadCredentialsException e) {
// If the username/password are wrong the spec says we should send 400/bad grant
throw new InvalidGrantException(e.getMessage());
}
if (userAuth == null || !userAuth.isAuthenticated()) {
throw new InvalidGrantException("Could not authenticate student: " + cardNumber);
}
return new OAuth2Authentication(clientToken, userAuth);
}
}
そして私の認可サーバーの設定:
<!-- Issues tokens for both client and client/user authorization requests -->
<oauth:authorization-server client-details-service-ref="clientDetails" token-services-ref="tokenServices">
<oauth:refresh-token />
<oauth:client-credentials />
<oauth:password authentication-manager-ref="myUserManager" />
<oauth:custom-grant token-granter-ref="studentCardGranter" />
</oauth:authorization-server>
<bean id="studentCardGranter" class="com.api.security.StudentCardTokenGranter">
<constructor-arg name="authenticationManager" ref="myUserManager" />
<constructor-arg name="tokenServices" ref="tokenServices" />
<constructor-arg name="clientDetailsService" ref="clientDetails" />
</bean>