2011-04-26 3 views
20

이 가이드에 따라 마이그레이션을 사용하여 데이터베이스에 부울 속성을 추가했습니다.Devise : 관리자에게 작업 제한

rails generate migration add_admin_to_user admin:boolean 

레일스 콘솔을 통해 내 계정을 관리자 (admin = 1)로 구성했습니다. 관리자 만이 특정 작업 (새 작업, 편집, 작성 및 삭제)에 대한 액세스를 제한하려는 컨트롤러가 있습니다.

일반 사용자도 있습니다.이 컨트롤러에서만 관리자를 위해 이러한 작업에 대한 액세스를 제한하려고합니다. 현재 코드를 사용하고 있습니다.

before_filter :authenticate_user!, :only => [:new, :edit, :create, :destroy] 

등록 된 사용자에게 액세스를 제한하는 방법 -이 단계를 더 진행하고 관리자가 필요한 방법은 무엇입니까?

답변

33

.admin을 사용하여 관리자 만 액세스 할 수 있도록 자신의 before_filter를 쉽게 구현할 수 있습니다. 메소드를 사용자 모델과 연관시킵니다. 예를 들면 :

before_filter :verify_is_admin 

private 

def verify_is_admin 
    (current_user.nil?) ? redirect_to(root_path) : (redirect_to(root_path) unless current_user.admin?) 
end 
+0

그랬습니다! 감사합니다 :) –

9
필터링하기 전에에서 자신 만의 방법을 정의하고 이전 호출에 사용자가 해당 방법으로 관리자인지 여부를 감지하는 것이 좋습니다

: authenticate_user를!

before_filter :custom_method, :only => [:new, :edit, :create, :destroy] 

private 
def custom_method 
    authenticate_user! 

    if current_user.admin 
    return 
    else 
    redirect_to root_url # or whatever 
    end 
end 

authenticate_user! current_user 변수를 확인하기 전에 단계를 수행하십시오.

ian.

+0

authenticate_user 전에 이것을 호출하는 문제! 전혀 로그인하지 않은 사용자가 액세스하려고하면 current_user가 정의되지 않았기 때문에 필터는 리디렉션과 반대되는 예외를 throw합니다. –

+1

@Will : authenticate_user! 방문자가 로그인하지 않은 경우 방문자를 sign_in 작업으로 자동 리디렉션하므로 if 절에 도달하지 못합니다. –

+1

개인적으로 이것이 최선의 접근 방법입니다. Devise가 캡슐화를 제공하고 이후에는 더 향상시킬 추상화를 유지합니다. 자신의 코드는 단순하면서도 표현력이 뛰어납니다. – josemota