J'ai passé des heures à installer un service de connexion personnalisé dans Jetty 9.1.0.v20131115 et RESTEasy 3.0.5.Final. Mon service de connexion recherchera les utilisateurs dans une base de données et leur assignera des rôles. Il ressemble à ceci:Prise en charge de RESTEasy pour JAX-RS @RolesAllowed
final Constraint restConstraint = new Constraint();
restConstraint.setName(Constraint.__BASIC_AUTH);
restConstraint.setRoles(new String[]{"user", "admin");
restConstraint.setAuthenticate(true);
final ConstraintMapping restConstraintMapping = new ConstraintMapping();
restConstraintMapping.setConstraint(restConstraint);
restConstraintMapping.setPathSpec("/api/*");
final ConstraintSecurityHandler restSecurityHandler = new ConstraintSecurityHandler();
final LoginService myLoginService = new MyLoginService();
restSecurityHandler.setAuthenticator(new BasicAuthenticator());
restSecurityHandler.setRealmName(myLoginService.getName());
restSecurityHandler.addConstraintMapping(restConstraintMapping);
restSecurityHandler.setLoginService(myLoginService);
Je les utilisateurs joe-user
qui a le rôle de user
et jane-admin
qui a deux user
et admin
rôles. J'ai un REST GET
ressource nommée my-resource
marqués:
@RolesAllowed("admin")
Quand je fais une requête HTTP GET
sur my-resource
, le navigateur demande correctement les informations d'identification, et je peux vous connecter soit comme joe-user
ou jane-admin
. Le problème est que l'un ou l'autre utilisateur est autorisé à GET
my-resource
!!
J'ai parcouru une partie du code Jetty, et en effet, à la suite de mon service de connexion ci-dessus, Jetty demande à l'utilisateur de connexion quels rôles sont supportés. Malheureusement, Jetty acceptera tout des rôles que j'ai spécifiés dans restConstraint.setRoles(new String[]{"user", "admin")
, quel que soit l'utilisateur.
Apparemment, c'est la couche RESTEasy qui doit reconnaître l'annotation @RolesAllowed("admin")
et valider l'utilisateur. Mais comment puis-je obtenir RESTEasy pour le faire?