2014-07-06 1 views
1

Я потратил часы на установку пользовательской службы входа в встроенный Jetty 9.1.0.v20131115 и RESTEasy 3.0.5.Final. Моя служба входа в систему будет искать пользователей в базе данных и назначать им роли. Это выглядит примерно так:Поддержка RESTEasy для 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); 

У меня есть пользователи, которые joe-user играет роль user и jane-admin, который имеет как user и admin роли. У меня есть REST GET ресурс по имени my-resource отмечены:

@RolesAllowed("admin") 

Когда я делаю HTTP GET на my-resource, браузер правильно запрашивает учетные данные, и я могу войти в любой joe-user или jane-admin. Проблема в том, что либо пользователю разрешено GETmy-resource !!

Я проследил некоторые из кодов Jetty, и действительно, в результате моей службы входа выше, Jetty спрашивает пользователя входа в систему, какие роли поддерживаются. К сожалению, Jetty примет любые ролей, которые я указал в restConstraint.setRoles(new String[]{"user", "admin"), независимо от пользователя.

По-видимому, это слой RESTEasy, который должен распознать аннотацию @RolesAllowed("admin") и проверить пользователя. Но как мне заставить RESTEasy сделать это?

ответ

8

С небольшой помощью от RESTEasy documentation, я узнал, что для того, чтобы Resteasy, чтобы чтить @RolesAllowed аннотаций, необходимо включить переключатель параметров resteasy.role.based.security контекста в файле web.xml; или программно, как я это делаю:

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/*"); 
Смежные вопросы