2014-07-06 3 views
1

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é à GETmy-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?

Répondre

8

Avec un peu d'aide de la RESTEasy documentation, j'ai découvert que pour RESTEasy d'honorer les @RolesAllowed annotations, il faut activer le commutateur de paramètre resteasy.role.based.security de contexte dans le fichier web.xml; ou par programme, comme je le fais:

final ServletHolder servletHolder = new ServletHolder(new HttpServlet30Dispatcher()); 
servletHolder.setInitParameter("javax.ws.rs.Application", MyApplication.class.getName()); 
servletHolder.setInitParameter("resteasy.role.based.security", String.valueOf(true)); 
contextHandler.addServlet(servletHolder, "/api/*");