是否可以在 Tomcat 中组合 RemoteAddrValve 和 Authentication valve?
Is it possible to combine RemoteAddrValve and an Authentication valve in Tomcat?
我想使用 Apache Tomcat 实现基于容器的访问控制。我想通过 IP 地址 或 通过使用内置验证器阀之一(例如 FORM、BASIC等)。
使用场景是允许某些用户从某些静态服务器 IP 地址 或 访问,如果他们不在那些受信任的 IP 内,则提供一些身份验证凭据(最好通过 TLS)范围。
是否可以通过这种方式组合两个阀门的动作?如果不是,good/quick/simple 解决这个问题的方法是什么?
不,Tomcat 不支持开箱即用。你将不得不自己编写 Authenticator
来做这种事情。
例如,由于您想要合并现有的 Authenticator
(假设 FormAuthenticator
用于通过 HTML 表单向用户询问其用户名和密码),但也允许绕过来自 IP 范围的用户,然后简单地:
- 子类化 FormAuthenticator
- 覆盖
authenticate(Request,HttpServletResponse)
方法以
- 检查IP请求地址;如果匹配,在请求上设置
Principal
和 return true
- 如果没有 IP 匹配,调用
super.authenticate(request,response)
好好看看 FormAuthenticator.authenticate
是如何做的,您将能够轻松地处理上述 Principal
。
请记住,如果您只有一个 IP 地址,您将不知道选择哪个用户或角色。因此,在适合该用户的任何角色集合中,您可能需要类似 "IPauthUser" 的东西。
我想使用 Apache Tomcat 实现基于容器的访问控制。我想通过 IP 地址 或 通过使用内置验证器阀之一(例如 FORM、BASIC等)。
使用场景是允许某些用户从某些静态服务器 IP 地址 或 访问,如果他们不在那些受信任的 IP 内,则提供一些身份验证凭据(最好通过 TLS)范围。
是否可以通过这种方式组合两个阀门的动作?如果不是,good/quick/simple 解决这个问题的方法是什么?
不,Tomcat 不支持开箱即用。你将不得不自己编写 Authenticator
来做这种事情。
例如,由于您想要合并现有的 Authenticator
(假设 FormAuthenticator
用于通过 HTML 表单向用户询问其用户名和密码),但也允许绕过来自 IP 范围的用户,然后简单地:
- 子类化 FormAuthenticator
- 覆盖
authenticate(Request,HttpServletResponse)
方法以- 检查IP请求地址;如果匹配,在请求上设置
Principal
和return true
- 如果没有 IP 匹配,调用
super.authenticate(request,response)
- 检查IP请求地址;如果匹配,在请求上设置
好好看看 FormAuthenticator.authenticate
是如何做的,您将能够轻松地处理上述 Principal
。
请记住,如果您只有一个 IP 地址,您将不知道选择哪个用户或角色。因此,在适合该用户的任何角色集合中,您可能需要类似 "IPauthUser" 的东西。