4

我的 Rails 应用程序几乎是几个 Web 服务的前端。我坚持我的用户模型,仅此而已。我需要为我的 Web 应用程序添加授权,使用 Devise 进行身份验证。我注意到 CanCan 和 acl9 似乎主要在 ActiveRecord 模型的实例上工作。CanCan 或 acl9 是否仍能满足我的需求?在我的情况下使用这些库中有什么提示吗?

我应该寻找更适用于动作而不是实例的东西吗?

此外,这些都是基于角色的系统,我正在考虑使用基于权限的系统。他们仍然很合适吗?

4

2 回答 2

1

我不能说acl9。但是,该cancanwiki 确实声称“如果没有提供,很容易制作您自己的 [模型] 适配器”。 https://github.com/ryanb/cancan/wiki/Model-Adapter 换句话说,即使您没有使用 ActiveRecord,您仍然可以使用 cancan。

再说一次,如果您不打算拥有角色,那么您在 cancan 中的能力定义可能看起来有点多余,例如:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)

    can :create, Widget if user.has_permission(:create_widgets)
    can :delete, Widget if user.has_permission(:delete_widgets)
    can :herp, Derp if user.has_permission(:herp_derp)
  end
end

如果您可以仅将 cancan 用于其控制器操作授权方法,那就太好了,但我不知道这是否可能。祝你好运。

于 2012-02-13T06:56:00.623 回答
0

只是为了(最后:) 回答acl9

Acl9 由两个非常独立的部分组成,访问控制子系统是您放入控制器中的所有授权内容,角色子系统是设置/检查/删除经过身份验证的用户的角色。

访问控制子系统唯一调用的current_user.has_role?( role, obj=nil). 因此,角色子系统对 ActiveRecord、关联、数据库等的依赖为零。有一个帮助器(也可以回退到调用以获取 acl9 之一)并按照您的喜好实施您的访问检查。所以,您说您确实保留了您的用户模型,但是假设您希望您的用户的角色成为学校的管理员,但该学校是对某个远程系统的 Web 服务调用。acts_as_authorization_subjecthas_role?has_role?super

## in your model
class User < ActiveRecord::Base

  def has_role? role, obj=nil
    role == :admin  &&
      obj == school &&
      school[:admin] == id  # <-- just making up how we know we're the admin of the remote school
    end
  end

  def school
    @school ||= School.get_by_user_id(id)
  end
end

## in your controller
class SomeController < ApplicationController
  before_action :set_school

  access_control do
    allow :admin, of: :school
  end

  private
  def set_school
    @school = School.get_by_id(params[:school_id])
  end
end
于 2015-01-22T20:49:51.897 回答