2011-08-18 56 views
1

我有一个JEE6应用程序,驻留在Glassfish 3.1.1上,它通过一些REST资源向远程客户端提供服务。一些资源需要认证,其他资源则不需要。JEE6:自定义领域vs ResourceFilter - 哪一个更适合REST资源验证?

目前我使用HTTP基本认证来保护安全资源,实现为自定义领域/ LoginModule。如果身份验证失败,则登录模块会抛出一个LoginException Glassfish映射到HTTP 401.如果身份验证成功,则资源可以访问securityContext中的userPrincipal

虽然它的工作,它确实让我烦恼,我不能拦截LoginException。我的客户期望xml或json;在HTTP 401正文中,Glassfish为它们提供了text/html。所有其他应用程序异常我都可以用ExceptionMapper进行截取,而不是LoginException。

目前我正在考虑用ResourceFilter替换自定义领域,我将手动进行HTTP基本身份验证。我希望如果我在这里抛出一个异常,它会被截取并正确映射/编组。

我的问题是:

  • 它是用于身份验证的ResourceFilter一个好主意?性能如何?
  • 我该如何让REST资源知道谁刚获得身份验证(谁是userPrinicipal)?
+0

顺便说一句,我已经实现了它作为一个ResourceFilter和一个Injectable UserProvider。如果有人有兴趣,我很高兴发布代码。不回答我的问题,如果它是一个好主意,但:) – Hank

回答

0

有点晚了,但无论如何...

其谁做身份验证,因此它永远不会到达你的资源的容器。就我个人而言,我喜欢容器管理的身份验证方法,因为它很好地将身份验证与应用程序分开。

如果您想使用ResourceFilter,您可以从请求访问SecurityContext。这包含校长。从那里你可以填充例如一个可在整个应用程序中访问的ApplicationConfig对象。

性能取决于认证实施。我想使用ResourceFilter时的开销很小。如果需要,您可以始终使用会话Cookie来保持会话以防止再次进行身份验证。

+0

我应该已经关闭了这个问题,因为它不再是一个问题。我完全按照你用'ResourceFilter'和'SecurityContext'所说的做。在'ResourceFilter'中,我完全控制了异常btw .. – Hank

+0

感谢您的回复:) – thehpi