我的rails应用程序几乎是几个web服务的前端。我持久化我的用户模型,仅此而已。我需要向我的web应用程序添加授权,使用Devise进行身份验证。我注意到CanCan和acl9似乎主要在ActiveRecord模型的实例上工作。CanCan或acl9还能满足我的需求吗?对于在我的情况下使用这两个库,有什么建议吗?
我是否应该寻找在操作而不是实例上更有效的东西?
另外,这两个系统都是基于角色的系统,我正在考虑使用基于权限的系统。它们还会是一个很好的组合吗?
发布于 2012-02-13 14:56:01
我不能代表acl9说话。然而,cancan维基确实声称“如果没有提供的话,可以很容易地制作您自己的模型适配器”。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作为它的控制器操作授权方法,那就太好了,但我不知道这是否可能。祝好运。
发布于 2015-01-23 04:49:52
只是(最后:)对acl9的回答。
Acl9由两个非常独立的部分组成,Access Control Subsystem是您放入控制器中的所有授权内容,Role Subsystem是设置/检查/删除经过身份验证的用户的角色。
访问控制子系统唯一调用的是current_user.has_role?( role, obj=nil)。因此,角色子系统对ActiveRecord、关联、数据库等零依赖。是一个助手(a helper,acts_as_authorization_subject),它将依赖于ActiveRecord的has_role?方法添加到类中,但这是完全可选的,您可以自由实现自己的has_role?方法(也可以回退到调用super来获取acl9方法),并随心所欲地实现访问检查。所以,你说你do持久化你的用户模型,但是假设你想让你的用户有一个角色是学校的管理员,但是那个学校是一个远程系统的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
endhttps://stackoverflow.com/questions/8990640
复制相似问题