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

时间:2018-12-28 19:26:45

标签: java tomcat http-headers tomcat-valve tivoli-identity-manager

我需要将IBM Security Access Manger与Tomcat 9集成在一起以对用户进行身份验证。我为IBM SAM部件配置了正确的Webseal(连接)。它使用用户的凭据,再次验证SAM服务器,然后在成功传递标题iv-useriv-groupiv-creds的同时重定向到Tomcat。现在,我需要编写一个自定义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的标头,并将其用于生成org.apache.catalina.realm.GenericPrincipal,然后用于对添加到给定领域(或写入tomcat-users.xml)中的角色进行身份验证。

我对如何真正实现此身份验证有些不确定,因此无论多么基础,任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

最重要的是要确保Tomcat不安装自己的Authenticator来响应您将BASIC指定为身份验证方案。从AuthenticatorBase进行扩展是一个好主意,并且可以通过在应用程序的META-INF / context.xml文件中将身份验证器配置为来避免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

我认为,一旦您在一个简单的情况下使用它,您就可以从那里玩转边缘游戏。