Я потратил часы на установку пользовательской службы входа в встроенный 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
. Проблема в том, что либо пользователю разрешено GET
my-resource
!!
Я проследил некоторые из кодов Jetty, и действительно, в результате моей службы входа выше, Jetty спрашивает пользователя входа в систему, какие роли поддерживаются. К сожалению, Jetty примет любые ролей, которые я указал в restConstraint.setRoles(new String[]{"user", "admin")
, независимо от пользователя.
По-видимому, это слой RESTEasy, который должен распознать аннотацию @RolesAllowed("admin")
и проверить пользователя. Но как мне заставить RESTEasy сделать это?