问题标签 [tomcat-valve]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1280 浏览

java - 为 Tomcat 9 创建自定义 HTTP 身份验证器

我需要将 IBM Security Access Manger 与 Tomcat 9 集成以对用户进行身份验证。我为 IBM SAM 部分正确配置了 Webseal(联结)。它获取用户的凭据,再次验证 SAM 服务器,然后如果成功重定向到 Tomcat,同时传递标头iv-useriv-groupiv-creds. 我现在需要编写一个自定义的 Tomcat Valve 来实现身份验证并允许基于用户组访问应用程序。这样做的最佳方法是什么?

我目前的想法是扩展,org.apache.catalina.valves.AuthenticatorBase以便我可以在web.xml我的应用程序中使用以下设置:

来自 Webseal 的标头可以被解析并用于生成 a org.apache.catalina.realm.GenericPrincipal,然后用于验证添加到给定领域(或写入tomcat-users.xml)的角色。

我对如何实际实现此身份验证有点犹豫,因此无论多么基本的任何帮助都将不胜感激。

0 投票
2 回答
1273 浏览

java - Tomcat 9 Valve 导致服务器启动失败

我编写了一个自定义 tomcat 阀门来解析 HTTP 标头并使用它们进行身份验证。Valve 通过扩展 AuthenticatorBase 来工作。我编译它并将它放在 $CATALINA_HOME/lib 中。这是代码:

然后我告诉 Tomcat 使用 server.xml 中的阀门。扩展 AuthenticatorBase的文档说,当使用此类时,它所附加的上下文(或层次结构中的父容器)必须具有关联的领域,可用于验证用户并枚举他们已分配的角色. 我以为我已经正确配置了它,但是它抛出错误并且 Tomcat 无法启动。这是server.xml配置:

这是我收到的错误消息:

我认为我的阀门写得正确,所以我的猜测是问题出在配置中。不知道为什么它没有获得附加的上下文。有任何想法吗?

编辑: 我尝试将阀门放入我的应用程序中META-INF/context.xml(我必须制作一个,因为一开始没有一个)。这里是:

服务器随后启动,但无法部署任何应用程序。我收到了与我最初尝试在此自定义实现中使用的 IBM 阀门类似的错误,但它无法AuthenticatorBasecatalina.jar. 以下是SEVERE我得到的错误:

0 投票
1 回答
659 浏览

java - 在 Tomcat 中扩展 ValveBase 总是为 request.getRemoteUser() 返回 null

我已经在 Tomcat 8.0.51 和 9.0.14 中对此进行了测试,结果相同。在 Ubuntu Linux 16.04 上运行。

此示例代码只是将所有请求记录到控制台(或 catalina.out)。主要问题是它request.getRemoteUser()总是返回null- 即使用户经过身份验证。

我注意到当用户通过身份验证时, AccessLogValveandJDBCAccessLogValve阀门正确地返回了登录名/用户名。我通过显示我的 Valve 记录到标准控制台日志的相同代码行的 access_log 行来展示这一点。

当用户通过身份验证时,我需要扩展或实现一个类LoginValve以返回登录名/用户吗?我也尝试了调用request.getUserPrincipal(),它也总是返回 null。

非常感谢任何有关为什么这被阻止ValveBase但适用于 AccessLogs 的帮助。

如果 LoginValve 低于,则输出。请注意,调用提供的字段request.getRemoteUser()reqlogin。sesslogin字段由应用程序getRemoteUser()填充到会话中,与调用无关。

这是 localhost_access_log 文件的输出(它确实将用户joe_user从其调用记录到request.getRemoteUser()

同样,问题是,当登录用户通过身份验证时,我如何获得调用以request.getRemoteUser()返回登录用户。

0 投票
0 回答
68 浏览

java - Valve 不捕获对 j_security_check 的 POST 请求

我编写了一个 Valve 来记录对我的 web 应用程序的所有请求。但是对 mywebapp/j_security_check 的请求没有出现。

我错过了什么,还是不可能?我知道调用链应该是 Valve > JAAS > Filter > Servlet,所以这些请求应该由我的 Valve 处理。

我正在使用 Payara 5,基于表单的身份验证,GlassFishValve,并且 WEB-INF 包含一个 glassfish-web.xml,其中包含

(顺便说一句,我正在从 glassfish3 升级到 payara5,并试图追查为什么从 Web 浏览器登录有效,但从其他程序无效。在 Payara 管理控制台中打开“访问日志”会显示对 mywebapp/ 的 POST 请求j_security_check 没问题,但没有任何细节)。

0 投票
1 回答
34 浏览

tomcat8 - http正文完成写入时的Tomcat 8日志;ServletOutputStream 关​​闭?阀门 %D?

我在 Tomcat 8 中部署了一个 WAR 文件。它使用的是 Spring Boot,这几乎是偶然的。

我想记录客户端完成使用我的 http 响应需要多长时间,因为我的响应主体很大。这意味着过滤器链早已完成——有时是几分钟前——HttpServletResponse 的 ServletOutputStream 已被客户端完全使用。

Tomcat Valve %D 是否涵盖这种情况? https://tomcat.apache.org/tomcat-8.0-doc/config/valve.html#Access_Log_Valve/Attributes我不确定阅读文档。

如果没有,我该如何捕捉它?我基本上想在调用 ServletOutputStream.close() 时记录时间戳,对吗?我怎样才能做到这一点?

0 投票
1 回答
286 浏览

tomcat - 如何使 TOMCAT 只能访问本地主机,除了一个应用程序

我正在运行 TOMCAT 服务器。出于安全原因,我必须仅限制对 localhost 的访问,但必须从外部(任何 IP)访问一个应用程序。我尝试使用放置在 server.xml 中的阀门,但我只能阻止对特定功能/应用程序的访问,例如主机管理器。

如何限制除一个应用程序之外的所有应用程序?

编辑: server.xml 中的这一行会阻止除 localhost 之外的所有内容:

如何为一个必须从外部访问的应用程序添加例外?

提前感谢您的帮助:-)

0 投票
1 回答
191 浏览

java - 获取tomcat阀门类中的webapp名称

我有我的自定义 tomcat Valve 扩展 FormAuthenticator,并且在每个 webapp 的 context.xml 中定义了相同的内容。我需要根据 webapp 名称读取 Valve 的“initInternal”中的一些属性文件。即对于每个 webapp 不同的属性文件。由于 Valve 很常见,我需要一种方法来找出加载 Valve 的上下文。有什么方法可以在 Valve 类中获取上下文。

我试图在“ServletContextListener”中设置系统属性,但在初始化 ServletContextListener 之前加载了 Valve 类。

这是我的 context.xml 的外观。

每个 webapp 只有 'docbase' 和 'path' 不同。

0 投票
1 回答
746 浏览

tomcat - Tomcat通过log4j2访问日志?

我正在尝试在使用 tomcat 的 Web 应用程序中使用 log4j2 日志框架访问日志记录我自己的配置。虽然我看到有一个可用于 logback 的访问日志阀,但我根本没有找到任何可以覆盖 log4j2 框架的访问日志阀。

雄猫版本:9

任何帮助表示赞赏!

0 投票
1 回答
386 浏览

tomcat - Tomcat URL 重定向问题

Tomcat:8.5.30 Java 8 操作系统:macOS Mojave 10.14.6

作为示例项目,我正在尝试将任何 url:/{dynamicValue}/entity/{entityID} 重定向到 /entity/{dynamicValue}/entity/{entityID}。这里的“实体”是我的上下文,将引用 webapps 目录中的 entity.war。

上下文文件(路径:apache-tomcat-8.5.30/conf/context.xml):

重写配置文件:(路径:apache-tomcat-8.5.30/webapps/ROOT/WEB_INF/rewrite.config.xml)

暴露的端点:/{dynamicValue}/entity/{entityID}

内部端点:/entity/{dynamicValue}/entity/{entityID}

直接对“内部端点”进行的任何调用都可以正常工作。但是,对“暴露端点”的 API 调用不会被重定向到“内部端点”。(返回 404)

有什么建议么 ?

参考:重写tomcat 8 url

0 投票
1 回答
161 浏览

tomcat - 在 build.gradle 文件中设置 cargo.tomcat.valve 值

我正在尝试做的事情:我想向 tomcat server.xml 添加一个 AccessLogValve,以便我可以记录自定义标头值。(参考:https ://jfrog.com/knowledge-base/how-can-i-log-custom-request-headers-using-the-tomcat-access-log-valve/ )

我遇到的问题:每次运行 gradle 时,它​​都会创建新的 server.xml。我想添加一个cargo.tomcat.valve容器属性,但是我找不到有效的格式。

我要添加的阀门是Access Log Valve https://tomcat.apache.org/tomcat-8.5-doc/config/valve.html#Access_Log_Valve

一个失败的例子是containerProperties ['cargo.tomcat.valve'] = 'className=org.apache.catalina.valves.AccessLogValve| pattern=combined'

我已经尝试了上述各种版本,但似乎都没有。

我可以看到Maven的例子是

参考: https ://codehaus-cargo.github.io/apidocs/org/codehaus/cargo/container/tomcat/TomcatPropertySet.html#CUSTOM_VALVE

但是我找不到使用 gradle 添加自定义阀门的方法。