J'essaie de créer un SPI personnalisé avec un point de terminaison REST personnalisé, qui devrait authentifier et autoriser les demandes entrantes en évaluant les autorisations sur les ressources demandées. Avec l'aide du débogueur, j'ai découvert que je devais utiliser la classe TokenEndpoint.java et appeler la méthode permissionGrant () dans ma méthode REST-handler, mais lorsque j'essaie de créer une instance de TokenEndpoint, j'ai une erreur avec REASTEASY et Keycloak se bloque. Avez-vous des exemples, comment puis-je faire cela?
3 Réponses :
Essayez de regarder ces exemples java dans la documentation. https://www.keycloak.org/docs/latest/authorization_services/ index.html # _authorization_quickstarts
Merci pour votre réponse, mais je dois modifier Keycloak lui-même sans utiliser le client Keycloak. J'ai besoin d'un point de terminaison REST personnalisé comme dans cet exemple keycloak.org/docs/latest / server_development /… . Je peux authentifier l'utilisateur et même obtenir ses rôles, mais j'ai également besoin d'une autorisation pour obtenir des autorisations sur les ressources (onglet Autorisation dans les paramètres du client).
@VyacheslavSamsonov nous sommes confrontés au même problème si vous êtes en mesure de résoudre le problème, il sera d'une grande aide si vous pouviez partager votre solution avec la communauté, nous essayons également de sécuriser un point de terminaison de repos personnalisé ... en utilisant un jeton d'accès
Cette réponse ne répond pas à la question.
Je suggère de jeter un œil au projet suivant: keycloak-avatar-minio -extension .
Vous devez d'abord implémenter un RealmResourceProdiverFactor et un RealmResourceProdiver.
Deuxièmement, vous avez besoin d'une ressource qui est retournée lorsque la fonction getResource () de votre RealmResourceProvider est déclenchée.
Votre ressource est une classe dans laquelle vous définissez votre point de terminaison. Pour vérifier l'autorisation, vous pouvez créer une méthode comme celle-ci:
private AuthenticationManager.AuthResult resolveAuthentication(KeycloakSession session) { AppAuthManager appAuthManager = new AppAuthManager(); RealmModel realm = session.getContext().getRealm(); AuthenticationManager.AuthResult authResult = appAuthManager.authenticateIdentityCookie(session, realm); if (authResult != null) { return authResult; } return null; }
Cette méthode est appelée dans le constructeur et définit le private final AuthenticationManager.AuthResult auth; code > variable dans votre ressource.
Maintenant, dans votre implémentation de point de terminaison, vous pouvez simplement vérifier si auth
n'est pas nul, ou, si nécessaire, faire des choses plus sophistiquées comme l'inspection de l'utilisateur ou du jeton qui est disponible dans votre Variable auth
.
J'ai récemment été confronté au même problème. En général, la réponse de Val est correcte. Pour faire fonctionner son code, nous avons dû ajouter une dépendance au module keycloak-services. Vous avez besoin à la fois d'une dépendance à la compilation (n'ajoutez pas de jar dans les bibliothèques ear) et d'une dépendance de module. Un bon exemple de la façon de procéder est https://github.com/dteleguin/beercloak p >
Les spots à regarder:
Dans les nouvelles versions, l'authentification ne fonctionne pas dans le constructeur, elle doit être effectuée dans la méthode getResource ()
.