RESTEasy支持JAX-RS @RolesAllowed

时间:2014-07-06 00:52:46

标签: jax-rs resteasy embedded-jetty

我花了好几个小时在嵌入式Jetty 9.1.0.v20131115和RESTEasy 3.0.5.Final中安装自定义登录服务。我的登录服务将在数据库中查找用户并为其分配角色。它看起来像这样:

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的角色为userjane-admin同时拥有useradmin个角色。我有一个名为GET的REST my-resource资源标记为:

@RolesAllowed("admin")

当我在GET上执行HTTP my-resource时,浏览器会正确请求凭据,我可以joe-userjane-admin登录。问题是允许任何一个用户GET my-resource !!

我已经跟踪了一些Jetty代码,实际上,由于我的登录服务,Jetty询问登录用户支持哪些角色。不幸的是,Jetty将接受我在restConstraint.setRoles(new String[]{"user", "admin")中指定的任何角色,无论用户是谁。

显然,RESTEasy层应该识别@RolesAllowed("admin")注释并验证用户。但是我如何让RESTEasy去做呢?

1 个答案:

答案 0 :(得分:8)

RESTEasy documentation的一点帮助下,我发现为了让RESTEasy遵守@RolesAllowed注释,必须打开resteasy.role.based.security上下文参数开关web.xml 1}}文件;或者以编程方式,正如我所做的那样:

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/*");