我在显示页面上屏蔽了显示链接:
<% if @post.user == current_user %>
links
<%end%>
但我无法阻止非特权用户的网址:
http://localhost:3000/posts/1/edit
我该怎么办?
答案 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&¤t_user.admin?
end
答案 3 :(得分:0)
您正在寻找的是authorization
身份验证 =查明用户是否存在
授权 = 确定他们是否能够执行特定请求
Sergei Stralenia
的答案是正确的 - 您需要使用其中一个授权宝石 - Pundit和CanCanCan是最受欢迎的两个 - 来验证用户是否能够编辑特定对象。
关于路由,您将无法删除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