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>
我将 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>