Tomcat 维护授权状态

Tomcat 维护授权状态,tomcat,jax-rs,openshift,Tomcat,Jax Rs,Openshift,我正在开发一个基于web服务的Tomcat应用程序,它只提供JAX-RS类型的RESTful API。有一个由标题决定的授权概念。根据一个人所扮演的角色,他们或多或少地看到了一些东西,但通常他们至少看到了部分东西。例如,有一个服务提供类别列表。几乎每个人都可以访问它,但不是每个人都能看到所有类别。 有一种方法可以调用数据库来获取用户有权看到的内容,但这需要大约200毫秒。我想这样做一次,并将其存储在某种会话中。但同样,这是JAXRS,我过去认为状态没有维护。我可以只做一次授权检查,将结果对象存储

我正在开发一个基于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中。

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

不过,如果我补充:

@Context
private HttpServletRequest httpServletRequest;
到我的
ContainerRequestFilter
并在我的
filter
方法中访问会话id,我可以看到响应现在有一个JSESSIONID cookie。使用Cookie的重复调用将返回相同的
HttpSession
。在我的服务中,我在我的方法中添加了一个
@Context-HttpServletRequest
,通过它我可以访问会话和一些更有状态的东西


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

@stdunar我可以将此HttpServletRequest添加到API方法中(没有Spring来设置),然后我可以构建授权对象,并将其保存到会话中(如果还没有)。让我沉默一下,我假设Angular代码的后续调用需要保存这个JSESSIONID cookie,对吗?有多个Tomcat实例正在运行,但我不知道它是否共享会话。我承认,自1.x天以来,我就没有与Angular合作过,当时在发送Cookie的调用中需要一个标志。通常浏览器会帮你做这件事,我不确定是否会。如果有多个Tomcat实例,它们可能在负载平衡器后面,负载平衡器应该为您处理这个问题。但关键在于cookie,通过浏览器调试工具很容易看出这一点。