我的 Rails 应用程序几乎是几个 Web 服务的前端。我坚持我的用户模型,仅此而已。我需要为我的 Web 应用程序添加授权,使用 Devise 进行身份验证。我注意到 CanCan 和 acl9 似乎主要在 ActiveRecord 模型的实例上工作。CanCan 或 acl9 是否仍能满足我的需求?在我的情况下使用这些库中有什么提示吗?
我应该寻找更适用于动作而不是实例的东西吗?
此外,这些都是基于角色的系统,我正在考虑使用基于权限的系统。他们仍然很合适吗?
我的 Rails 应用程序几乎是几个 Web 服务的前端。我坚持我的用户模型,仅此而已。我需要为我的 Web 应用程序添加授权,使用 Devise 进行身份验证。我注意到 CanCan 和 acl9 似乎主要在 ActiveRecord 模型的实例上工作。CanCan 或 acl9 是否仍能满足我的需求?在我的情况下使用这些库中有什么提示吗?
我应该寻找更适用于动作而不是实例的东西吗?
此外,这些都是基于角色的系统,我正在考虑使用基于权限的系统。他们仍然很合适吗?
我不能说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 用于其控制器操作授权方法,那就太好了,但我不知道这是否可能。祝你好运。
只是为了(最后:) 回答acl9。
Acl9 由两个非常独立的部分组成,访问控制子系统是您放入控制器中的所有授权内容,角色子系统是设置/检查/删除经过身份验证的用户的角色。
访问控制子系统唯一调用的是current_user.has_role?( role, obj=nil)
. 因此,角色子系统对 ActiveRecord、关联、数据库等的依赖为零。有一个帮助器(也可以回退到调用以获取 acl9 之一)并按照您的喜好实施您的访问检查。所以,您说您确实保留了您的用户模型,但是假设您希望您的用户的角色成为学校的管理员,但该学校是对某个远程系统的 Web 服务调用。acts_as_authorization_subject
has_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