2014-05-09 4 views
1

인증을 처리하기 위해 내 레일 4 앱에 devise을 사용하고 있으며 문제가 없습니다. 그러나 로그인 한 사용자가 showupdate 작업을 통해 자신의 사용자가 소유 한 항목 (즉, user_id에 링크 됨) 만 보거나 편집 할 수 있는지 확인하고 싶습니다.레일 4 사용자 인증

은 내가 이것을 current_user.id을 확인하여 모든 작업을 할 수있는 뭔가를 해킹 할 수 있다고 생각하지만, 유래 및 기타 장소에서 많은 사용자가 cancan을 사용하는 말 - 그것은 cancan가 죽고이다 나타나고 cancancan라는 대체 거기 그러나, 괜찮을지도 모르지만 나는 모른다.

레일 4에서 이것을 수행하는 표준 방법이 있습니까? cancancan과 같은 제 3 자의 보석을 계속 사용하는 가장 좋은 방법은 무엇입니까? 더 좋은 보석이 있니?

답변

1

저는 지난 몇 번의 프로젝트에서 Cancan 대신 Pundit을 사용해 왔습니다. 가볍고 유연하며 사용하기 쉽습니다. 여기에 링크가 있습니다 : https://github.com/elabs/pundit

귀하의 질문에 관해서는 각 모델에 대한 정책을 작성하게됩니다. 각 동작에 대해 메소드를 정의합니다. 그것은 아주 간단하고 내가 첨부 한 링크에 설명했다. 다음은 모델 (모델/post.rb)에서 업데이트 한 예입니다 :

def update 
    @post = Post.find(params[:id]) 
    authorize @post 
    if @post.update(post_params) 
    redirect_to @post 
    else 
    render :edit 
    end 
end 

권한을 정의하려면 호출 권한을 부여하십시오. 당신의 정책/post.rb에서

: true 또는 false를 반환

class PostPolicy < Struct.new(:user, :post) 
    def update? 
    user.admin? or not post.published? 
    end 
end 

. 귀하의 경우 사용자가 소유자인지 확인하려면 다음 if 문을 입력하면됩니다.

if user.admin? || user.owner_of?(post) 

아이디어를 얻을 수 있습니다. 범위 등을 정의 할 수도 있습니다.

1

나는 표준이 있다고 생각하지 않지만 본인이 필요로하는 것을 기반으로합니다. Rails 4에서, cancancan은 테이블에 많은 것을 가져다 주었고, Rails 커뮤니티에서 정기적으로 사용했던 보석으로 만들어졌습니다.

제가 익숙한 유일한 대안은 protectorpundit입니다. 아마도 이것들을 확인해보십시오.

그러나 cancancan과 보호자가 필요에 맞지 않는 경우 사용자는 언제든지 자신의 인증 솔루션을 굴릴 수 있지만 나에게 cancancan이 사용자의 요구를 충족시키는 경우 왜 다시 만들어야합니까?

0

Action Access을 사용하는 것이 훨씬 간단하고 간단합니다. 그것은이 아래로 비등이의

class ArticlesController < ApplicationController 
    let :user, :all 
    let :guest, [:show, :index] 

    # ... 

    def edit 
    not_authorized! unless @article.user == current_user 

    # ... 
    end 

    # ... 

end 

먼저 자동으로 사용자 만, 손님 만 표시하거나 인덱스 기사 수를 모든 행동에 액세스 할 수 있도록, 컨트롤러를 잠급니다. 그런 다음 not_authorized!은 기사 소유주가 아닌 사용자를 경고하고 리디렉션합니다.

좋은 점은 컨트롤러가 자체 포함되어 있기 때문에 컨트롤러와 관련된 모든 것이 컨트롤러 내에 있다는 것입니다. 이것은 또한 매우 모듈화되어 있으며 리팩터링 할 때 다른 곳에서는 잊혀진 쓰레기를 남기지 않습니다.

이 인증 시스템 (고안 너무 아무 문제)의 완전히 독립적이다하지만 같은 일을 할 수있는 편리한 모델 추가 세트 번들 : 그래서, ArticlesController을 말한다 여기 :article

<% if current_user.can? :edit, :article %> 
    <%= link_to 'Edit article', edit_article_path(@article) %> 
<% end %> 

을 현재 사용자가 edit 작업에 액세스 할 수있는 권한이있는 경우에만 ArticlesController 링크가 표시됩니다. 네임 스페이스도 지원합니다.

기본적으로 컨트롤러를 잠글 수 있고 리디렉션 경로 및 경고 메시지를 사용자 정의 할 수 있습니다. documentation을 확인하십시오.