2012-01-24 2 views
4

내 레일 앱은 여러 웹 서비스의 프론트 엔드입니다. 나는 내 사용자 모델을 유지하고있다. 인증을 위해 Devise를 사용하여 웹 응용 프로그램에 권한을 추가해야합니다. CanCan과 acl9가 ActiveRecord 모델의 인스턴스에서 주로 작동하는 것으로 나타났습니다. CanCan 또는 acl9가 여전히 내 요구 사항에 적합합니까? 내 상황에서 이러한 라이브러리 중 하나를 사용하기위한 팁?웹 서비스의 레일 인증

인스턴스 대신 작업에 대해 더 많은 작업을해야합니까?

또한 역할 기반 시스템이며 권한 기반 시스템을 사용하려고합니다. 그들은 여전히 ​​잘 어울릴까요?

답변

1

저는 acl9을 말할 수 없습니다. 그러나, cancan wiki는 "자신의 [모델] 어댑터가 제공되지 않으면 쉽게 만들 수 있습니다."라고 주장합니다. https://github.com/ryanb/cancan/wiki/Model-Adapter 즉, ActiveRecord를 사용하지 않더라도 여전히 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 

보고 약간의 중복, 예를 들면 : 수 있습니다 자사의 컨트롤러 작업 인증 방법,하지만 그게 가능한지 모르겠다. 행운을 빕니다.

0

그냥 (마지막으로 :) acl9에 대한 답변입니다.

Acl9는 사용자가 컨트롤러에 넣는 모든 권한 항목 인 Access Control Subsystem과 인증 된 사용자로부터 역할을 설정/확인/제거하고있는 Role Subsystem으로 구성됩니다.

액세스 제어 서브 시스템 이제까지 호출 current_user.has_role?(role, obj=nil) 것을 유일한. 따라서 역할 서브 시스템은 ActiveRecord, 연관성, 데이터베이스 등에 대한 의존성이 제로입니다. 이고 ActiveRecord 종속적 인 has_role? 메서드를 클래스에 추가하는 도우미()입니다.하지만 이는 전적으로 선택 사항이므로 구현할 수 있습니다. 자신의 has_role? 메소드 (또한 super을 호출하여 acl9를 호출 할 수 있음)를 사용하고 액세스 확인을 구현하십시오. 따라서 으로 사용자 모델을 유지하지만 사용자의 역할이 학교의 관리자가되기를 원하지만 그 학교는 일부 원격 시스템에 대한 웹 서비스 호출이라고 가정 해 보겠습니다.

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