Web服务上的Rails授权

时间:2012-01-24 16:46:09

标签: ruby-on-rails authorization cancan acl9

我的rails应用程序几乎是几个Web服务的前端。我坚持我的用户模型,就是这样。我需要使用Devise进行身份验证,为我的Web应用添加授权。我注意到CanCan和acl9似乎主要用于ActiveRecord模型的实例。 CanCan或acl9能否满足我的需求?在我的情况下使用这些库中的任何一个提示?

我应该寻找能够在行动而不是实例上发挥更多作用的东西吗?

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

2 个答案:

答案 0 :(得分:1)

我无法代表acl9发言。但是,cancan wiki确实声称“如果没有提供,很容易制作自己的[型号]适配器。” 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仅用于其控制器操作授权方法,那将会很棒,但我不知道这是否可行。祝你好运。

答案 1 :(得分:0)

(最后:)回答acl9

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

访问控制子系统始终调用的唯一current_user.has_role?( role, obj=nil)。因此,角色子系统对ActiveRecord,关联,数据库等没有依赖性。一个帮助器(acts_as_authorization_subject),它将一个依赖ActiveRecord的has_role?方法添加到一个类中,但这完全是可选的,您可以自由地实施自己的has_role?方法(也可以回退到调用super来获取acl9)并实现您的访问权限检查你先请。所以,你说你坚持你的用户模式,但是让我们说你想要一个角色让你的用户成为一个学校的管理员,但那个学校是一个web服务调用一些远程系统。

## 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