如何在Devise中阻止url地址(Ruby on Rails)

时间:2015-10-14 09:09:58

标签: ruby-on-rails

我在显示页面上屏蔽了显示链接:

<% if @post.user == current_user %>
  links
<%end%>

但我无法阻止非特权用户的网址:

http://localhost:3000/posts/1/edit

我该怎么办?

4 个答案:

答案 0 :(得分:1)

很有可能使用Pundit gem(https://github.com/elabs/pundit)。 您的政策将会显示:

class PostPolicy
  attr_reader :user, :post

  def initialize(user, post)
    @user = user
    @post = post
  end

  def edit?
    post.user == user
  end
end

你控制员的行动:

def edit
    @post = Post.find_by(id: params[:id])
    authorize @post
    ...
end

答案 1 :(得分:0)

在控制器的编辑操作中,执行相同的检查 - 例如:

@post = Post.find_by( id: params[:id] )

unless @post.user == current_user
  fail(ActionController::RoutingError, 'User cannot edit this post.')
end

您可以将错误检查简化为:

fail(ActionController::RoutingError, 'User cannot edit this post.') unless @post.user == current_user

我希望这有帮助!

答案 2 :(得分:0)

我想最好的方法是在帖子控制器中使用before_filter,即:

before_action :authorize_admin, only: [:show, :edit, :update, :destroy]

或:

before_filter :authorize_admin, except: [:show]

其中:authorize_admin是您必须在posts控制器(仅用于帖子)或应用程序控制器(用于所有控制器)中定义的方法,如下所示:

  def authorize_admin
    redirect_to :new_user_session unless current_user&&current_user.admin?
  end

答案 3 :(得分:0)

您正在寻找的是authorization

  

身份验证 =查明用户是否存在

     

授权 =   确定他们是否能够执行特定请求

Sergei Stralenia的答案是正确的 - 您需要使用其中一个授权宝石 - PunditCanCanCan是最受欢迎的两个 - 来验证用户是否能够编辑特定对象。

关于路由,您将无法删除edit路由,除非您将其分隔为admin命名空间(我将在一秒钟。

-

Sergei Stralenia帖子向您展示了如何使用Pundit,我会告诉您CanCanCan

#app/models/ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.admin?
      can :manage, Post
    else
      can :read, Post
    end
  end
end

#app/controllers/posts_controller.rb
class PostsController < ApplicationController
   def edit
     @article = Post.find params[:id]
     authorize! :edit, @article
   end
end

管理

如果您想在&#34; admin&#34;中编辑的帖子。区域,您最好使用以下内容:

#config/routes.rb
resources :posts, only: [:index, :show]
namespace :admin do
   resources :posts, only: [:new, :create, :edit, :update, :destroy]
end

这样,您将无法让非管理员用户在前端编辑/更新帖子。相反,他们必须进入admin区域并制作它以便他们能够在那里编辑它...

#app/controllers/admin/posts_controller.rb
class Admin::PostsController < ApplicationController
   #actions & authorization in here
end