8

我在 Glassfish 上使用 JAX-RS 来实现一组资源,这些资源只能由特定用户访问。

考虑两个用户,userA 和 userB,他们都在我的网站上注册。

  1. userA 创建了自己的资源http://{localhost}/service/user/A
  2. userB 创建了自己的资源http://{localhost}/service/user/B

然后 Glassfish 的默认安全实现被配置为:

  1. 用户角色可以访问/services/user/*
  2. userA 和 userB 都属于用户角色。

所以登录后,userA 和 userB 都可以访问/service/user/Aand /service/user/B

现在的问题是,有没有可能

  • userA 只能访问/services/user/A,但不能/services/user/B

同时

  • userB 只能访问/services/user/B, but not/services/user/A`

我想我一定错过了什么,因为我相信这是一个普遍的需求。任何人都可以帮忙吗?

4

2 回答 2

2

这是您必须在应用程序级别实现的东西。应用程序服务器无法知道您的安全策略,这可能非常复杂。您可以自己做(在用户资源中添加逻辑),如果您的安全策略很简单,这可能是正确的方法。否则,您应该查看可以与 JAX-RS 集成的 Spring Security。这会给你很大的灵活性。

于 2012-10-25T21:02:31.127 回答
0

搜索了一下,似乎使用 JAX-RS 和 JAAS 解决上述问题并非易事。

所以我决定看一下OAuth,看看是否可以轻松处理授权。

经过几个小时的阅读,我开始意识到 Olivier 在说什么。我想要的是将用户身份绑定到 URI。但是 JAAS 或 OAuth 确实是为解决其他问题而设计的。

  1. JAAS或基于角色的身份验证系统旨在授权一组用户访问一组 URI。就像一个装满玩具的房间,一旦用户扮演室友ROLE,这个用户就拥有了房间的钥匙,然后他可以玩弄房间里的每一个玩具,甚至将它们全部摧毁。如果您想用用户名标记每个玩具并阻止他们玩其他人的玩具,您需要在 JAAS 之外实现逻辑。

  2. OAuth,甚至更糟。它甚至与用户和 URI 之间的绑定无关。它致力于让第 3 方代客软件以有限的访问权限使用您的数据。考虑一下关于 JAAS 的房间玩具故事,您希望打开房间的窗户,但您没有时间这样做。所以你雇了一个代客,做了一把代客钥匙,让他进入房间,打开窗户,同时远离玩具。OAuth 的神奇之处在于,为代客提供了足够的资源来完成主人的任务,更重要的是,房间通过识别代客钥匙来知道是谁派了代客。

现在从开发人员的角度来看,您可能会问为什么代客可以访问窗口而不是玩具?换句话说,如何让第 3 方软件访问某些 URI 而不是其他 URI?这不是由 OAuth 处理的。OAuth 只会告诉您哦,这是 Bob 的代客,其他一切都由您自己决定。

OAuth 并不完全是一件坏事,它让你有机会决定这个代客拥有什么 ROLE,或者这种代客可以访问哪个 URI,或者 Bob 的代客可以访问哪些资源等。

希望这能帮助任何阅读的人节省一些时间。请不要责怪我可怜的故事,我努力了 1 个小时让故事更简单。:)

于 2012-10-29T02:33:03.013 回答