0

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

任何帮助,将不胜感激。

用户控制器:

  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

索引.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 %>
4

2 回答 2

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 %>
于 2013-03-18T17:53:46.967 回答
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 %>

像这样的东西应该工作。您的选择在那里希望这会有所帮助:)

于 2013-03-18T19:44:16.160 回答