Dave, vielen Dank für die schnelle Antwort. Ich fand tatsächlich die perfekte Lösung, eine, an der Sie teilgenommen haben. Es hat mit "Custom-Grant" -Token-Graner zu tun ... https://jira.spring.io/browse/SECOAUTH-347
Hatte ich meine ziemlich alte Version 1.0.0.M5 aktualisiert, die ich vielleicht gewusst hätte über diese.
Mein Ansatz war AbstractTokenGranter
mit einer Klasse zu erweitern, die einen benutzerdefinierten Zuschuss Typen unterstützt (ich nenne es „Student“). Sobald eine Authentifizierungsanfrage hier angekommen ist, untersuche ich die Parameterliste genau wie ResourceOwnerPasswordTokenGranter
, suche aber stattdessen nach meinem benutzerdefinierten Parameter "cardNumber". Ich übergebe dann meine eigene ID-basierte Version von UsernamePasswordAuthenticationToken
an meinen AuthenticationProvider, der weiß, wie man Benutzer anhand der ID-Karte authentifiziert. Hier
ist der Brauch Token granter Klasse kam ich mit:
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);
}
}
Und mein Autorisierungsserver config:
<!-- 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>
Ich suchte auch nach etwas ähnlichem. aber 'AbstractTokenGranter' hat 4 Argumente in seinem Konstruktor, so dass 'Super'-Aufruf einen Kompilierungsfehler im obigen Beispiel zeigt. –
Ich habe die Lösung gefunden, für meine Abfrage hier. http://stackoverflow.com/questions/25264358/spring-security-oauth2-with-custom-tokengranter-in-version-2-0/25270572#25270572 –