Ruby on rails 如何限制对Rails中不同页面的访问?

Ruby on rails 如何限制对Rails中不同页面的访问?,ruby-on-rails,Ruby On Rails,我有控制器用户: class UsersController

我有控制器用户:

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

我想提供特殊访问权限:

  • 用户只能查看自己的配置文件
  • 管理员可以查看用户列表和任何配置文件

如何以这种方式限制访问?

如果定义了
当前用户,并且您的
用户
类具有
admin
属性,则应使用类似或来自的ACL库。您可以执行以下操作:

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
class UsersController

或者您可以使用大量授权宝石中的一种,比如cancancan或pundit。

我可能会通过使用两个不同的端点来处理这个问题,比如
/profile
/admin/users/1
。然后您可以为它们设置不同的控制器:

UserProfileController < ApplicationController
  def show
    @user = current_user
  end
end
UserProfileController
以及:

class Admin::userscocontroller
考虑到你的url
用户/1/
你抓取参数id并将其与钩子中的当前用户id进行比较:

before_action :auth_user

private

def auth_user
  unless params[:id].to_s == current_user.id.to_s
redirect_to root_path
end

关于管理员,您可能有一个专用的名称空间,可以通过更彻底的检查查看用户配置文件。

有很多很多方法可以做到这一点。有一些库可以做到这一点,您可以使用一种简单的方法(提示:您只需检查当前用户的角色并显示相应的页面)。有许多教程既涵盖了滚动自己的库,也涵盖了使用库。按照现在的措辞,这个问题相当广泛。你可以使用cancan或rolify,并将其与Deave的
当前用户
方法相结合。如果用户是admin,则允许他访问,否则检查他访问的配置文件的id是否等于当前用户id,否则将他扔到默认页面。
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
before_action :auth_user

private

def auth_user
  unless params[:id].to_s == current_user.id.to_s
redirect_to root_path
end