You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁止用户访问其他用户页面?Rails权限控制需求

嘿,我来帮你搞定这个问题!你的需求很明确:登录后的用户不管在地址栏输入哪个/users/:id,不管这个ID对应的用户存不存在,都自动跳转到自己的个人页面对吧?咱们一步步来修改代码:

解决方案

首先要处理两种核心场景:

  1. 用户访问存在但不属于自己的用户ID时,重定向到个人页面
  2. 用户访问不存在的用户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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:38:29