维持授权状态

我正在开发一个基于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类型的情况。现在,我什至不知道部署了什么样的授权方案。

我不是在寻找完整的答案,而是一个有用的起点和避免的地方。如果某些东西在部署时不起作用,尤其是在生产时,我将不会有太多的错误余地。

dongxingchao 回答:维持授权状态

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

但是,如果我添加:

@Context
private HttpServletRequest httpServletRequest;

到我的ContainerRequestFilter,并在我的filter方法中访问会话ID,我可以看到响应现在具有JSESSIONID cookie。使用Cookie的重复通话会给我同样的HttpSession。在我的服务中,我向方法中添加了@Context HttpServletRequest request,并可以访问会话和更具状态性的内容。

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

本文链接:https://www.f2er.com/3071780.html

大家都在问