2017-11-22 4 views
0

で全体ではなく、コントローラのアクションの個々のレコードへの権限を制限する私は、カテゴリRailsの

class Article < ApplicationRecord 
    belongs_to :category 


class Category < ApplicationRecord 
    has_many :articles, dependent: :destroy 

それは、私はいくつかのロール独自の認証と承認の基本的なUserモデルをただしているに属している記事でRailsのアプリを持っています特定のユーザーを特定のカテゴリの記事に限定しようとする道路ブロックに入る

"admin"ユーザーと "internal"ユーザーがいます。

私はカテゴリが唯一の管理と内部ユーザーに内部に設定されている任意の物品へのアクセスを制限したい

だけでなく内部というカテゴリがあります。

一般ユーザーまたはログインしていないユーザーが内部カテゴリの記事にアクセスしようとすると、ホームページにリダイレクトされ、アクセスが拒否されたことを知らせるフラッシュメッセージが表示されます。

私が見たくない特定のページは、そのカテゴリが内部に設定されている記事と内部カテゴリの表示ページであるすべての記事の表示ページです。

内部カテゴリの表示ページは、カテゴリが内部に設定されているすべての記事を繰り返します。

before_actionを使用して、新しいページ、編集ページ、破棄ページへの不正アクセスを制限するように設定しました。私の主な質問は以下のようになり

before_action :admin_user,  only: [:new, :edit, :destroy] 

def admin_user 
     redirect_to(root_url) && flash[:danger] = "You are not authorized!" unless current_user.admin? 
    end 

モデルだけではなく全体のコントローラのアクションから個々のレコードへのアクセスを制限するために、よりきめの細かい方法は何ですか?

私はcancancanのようないくつかの宝石を掘り起こしましたが、それらはすべてコントローラの操作全体へのアクセスを制限し、個々のレコードに制限することに焦点を当てていないようです。

ご意見をいただければ幸いです。

答えて

0

私はこのコードを実行する方法を見つけ出しましたが、私のコードは醜いと思いますし、それをきれいにしてよりエレガントにするための提案があります。私はそれが将来誰にも役立つ場合に私が答えを投稿すると思った。

ユーザーが表示しようとしている記事をチェックする記事コントローラにbefore_actionを追加しました。カテゴリが「内部」に設定されている場合は、内部ユーザーの場合のみ表示されます。また、内部でない限り編集から除外されます。

ユーザモデルには、ユーザを内部に設定するブール値があります。

before_action :internal_article, only: [:show, :edit] 

def internal_article 
    @article = Article.find(params[:id]) 
    if @article.category.name == "Internal" 
    redirect_to(root_url) && flash[:danger] = "You are not authorized to view that article!" unless logged_in? && current_user.internal? 
    end 
end 
0
あなたがコントローラでこのようにそれを使用するモデル

def self.non_internal 
    where(category: Category.where.not(name: 'internal')) 
end 

あなたの記事の中に入れ、このクラスのメソッドで行うことができます

@article = Article.non_internal.find(params[:id]) 
if @article.nil? 
    redirect_to(root_url) && flash[:danger] = "You are not authorized to view that article!" unless logged_in? && current_user.internal? 
end