如何禁止用户访问其他用户页面?Rails权限控制需求
嘿,我来帮你搞定这个问题!你的需求很明确:登录后的用户不管在地址栏输入哪个/users/:id,不管这个ID对应的用户存不存在,都自动跳转到自己的个人页面对吧?咱们一步步来修改代码:
解决方案
首先要处理两种核心场景:
- 用户访问存在但不属于自己的用户ID时,重定向到个人页面
- 用户访问不存在的用户ID时,不抛出错误,直接跳转到个人页面
步骤1:修正前置动作的作用范围
你当前的UsersController里有两个不合理的前置动作配置:
logged_in_user作用在了:new(注册页面)上,会导致未登录用户无法注册correct_user也作用在了:new上,完全没必要
先把这两个配置修正:
class UsersController < ApplicationController # 只有需要登录才能访问的页面(个人页、编辑页等)才加这个前置 before_action :logged_in_user, only: [:show, :edit, :update] # 身份验证只作用在需要校验用户身份的动作上 before_action :correct_user, only: [:show, :edit, :update] # ... 其他原有代码 ... end
步骤2:修改correct_user方法,拦截非自身ID访问
原来的correct_user用User.find(params[:id])会在用户不存在时报错,而且跳转目标是首页,不符合需求。我们改成直接对比ID字符串(无需查询数据库,更高效),只要URL里的ID不是当前用户的,就重定向到个人页面:
private def correct_user # 注意params[:id]是字符串,要转成字符串和current_user.id对比 unless params[:id] == current_user.id.to_s redirect_to current_user, notice: "您只能访问自己的个人页面" end end
步骤3:捕获用户不存在的错误,友好跳转
当用户输入不存在的用户ID(比如/users/5)时,原代码里的User.find(params[:id])会抛出ActiveRecord::RecordNotFound错误。我们在UsersController里添加错误捕获逻辑,让这种情况直接跳转到个人页面:
class UsersController < ApplicationController # 捕获用户不存在的错误,调用自定义处理方法 rescue_from ActiveRecord::RecordNotFound, with: :redirect_to_current_user # ... 其他原有代码 ... private # 处理找不到用户的情况 def redirect_to_current_user redirect_to current_user, alert: "该用户不存在,已为您跳转至个人页面" end # ... 其他私有方法 ... end
额外检查:确保登录相关方法正常工作
你的代码里用到了log_in和current_user?方法,要确保ApplicationController里已经正确定义了这些核心方法(如果还没加的话):
class ApplicationController < ActionController::Base # 获取当前登录用户 def current_user @current_user ||= User.find_by(id: session[:user_id]) end # 执行登录操作,将用户ID存入session def log_in(user) session[:user_id] = user.id @current_user = user end # 判断是否为当前登录用户 def current_user?(user) user == current_user end # 验证用户是否登录的前置方法 def logged_in_user unless current_user redirect_to new_sessions_path, alert: "请先登录" end end end
这样修改后,不管用户输入什么样的/users/:id地址,只要已经登录,都会自动跳转到自己的个人页面;未登录用户会被引导到登录页面,注册页面也能正常访问了。
内容的提问来源于stack exchange,提问作者Minimalism
相关产品推荐
相关产品推荐

