jax-rs - RESTEasy 支持 JAX-RS @RolesAllowed

标签 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-userjane-admin 都有 user 的角色code> 和 admin 角色。我有一个名为 my-resource 的 REST GET 资源,标记为:

@RolesAllowed("admin")

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

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

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

最佳答案

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

关于jax-rs - RESTEasy 支持 JAX-RS @RolesAllowed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24591782/

相关文章:

java.lang.ClassCastException : org. jersey.webservice.Login 无法转换为 javax.servlet.Servlet

rest - JAX-RS:验证 JSON 和 XML (RESTEasy)

java - 如何覆盖 JAX-RS 内容协商期间所做的决定?

Java Rest 构造函数继承

unit-testing - 没有使用scalatra的Jetty的servlet错误的multipartconfig

java - 将 Jetty 与 JAX-RS-Jersey 集成

java - @jsonview of jackson 不使用 jax-rs

java - JAX-RS NoMessageBodyWriterFoundFailure

java - 嵌入式 Jetty 将 servlet 响应转发到 JSP

java - 无法在jetty 9.4.16.v20190411 : receiving FileNotFoundException for jar that is in the war under WEB-INF/lib中部署WAR