3

我想知道在我的应用程序中构建身份验证/授权的最佳方式。我希望有

  • 许多公司帐户,可能使用子域

  • 帐户有很多用户

  • 并且用户只能访问由他们自己或具有相同帐户的其他用户创建的记录。

我所做的研究提供了许多混合和匹配的想法,以奇怪和奇妙的方式组合设计/cancan/authlogic,但我还没有找到任何东西可以向我展示限制用户访问同一数据的最佳方法模型。

例如:


账户 1:欧亚大陆

用户 1:鲍勃

用户 2:吉姆


账户 2:东亚

用户 1:戴夫

用户 2:艾伦


Isbn 1:account_id 为 1

Isbn 2:account_id 为 2


我如何确保 Bob 无法访问或删除 Isbn 2?

///update 当然,现在我已经发布了这个,我的 google fu 已经启动,我从 RyanB 找到了CanCan 2.0的自述文件,看起来很完美:

> 资源

如果您需要根据模型的属性更改授权怎么办?您可以通过将条件哈希作为最后一个参数传递给 can. 例如,如果您只想允许一个人访问他拥有的项目,您可以设置 :user_id 选项。

4

3 回答 3

5

我建议使用CanCan进行授权。

你的能力模型看起来像

can :manage, :isbn do |isbn|
  isbn.account == current_user.account
end

然后你可以can? :manage, @post在你的控制器/视图中使用条件。

于 2011-07-11T19:48:38.287 回答
2

你应该看看https://github.com/stffn/declarative_authorization我认为这完全符合你的要求(你可以限制对某些记录的访问)

因此,在您的示例中,您可以使用以下方式设置授权:

has_permission_on :isbn do 
    to :manage
    if_attribute :account_id => is_in {user.account_ids}
end
于 2011-07-11T19:43:48.220 回答
0

你看过 XACML 吗?它是一个基于策略的声明性授权框架。它也是 OASIS 的标准。

使用 XACML,您可以获取所需的任何属性(用户、资源、操作或上下文属性)并表达您拥有的用例。

您最初的要求是

用户只能访问由他们自己或具有相同帐户的其他用户创建的记录。

在 XACML 中,这将成为以下策略:

当且仅当 record.owner==user.id OR user.accountId==record.accountId 时,用户才能访问记录

就这样!XACML 的架构定义了策略执行点 (PEP),它是保护您的应用程序/数据并将授权请求发送到策略决策点 (PDP) 的组件。PEP 说:“Alice 可以访问记录 #123 吗?” PDP 检查 Alice 的帐户 ID 和记录的帐户 ID 以及所有者。PDP 最终返回“许可”或“拒绝”。

高温高压

于 2013-01-17T10:55:44.137 回答