1

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

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

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Application</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method>POST</http-method>
        <http-method>GET</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>MyRoleName</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>BASIC</auth-method>
</login-config>

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

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

4

1 回答 1

2

最重要的是确保 Tomcat 不会安装自己的 Authenticator 以响应您指定 BASIC 作为身份验证方案。从 AuthenticatorBase 扩展是一个好主意,您可以通过在应用程序的 META-INF/context.xml 文件中将身份验证器配置为 a 来避免使用 Tomcat 的标准身份验证器。

接下来,您将需要在 上实现两种方法AuthenticatorBase

  1. boolean doAuthenticate(Request request, HttpServletResponse response)
  2. String getAuthMethod()

第二个很简单:返回你想要的任何东西。您可能希望使其具有某种意义,例如"IBMSAM".

当然,第一个是验证器的关键所在。

如果您可以从 中获得所需的一切request,那就太好了:它已经存在,因此您可以获得所需的东西。你的方法需要做两件事:

  1. principal请求的 设置为适当的值(例如request.setUserPrincipal(new GenericPrincipal(username, null, roles));
  2. 返回true

我认为一旦你让它在一个简单的情况下工作,你就可以从那里玩弄边缘情况。

于 2018-12-29T16:21:54.043 回答