如何在Rails中限制对不同页面的访问?

时间:2018-11-22 19:55:23

标签: ruby-on-rails

我有控制器用户

class UsersController < ApplicationController
  ......
  def show
    @user = User.find(params[:id])
  end

  def index
    @users = User.paginate(page: params[:page], per_page: 25)
  end
  ......    
end

现在的用户配置文件位于 / users / 1 / users / 2 等,用户列表位于 / users /

我想授予特殊访问权限:

     
  • 用户只能看到自己的个人资料
  •  
  • 管理员可以查看用户列表和任何个人资料

如何限制这种访问方式?

4 个答案:

答案 0 :(得分:0)

您应该使用cancancanpunditruby-toolbox.com的ACL库

答案 1 :(得分:0)

假设您定义了current_user,并且您的User类具有admin属性,则可以执行以下操作:

class UsersController < ApplicationController
  ......
  def show
    @user = User.find(params[:id])
    if current_user.admin || @user == current_user
      # render the show screen
    else
      # redirect to wherever
    end
  end

  def index
    if current_user.admin
      @users = User.paginate(page: params[:page], per_page: 25)
      # render the index screen
    else
      # redirect to wherever
    end

  end
  ......    
end

或者您可以只使用大量的授权宝石之一,例如cancancan或pundit。

答案 2 :(得分:0)

我可能会通过使用两个不同的端点(例如/profile/admin/users/1)来处理此问题。然后,您将拥有不同的控制器:

UserProfileController < ApplicationController
  def show
    @user = current_user
  end
end

和:

class Admin::UsersController < AdminController
  def show
    @user = User.find(params[:id])
    render 'user_profile/show' # or another template if you like
  end
end

class AdminController < ApplicationController
  before_action :ensure_admin

  def ensure_admin
    if !current_user.admin?
      raise ActionController::RoutingError, 'Not Found'
    end
  end
end

答案 3 :(得分:0)

考虑您的网址send_message(),您可以获取参数ID并将其与钩子中的当前用户ID进行比较:

user/1/

关于管理员,您可能有一个专用的命名空间,甚至进行了更彻底的检查,可以在其中查看用户个人资料。