首页 > 解决方案 > 保持授权状态

问题描述

我正在开发一个基于 Web 服务的 Tomcat 应用程序,它专门执行 JAX-RS 类型的 RESTful API。有一个由标头确定的授权概念。根据一个人所扮演的角色,他们会或多或少地看到某物,但通常他们至少会看到某物的一部分。例如,有一个服务提供类别列表。几乎每个人都可以访问它,但不是每个人都能看到所有类别。
有一种方法可以调用数据库以获取用户有权查看的内容,但这需要大约 200 毫秒。我想这样做一次并将其存储在某种会话中。但同样,这是 JAXRS,我曾经认为没有维护状态。我可以只做一次权利检查,将结果对象存储在 HttpSession 中吗?我需要对 Tomcat/OpenShift 和其他人做任何事情来维护它吗?我认为会话不会在 OpenShift 负载均衡器上的位置之间跳跃。

我看到这样的代码:

@Provider
public class AuthenticationFilter implements javax.ws.rs.container.ContainerRequestFilter
...
    private static final String AUTHORIZATION_PROPERTY = "Authorization";
    private static final String AUTHENTICATION_SCHEME = "Basic"

但我不知道这是否适用于所有 JAX-RS 类型的情况。现在,我什至不知道部署后会实施什么样的授权方案。

我不是在寻找一个完整的答案,而是一个有用的起点和要避免的事情。如果某些东西在部署时不起作用,我不会有太多的错误空间,尤其是在 prod 时。

标签: tomcatjax-rsopenshift

解决方案


在我在(Wildfly/RestEasy)中测试的环境中,这可以工作。我也有一个ContainerRequestFilter创建自定义主体的。在我的服务代码中,我使用@RolesAllowed. 但是,按照我的正常情况,ContainerRequestFilter我看到响应没有设置 Cookie,当我返回另一个请求时,我必须filter再次执行该方法。因此,就您而言,在这种情况下,您完全是无国籍的。

但是,如果我添加:

@Context
private HttpServletRequest httpServletRequest;

到我ContainerRequestFilter并在我的方法中访问会话 IDfilter我可以看到响应现在有一个 JSESSIONID cookie。使用 Cookie 的重复呼叫给我同样的回报HttpSession。在我的服务中,我在@Context HttpServletRequest request我的方法中添加了一个,这样我就可以访问会话和更有状态的东西。

我将把它留给 REST 哲学家来决定这个现在有状态的代码是否是一个好主意,但是只要您使用的客户端正确处理 Cookie,您就可以计算用户在您的filter方法中的角色(检查会话首先查看它们是否已经存在),然后在您的 JAX-RS 方法中访问它们。


推荐阅读