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