Java EE 6应用程序中的OpenID - 如何为用户获取Principal对象

gra*_*hez 5 security servlets java-ee jaspic

我第一次在我的应用程序中玩OpenID身份验证.我可以成功地针对选择的提供程序对用户进行身份验证,但我不知道如何在Java EE服务器上正确登录用户,因此看起来用户已使用例如基于表单的登录进行登录.我可以使用Servlet 3.0 login但它需要用户名/密码对,而且在使用OpenID时我没有密码.

我希望能够得到一个Principal对象和使用isUserInRole方法等.我错过了什么吗?我在JBoss 7.1上运行这个应用程序,但我想应该有一个共同的方法来做到这一点.或者也许我错过了一些东西,Principal使用OpenID时所有的东西和用户角色都有所不同?

Arj*_*jms 1

我想应该有一个通用的方法来做到这一点。

确实有。您需要创建一个所谓的 JASPIC 身份验证模块。已经有一个可用于 OpenID,请参阅:

我可以使用 Servlet 3.0 登录,但它需要用户名/密码对,并且在使用 OpenID 时我没有密码。

这是正确的。因此,您需要调用 Servlet 3.0 的验证方法。因为login与用户名/密码紧密相关,所以当您定义自己的身份验证模块时,它甚至会在 Java EE 7 中引发异常!(在 Java EE 6 中,未定义会发生什么,但它通常不起作用)。

有关如何在 Java EE 中创建类似 OpenID 的身份验证模块的更多示例,请参阅我自己的项目OmniSecurity以及使用该项目早期版本的实际应用程序。(不幸的是,代码有点难以理解,因为它需要一个极其复杂且令人费解的解决方法来让 CDI 与 JASPIC SAM 一起工作,但希望它仍然能让您看到一般模式)