2010-08-10 6 views
2

declarative_authorization을 사용하여 Rails3 컨트롤러의 보안을 시도하고 있습니다.선언적 승인 filter_access_to

컨트롤러에는 7 가지 RESTful 동작, 3 가지 사용자 지정 멤버 동작 (활성화, 비활성화, 복사) 및 하나의 사용자 지정 수집 동작 (공개)이 있습니다. 그러나 '공개'작업은 하나의 레코드 만 반환합니다.

인증 된 사용자는 사용자 지정 컬렉션 작업 (공용) 만 사용할 수 있어야합니다. 나머지는 current_user에서만 사용할 수 있습니다.

has_permission_on :foos, :to => :public 
has_permission_on :foos, :to => [:full_control, :copy, :activate, :deactivate] do 
    if_attribute :user => is {user} 
end 

privilege :full_control, :includes => [:index, :show, :new, :create, :edit, :update, :destroy] 

4 개 사용자 지정 작업은 routes.rb 파일에 정의되어 있습니다 :

resources :users do 
    resources :foos do 
    collection do 
     get :public 
    end 
    member do 
     post :activate, :copy, :deactivate 
    end 
    end 
end 

사용자 : has_many, FOOS; Foo : 사용자는 belongs_to입니다. FoosController에 정의 된 '표준'액세스 제어 (filter_resource_access : nested_in => : user)는 7, RESTful 액션에 대한 액세스를 제어하는 ​​것으로 보이지만 다른 4 (예상대로)에 대한 액세스를 제어하지 못합니다.

나는에 FooController을 변경하는 경우 :

filter_access_to :all, :nested_in => :users, :attribute_check => true 

I "는 ID없이 푸를 찾을 수 없습니다"라는 오류를 얻을.

질문 :

  1. 문서는 제안 것 : before_filter는 filter_access_to를 사용하는 경우 푸 모델을로드하기 위해 자동으로 호출됩니다. 나는 틀린가? filter_access_to의 추가 구성이 필요합니까? before_filter?를 수동으로 구성해야합니까?
  2. 또한 용도에 맞게 모델에 using_access_control을 추가해야합니까? 컨트롤러에 액세스 제어가있을 때 액세스 제어를 모델에 추가해야 할 때 나는 약간 명확하지 않습니다.
  3. 설명서에는 'create'권한이 설명되어 있습니다. privilege : create, : includes => : new. 또한 : 새로운 작업에는이 권한이 자동으로 해당 이름의 결과로 : create 작업을 포함합니까?
  4. authentication_rules.rb 파일이 변경된 경우 새 규칙을 적용하려면 서버를 다시 시작해야합니까?
+1

이 질문에 대한 답변을 찾으셨습니까? 나는 비슷한 문제에 직면하고있다. – Shreyas

답변

0

필터가 있기 전에 자동으로 필터가 있다고 생각됩니다. 필자는 항상 컨텍스트에 맞게 필터 앞에 자기 자신을 써야했습니다. 예를 들어, 모델의 모든 인스턴스에 대한 권한이 동일하지 않으면 인덱스 뷰의 경우 현재 인스턴스에 적합한 모델 인스턴스가 있어야합니다. 사용자가 게시물의 색인을 보는 것처럼 사용자를 위해 새로운 새 게시물을 만들거나 첫 번째를로드 할 수 있지만 더미는 안전하지 않으므로 처음에는로드하지 않는 것이 좋습니다. 일반적으로 나는 인덱스를위한 더미 생성자를 가지고 있고 다른 모든 것들은 실제로 보거나 (또는 ​​만지는) 무엇이든 테스트 할 수 있습니다.

컨트롤러가 지금까지 나를 위해 충분했기 때문에 모델 레벨은 확실히 요구되지 않았습니다. 그것은 여분의 안전 장치를 추가하지 않을 것이라고 말하는 것이 아니라, 정확하게 그것이 중요하게 될 때 전문가가 아닙니다. 나는 많은 컨트롤러 (예 : 모덜리스 컨트롤러)가 모델을 만졌을 때 가설을 세우고 아무것도 몰래 들여 오기를 원할 것이라고 가정합니다.

나는 권한을 사용하지 않았기 때문에 확실하지는 않지만, 당신이 설명하는 마법 상속이 일어나지 않는다고 생각합니다.특별히 요청되지 않은 권한을 만드는 것은 매우 엉성한 접근 인 것처럼 보입니다.

아니요, 다시 시작하지 않아도됩니다. - 적어도 개발 모드가 아님.