3

我目前正在开发一个带有 JSF(前端)和 JPA、EJB 和 CDI(后端)的“基本”Java EE 6 应用程序。到目前为止一切正常。

对于登录部分,我选择了基于表单的身份验证和 JDBC-Realm。

现在我喜欢提供一些 REST 服务(Jersey),这些服务将被移动设备使用。因此,我需要添加第二种身份验证方式。但根据我的理解,一次只能有一个。

我已经尝试过一些 PoC,但是每次我调用需要有效用户的 REST 服务时,该服务都会重定向到登录页面。

是否有任何最佳实践来处理此类问题?

是否可以将 Oauth 添加到当前的登录机制中,因为我不想在每个请求中都发送用户/密码或会话 ID。某种令牌会很棒。

4

4 回答 4

3

如果您的应用程序需要为不同的服务提供不同的身份验证机制,那么大多数 Java EE 实现(服务器)附带的登录模块确实不够用。

您可能必须通过编写自定义登录/身份验证模块来自行处理。Java EE 6 有一个 API:JASPIC。或者,您可以使用特定服务器的专有登录模块 API。

在该登录/身份验证模块中,您可以检查请求,确定该请求属于哪个服务,然后委托给适当的“真实”模块。

我写了一篇关于 JASPIC 的文章前段时间

服务器通常可以选择堆叠登录模块。这是一项专有功能,因此其中一个允许堆叠身份验证机制的可能性非常小。

于 2013-03-20T11:39:39.910 回答
1

另一种方法是将应用程序打包为 EAR,并将 Web UI 和 REST 接口分离到单独的 Web 模块中。这将允许您通过 web.xml 独立配置每个 Web 模块

于 2013-03-30T05:49:58.597 回答
1

但根据我的理解,一次只能有一个。

这并不完全正确。您只能拥有一个容器管理的配置,但如果您使用编程登录或第三方框架,则可以拥有任意数量的配置。

我已经尝试过一些 PoC,但每次我调用一个 REST-Service 时,都需要一个有效用户,服务重定向到登录页面

web.xml您定义安全约束的地方,排除应用程序的 REST 部分以绕过容器管理的身份验证机制,然后以编程方式进行身份验证或使用第三方解决方案。

是否有任何最佳实践来处理此类问题。

这可能会引起争论,所以我不会试图回答它。

是否可以将 Oauth 添加到当前的登录机制中,因为我不想在每个请求中都发送用户/密码或会话 ID。

是的。可能还有很多其他人,但我熟悉Seam Social(正在成为Agorava)。这两个声称支持谷歌、Facebook 和其他几个。您还可以为Apache Shiro编写自己的 OAuth 身份验证器。

于 2013-03-19T21:19:20.863 回答
0

您可以添加名为类似的自定义 servlet 并将AuthServlet其设置为公开可用security-constraint(它甚至可能是 Jersey @POST 方法顺便说一句)并使用programmatic authentification

于 2013-03-19T21:17:18.430 回答