java - JAX-RS( Jersey )仅限管理员 API 调用

标签 java rest jersey jax-rs

这可能更像是一个风格问题,但我对如何最好地设计 RESTful API 有点困惑。

假设我想提供以下 API 调用:

  • 获取/玩家
    • 返回当前玩家
  • 获取/玩家/{id}
    • 返回指定的玩家
  • POST/admin/player/{id}
    • 注册指定的播放器
  • PUT/管理员/玩家/{id}
    • 更新指定的播放器

正如您可能猜测的那样,后两个需要管理权限,前两个仅需要用户登录系统。

所以我的问题涉及如何最好地将这个 API 放入资源中。我的第一直觉是创建一个没有类级 @Path 注释的 PlayerResource,而是使用 @Path("player/...") 定义每个方法相应地 @Path("admin/player/...") 。那行得通吗?对我来说有点味道,那么有没有更好的方法来做到这一点呢?我能想到的唯一替代方案是创建一个单独的资源类来包含仅管理调用,但这对我来说也很奇怪,因为我有两个处理相同模型类的资源。

我只是在寻找关于如何最好地设计这个东西的一些指导。这是我的第一个 RESTful Web 应用程序,所以请原谅我的无知。谢谢!

最佳答案

我不会选择为管理员调用提供单独的资源。 如果发出调用的用户无权对特定资源进行 POST 或 PUT,请返回 401 - 未经授权状态代码。在我看来,这是唯一正确且预期的做法。

评论后编辑:

正如您所提到的,您通过 web.xml 定义了安全约束,我想您将拥有用户角色。

这将允许您执行以下操作:)

@PUT
@RolesAllowed("ADMIN")
public void register(User user){......)

您只需输入 https://jersey.github.io/apidocs/1.5/jersey/com/sun/jersey/api/container/filter/RolesAllowedResourceFilterFactory.html就位:)

编辑2

我的资源总是这样。 (允许异常(exception):))

@Path("/players")
public class PlayerResource{
  @GET
  public List<Player> list(){}

  @GET
  @Path("{id}")
  public Player get(@PathParam("id")Long id){}

  @DELETE
  @RolesAllowed("ADMIN")
  @Path("{id}")
  public Player delete(@PathParam("id")Long id){}

  //PUT and POST ommited

}

问候

关于java - JAX-RS( Jersey )仅限管理员 API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16378625/

相关文章:

java - 如何使用 Junit 测试向 Leanft 添加重试逻辑?

python - Django ,休息 : Serialize a text or image file to post via HTTP in JSON

spring - 负载平衡(ribbon)和路由(zuul)Spring REST API(Spring Data JPA)请求到同一服务的多个副本

java - 在 Eclipse 中将 Spring Boot 应用程序导出为 JAR 文件

java - 带有 Response 参数的方法中的 IllegalStateException

java - 按名称检索注释

java - 我无法对 Java 中的 Math.reverseBytes 使用react

java - 如何使用开关盒返回主菜单

java - 为什么在 Java 中使用 RESTful 服务框架而不是普通 servlet