没有授权显示给管理员

时间:2013-03-18 17:39:25

标签: ruby-on-rails

我在用户控制器中添加了一个before filter和def check priv。假设设置为只有管理员可以查看/编辑所有配置文件,并且只有创建的用户才能查看自己的配置文件。像以前任何人都可以查看/编辑配置文件我尝试过几种方法,都没有用。当我以管理员或普通用户的身份查看个人资料时,我收到“未经授权”的消息。

任何帮助都将不胜感激。

users_controller:

  before_filter :check_privileges, :only => [:edit, :update]

  def check_privileges
    unless current_user.admin? || current_user.id == params[:id]
       flash[:warning] = 'not authorized!'
       redirect_to root_path 
    end
  end

的index.html:

   <%= link_to user.name, user %>
    <% if (current_user.admin? || current_user) == @user %>
        <%= link_to "Edit #{user} profile", user %>
        | <%= link_to "delete", user, method: :delete,
                                      data: { confirm: "You sure?"} %>
    <% end %>

2 个答案:

答案 0 :(得分:1)

我的应用程序中有类似的方法,尝试这样的方法:

def check_privileges
 return if current_user.admin? # this user is an admin, if is not the case do:
 flash[:warning] = 'not authorized!'
 redirect_to root_path
end

更新1

再次尝试将if条件更改为以下

if (condition || condition)

if ((condition) || (condition))

问题是如果没有声明声明,Ruby解析器将停在第一个条件。

更新2

我认为index.html.erb上的括号中有错误,请尝试以下操作:

 <%= link_to user.name, user %>
    <% if (current_user.admin? || (current_user == @user)) %>
        <%= link_to "Edit #{user} profile", user %>
        | <%= link_to "delete", user, method: :delete,
                                      data: { confirm: "You sure?"} %>
    <% end %>

答案 1 :(得分:0)

思考的食物也许你可以这样做:

  def correct_user
    @user = User.find(params[:id])
    if current_user.role? :administrator
      #Allow admin to access everyone account
    else
      access_denied unless current_user?(@user)
    end
  end

然后在您的视图中,您的视图会执行if statement。或者我最好的建议是使用像CanCan这样的东西。这样的东西可以让你很容易地设置角色身份验证。如果您查看它,可以在ability.rb中设置一定数量的规则,然后您可以在视图上强制执行。

如果你想使用CanCan的方法,你可以在你的能力中做这样的事情.rb

def initialize(user)
    user ||= User.new # guest user
   # raise user.role?(:administrator).inspect
    if user.role? :administrator

      can :manage, :all
      can :manage, User

    elsif user.role? :employee
      can :read, :all

    end

上面是一个例子......所以在你的views中你可以通过做类似的事情来强制执行这种规则

 <%= link_to user.name, user %>
    <% if can? :manage, @user %>
        <%= link_to "Edit #{user} profile", user %>
        | <%= link_to "delete", user, method: :delete,
                                      data: { confirm: "You sure?"} %>
    <% end %>

这样的事情应该有效。你的选择有希望这有帮助:)