如何以编程方式对 Tomcat 中的 OpenAM 用户进行身份验证?

How to programmatically authenticate users to OpenAM in Tomcat?

正在尝试将我们的 Web 应用程序从 GlassFish2 (GF) 迁移到 Tomcat7 (TC)。

在 GF 中,我们使用 AuthContext 方法(如 this example 中)使用 PolicyAgent3 (PA) 登录用户,之后我们在下一个请求中收到具有角色的 UserPrincipal。

在 TC 中,同样的方法还没有奏效。我可以登录用户,但我在下一个请求中没有获得 UserPrincipal。我设法使 PA 的 sampleapp 工作,但它使用不适合我们的表单身份验证(通过 OpenAM)。

是否可以在 TC 中使用 AuthContext 方法?因为对比了GF和TC中的agent.jar实现,我得出的结论是可能不支持。在 GF 的 PA 中有 IJ2EEAuthenticationHandler (com.sun.identity.agents.appserver.v81.AmASJ2EEAuthHandler) 的实现,用于验证用户并在此过程中设置 UserPrincipal,但在 TC 的 PA 中只有处理程序的默认实现 (com.sun.identity.agents.filter.J2EEAuthenticationHandler),它没有设置 UserPrincipal,它的身份验证方法只是 returns true.

Tomcat 是否支持 AuthContext 方法?还有什么可能以编程方式对 OpenAM 用户进行身份验证并获取 UserPrincipals?

单独使用 AuthContext API 进行身份验证不会填充 Java EE 声明角色。为了让那些人被填充,你将不得不登录到 Java EE 领域,这应该有几种方法:

  • 执行基于表单的登录(相应地配置 web.xml,然后修改代理配置文件设置,以便它了解登录和错误端点)。
  • 我没有测试过,但我认为 HttpServletRequest#login 应该也能正常工作。
  • 使用容器的方式执行程序化身份验证。

需要注意的是,Java EE代理并不是根据username/password来登录用户的,而是有一个复杂的String结构(在代码库),其中包含用户的 SSOTokenID,将用于确定用户的名称和角色。

另请记住,容器倾向于以不同方式实现声明性安全性。在过去,我发现 Tomcat 需要相当多的 web.xml 添加才能启用代理的声明性安全性。对我来说,让声明性安全发挥作用的最低限度是:

<security-constraint>
 <web-resource-collection>
  <web-resource-name>matchall</web-resource-name>
  <url-pattern>/*</url-pattern>
 </web-resource-collection>
 <auth-constraint>
  <role-name>AUTHENTICATED_USERS</role-name>
 </auth-constraint>
</security-constraint>