gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:33:07 24 4
gpt4 key购买 nike

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

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

在 TC 中,同样的方法还没有奏效。我可以登录用户,但我在下一个请求中没有获得 UserPrincipal。我设法使 PA 的示例应用程序正常工作,但它使用不适合我们的表单例份验证(通过 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,它的 authenticate 方法只返回 true。

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

最佳答案

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

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

需要注意的是,Java EE agents并不是根据用户名/密码登录用户,而是有一个复杂的String结构(在代码库中称为transport 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>

关于java - 如何以编程方式对 Tomcat 中的 OpenAM 用户进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27984453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com