我的邮政控制器代码如下。我想要做的是用户应该能够删除自己的帖子,admin_user可以删除任何帖子。以下代码使admin_user可以删除帖子,但对于普通用户,当尝试删除自己的帖子时,它会重定向到root_path
似乎do_authentication无法正常运行,普通用户尝试以管理员身份进行身份验证而不是“correct_user”
可能出现什么问题?
谢谢!
class PostsController < ApplicationController
before_filter :signed_in_user, only: [:index, :create, :destroy]
before_filter :do_authentication, only: :destroy
.
.
.
def destroy
@post.destroy
flash[:success] = "Post deleted!"
redirect_back_or user_path(current_user)
end
private
def do_authentication
correct_user || admin_user
end
def correct_user
@post = current_user.posts.find_by_id(params[:id])
redirect_to user_path(current_user) if @post.nil?
end
def admin_user
@post = Post.find_by_id(params[:id])
redirect_to(root_path) unless current_user.admin?
end
答案 0 :(得分:0)
首先,我建议使用cancan进行授权。 我认为你的问题是correct_user的返回值。你无法控制它。如果该方法返回的计算结果为false,则do_authentication方法也将调用admin_user。同时查看您的代码似乎管理授权也不起作用......
试试这个:
def do_authentication
@post = Post.find_by_id(params[:id])
redirect_to redirect_location unless current_user.admin? or @post.user == current_user
end
def redirect_location
return "redirect_location_for_admin" if current_user.admin?
return "redirect_location_for_non_admins"
end
答案 1 :(得分:0)
方法correct_user,admin_user将为所有用户执行,无论他们的角色如何,因为您在调用方法时没有检查任何条件。需要改进代码以解决您的问题。
def do_authentication
if current_user.admin?
@post = Post.find_by_id(params[:id])
else
@post = current_user.posts.find_by_id(params[:id])
redirect_to user_path(current_user), :notice => "Access denied" unless @post
end
end