RESTeasy ContainerRequestFilter 在部署到 tomcat(容器管理的身份验证)时不包含用户信息

RESTeasy ContainerRequestFilter does not contain user info when deployed to tomcat (container managed authentication)

我将 resteasy-core 与 resteasy-servlet-initializer 一起使用,版本为“4.5.2.Final”。 应用程序 class 通过 getSingletons():

注册“new ACLContainerRequestFilter()”
@ApplicationPath("/rest")
public class Services extends Application {

  @Override
  public Set<Object> getSingletons() {
    return Sets.newHashSet(... , new ACLContainerRequestFilter());
  }

在过滤器中,我想检查安全上下文:

public class ACLContainerRequestFilter implements ContainerRequestFilter {

  ...

  @Override
  public void filter(ContainerRequestContext requestContext) throws IOException {

    SecurityContext sc = requestContext.getSecurityContext();
    if (sc == null || sc.getUserPrincipal() == null)
      throw new NotAuthorizedException("Requests need to be authenticated");
    if (sc.isUserInRole(role))
      ...

当我部署到 Jetty 9.4.27 时,一切正常。我可以配置容器管理的安全性、检查过滤器中的角色等。

当我将 WAR 部署到 Tomcat 9.0.31 时,sc.getUserPrincipal() returns null,sc.isUserInRole(...) 总是错误的。 Tomcat 容器管理的安全设置正确(通过 manager/html 应用程序检查)。

有什么想法/建议吗?

发现问题。似乎 Tomcat 将安全上下文设置为“按需”。添加以下 web.xml 后,对 sc.getUserPrincipal() 和 sc.isUserInRole(...) 的调用按预期工作:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>all</web-resource-name>
            <url-pattern>/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>admin</role-name>
        </auth-constraint>
    </security-constraint>

    <login-config>
        <auth-method>BASIC</auth-method>
    </login-config>

</web-app>