You need to enable JavaScript to run this app. Laravel+React项目如何限制仅认证用户可访问自身关联的用户资料
优惠活动
大模型
产品
解决方案
定价
更多

Laravel+React项目如何限制仅认证用户可访问自身关联的用户资料

解决方案

你需要同时做前端校验和后端强制校验,仅靠前端防护可以被轻易绕过,后端校验才是权限控制的核心。

1. 前端页面校验(优化体验用)

在/customize/:id对应的Home组件内,先获取当前登录用户ID与路由携带的资料ID,请求到资料数据后对比归属:

import { useParams, useNavigate } from 'react-router-dom';

const Home = () => {
  const { id } = useParams();
  const navigate = useNavigate();
  // 取当前登录用户信息
  const currentUser = JSON.parse(localStorage.getItem('userData'));

  useEffect(() => {
    // 先校验登录状态,未登录直接跳转登录页
    if (!localStorage.getItem('isLoggedIn') || !currentUser) {
      navigate('/login');
      return;
    }
    // 请求对应ID的资料详情
    axios.get(`http://localhost:8000/api/profile/${id}`)
      .then(res => {
        const profile = res.data;
        // 对比资料归属用户ID与当前登录用户ID
        if (profile.user_id !== currentUser.id) {
          alert('你无权限访问该资料');
          // 可跳转至403页或用户自己的资料页
          navigate('/dashboard');
        }
        // 校验通过后正常渲染页面逻辑
      })
      .catch(err => console.log(err))
  }, [id, navigate, currentUser])

  // 其余页面逻辑省略
}

你也可以封装全局路由守卫高阶组件,统一处理所有需要鉴权页面的登录状态校验,避免重复代码。

2. 后端强制校验(安全核心,必须做)

所有涉及资料查询、修改、删除的Laravel接口,都要加两层校验:

第一步:接口加认证中间件

建议使用Laravel Sanctum做API认证,登录成功后返回的token存在localStorage,给axios配置全局请求头默认携带token:

// 登录成功后存token,假设token存在response.data.data.token中
localStorage.setItem('auth_token', response.data.data.token);
// 全局配置axios请求头
axios.defaults.headers.common['Authorization'] = `Bearer ${localStorage.getItem('auth_token')}`;

Laravel路由加auth:sanctum中间件校验登录状态:

Route::group(['middleware' => 'auth:sanctum'], function () {
  // 所有需要登录的接口都放这里
  Route::get('/api/profile/{id}', [ProfileController::class, 'show']);
  Route::put('/api/profile/{id}', [ProfileController::class, 'update']);
  Route::delete('/api/profile/{id}', [ProfileController::class, 'destroy']);
});

第二步:接口内校验资料归属

在对应的控制器方法中,强制校验请求的资料归属是否为当前登录用户:

public function show($id)
{
    $profile = Profile::findOrFail($id);
    // 校验归属不匹配直接返回403
    if ($profile->user_id !== auth()->id()) {
        return response()->json(['message' => '无权限访问'], 403);
    }
    return response()->json($profile);
}

// update、destroy方法加同样的归属校验逻辑即可

完成以上两步后,即可完全实现用户仅能管理自己关联的资料的需求。

内容的提问来源于stack exchange,提问作者AlyaKra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 00:06:05