Java EE 6 应用程序不同的登录方法

3

我目前正在开发一款"基础"Java EE 6应用程序,使用JSF(前端)和JPA、EJB以及CDI(后端)。到目前为止,一切都运行良好。

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

现在我想提供一些REST服务(Jersey),这些服务将由移动设备消费。因此,我需要添加第二种身份验证方式。但从我的理解来看,一次只能有一种身份验证方式。

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

是否有任何最佳实践来处理这种问题?

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

4个回答

3
如果您的应用程序需要不同的身份验证机制来访问不同的服务,那么大多数Java EE实现(服务器)附带的登录模块可能并不能满足您的需求。您可能需要编写自定义的登录/认证模块。Java EE 6提供了一个API:JASPIC。或者,您可以使用特定服务器的专有登录模块API。在该登录/认证模块中,您可以检查请求,确定该请求属于哪个服务,然后委派给适当的“真实”模块。我之前写过一篇关于JASPIC的文章,可能会对您有所帮助。服务器通常具有堆叠登录模块的选项。这是一项专有功能,因此很少有可能允许堆叠身份验证机制。

2
我可以看出如何使用JAAS或JASPIC堆叠登录模块来解决支持多个身份验证源的问题,例如LDAP / JDBC / OAuth的组合。然而,我很难看出这如何解决为应用程序的不同部分使用不同的身份验证机制的问题,比如在/webapp/rest中使用BASIC,在/webapp/faces中使用FORM?还是我漏掉了什么? - rdcrng
@rdcrng 你说得对,我不认为它通常会起作用,因此我提到它是“远程机会”。但由于存在许多不同的服务器,并且堆叠是一种专有功能(每个服务器都不同),也许有一个服务器实际上会允许更多。我将编辑问题以使其更清晰。 - Arjan Tijms
“对于 /webapp/rest,使用 BASIC;对于 /webapp/faces,使用 FORM。另外,如果有专有的登录模块,在 web.xml 中定义一个机制(BASIC/FORM/...),然后在 AS 端只需一个登录模块,这肯定很困难。但是,使用 JASPIC 认证模块时,在 web.xml 中没有定义这样的机制;这取决于认证模块。” - Arjan Tijms
谢谢您证实了我的怀疑,我只是想确认一下,当我因为这个原因(以及其他几个原因)将我的项目切换到Shiro时,我没有错过什么显而易见的东西。 - rdcrng

1
从我的理解角度来看,一次只能有一个容器管理配置。但如果使用编程式登录或第三方框架,则可以拥有任意数量的配置。
在web.xml中定义安全性限制时,将应用程序的REST部分排除在外,以便绕过容器管理的身份验证机制,然后进行编程身份验证或使用第三方解决方案。
这可能会导致争论,因此我不会尝试回答有关如何处理此类问题的最佳实践。
可以将Oauth添加到当前登录机制中吗?因为我不想在每个请求中发送用户/密码或会话ID。

是的。可能还有很多其他的,但我熟悉Seam Social(正在变成Agorava)。这两个声称支持Google、Facebook和其他几个平台。你也可以为Apache Shiro编写自己的OAuth认证器。


1

一种替代方案是将您的应用程序打包为EAR文件,将Web UI和REST接口分离成单独的Web模块。这将使您能够通过其web.xml独立配置每个Web模块。


0
你可以添加一个自定义的Servlet,命名为AuthServlet,并通过security-constraint将其设置为公开可用(它甚至可以是Jersey的@POST方法),然后使用编程方式进行身份验证

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接