我目前正在使用JSF(前端)、JPA、EJB和CDI(后端)开发一个"基本的"Java EE 6应用程序。到目前为止一切都很顺利。
对于登录部分,我选择了基于表单的身份验证和JDBC-Realm。
现在我想提供一些REST服务(Jersey),这些服务将被移动设备使用。因此,我需要添加第二种身份验证方式。但在我看来,一次只能有一个。
我已经尝试了一些PoC,但每次我调用需要有效用户的REST服务时,服务都会重定向到登录页面。
有什么最好的做法来处理这类问题吗?是否可以将Oauth添加到当前的登录机制中,因为我不想在每个请求中发送user/pass或会话id。给点标记就好了
如果您的应用程序需要针对不同的服务使用不同的身份验证机制,那么大多数Java EE实现(服务器)附带的登录模块实际上是不够的。
你可能需要自己编写一个自定义登录/认证模块。Java EE 6为此提供了一个API: JASPIC。或者,您可以使用特定服务器的专有登录模块API。
在该登录/认证模块中,您可以检查请求,确定该请求属于哪个服务,然后将其委托给适当的"真实"模块。
前段时间我写了一篇关于JASPIC的文章,可能会让你入门。
服务器通常有堆叠登录模块的选项。这是一个专有特性,因此其中一个允许堆叠认证机制的可能性很小。
但是从我的理解来看,一次只能有一个。
这并不完全正确。你只能有一个容器管理的配置,但如果你使用编程登录或第三方框架,你可以有尽可能多的配置。
我已经尝试了一些PoC,但每次我调用一个rest服务,这需要一个有效的用户服务重定向到登录页面
在您定义安全约束的web.xml
中,排除应用程序的REST部分,以便绕过容器管理的身份验证机制,然后以编程方式进行身份验证或使用第三方解决方案。
有处理这类问题的最佳做法吗?
这可能会引起争论,所以我不会试图回答这个问题。
是否可以将Oauth添加到当前的登录机制中,因为我不想在每个请求中发送user/pass或会话id。
是的。可能还有很多其他的,但我熟悉的是Seam Social(它正在成为Agorava)。这两家公司声称支持谷歌、Facebook和其他几家公司。您也可以为Apache Shiro编写自己的OAuth验证器。
另一种选择是将应用程序打包为EAR,将web UI和REST接口分离到单独的web模块中。这将允许您通过web.xml
您可以添加自定义servlet,命名为AuthServlet
,并使用security-constraint
将其设置为公共可用(它甚至可能是Jersey @POST方法btw),并使用编程式认证。