我需要将IBM Security Access Manger与Tomcat 9集成在一起以对用户进行身份验证。我为IBM SAM部件配置了正确的Webseal(连接)。它使用用户的凭据,再次验证SAM服务器,然后在成功传递标题iv-user
,iv-group
和iv-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
)中的角色进行身份验证。
我对如何真正实现此身份验证有些不确定,因此无论多么基础,任何帮助都将不胜感激。
答案 0 :(得分:1)
最重要的是要确保Tomcat不安装自己的Authenticator来响应您将BASIC指定为身份验证方案。从AuthenticatorBase进行扩展是一个好主意,并且可以通过在应用程序的META-INF / context.xml文件中将身份验证器配置为来避免Tomcat的标准身份验证器。
接下来,您将需要在AuthenticatorBase
上实现两种方法:
boolean doAuthenticate(Request request, HttpServletResponse response)
String getAuthMethod()
第二个很简单:返回您想要的任何东西。您可能需要使其具有某种意义,例如"IBMSAM"
。
第一个当然是身份验证者的肉所在的地方。
如果您可以从request
获得所需的一切,那就太好了:它已经存在,因此您可以获取所需的东西。您的方法需要做两件事:
principal
设置为适当的值(例如request.setUserPrincipal(new GenericPrincipal(username, null, roles));
true
我认为,一旦您在一个简单的情况下使用它,您就可以从那里玩转边缘游戏。