Laravel 5.3中web.php、api.php如何配置实现仅管理员访问指定站点模块
配置问题与风险排查
你当前的配置存在严重的安全漏洞,同时有冗余配置,具体问题如下:
- 最大的风险是
api.php中定义的somecontent资源路由没有加任何权限校验,相当于未授权用户可以直接调用/api/somecontent下的所有增删改查接口,完全绕开你在web.php中配置的admin中间件,直接实现数据删除、查看等操作,完全不符合你的权限要求。 - 你在
web.php的admin路由组、api.php中重复定义了路径完全一致的API路由,Laravel会按路由注册顺序优先匹配先注册的规则,极大概率会命中api.php中无防护的路由,权限校验完全失效。 - 你重复调用了两次
Auth::routes(),一次在web中间件组外、一次在组内,会产生冗余路由,可能引发未知的登录/注册逻辑冲突。
核心疑问解答
1. 现有配置是否合理、有无安全隐患?
不合理,除了上面提到的API未授权访问的致命漏洞外,还有两个可优化的风险点:
- Webhooks路由目前没有加签名校验或IP白名单限制,第三方回调接口暴露在公网容易被伪造请求攻击,比如Stripe回调可以使用官方提供的签名校验逻辑,避免非法请求触发你的业务逻辑。
- 仅依赖路由中间件做权限校验存在单点失效风险,建议在控制器层再加一层权限校验(比如Laravel的Policy策略),就算路由配置漏加中间件,也能避免越权操作。
2. API路由应该放在哪里?
不需要在两个文件中重复定义,根据你的使用场景二选一即可:
- 如果你的后台Angular是和站点同域部署,走Session认证,直接把API路由统一放在
web.php的admin路由组中即可,保留现有的web、auth、admin中间件。需要注意Angular发请求时要携带CSRF Token,你可以在页面的meta标签中存入CSRF值,然后在Angular全局配置请求头:
$http.defaults.headers.common['X-CSRF-TOKEN'] = $('meta[name="csrf-token"]').attr('content');
- 如果你希望API走无状态的Token认证,适合后续扩展第三方调用的场景,就把API路由统一放在
api.php中,给路由组加上权限中间件,同时给用户表新增api_token字段,用Laravel5.3自带的auth:api守卫做认证:
// api.php修改为如下配置 Route::group(['prefix' => 'api', 'middleware' => ['auth:api', 'admin']], function () { Route::resource('somecontent', 'Api\SomecontentController'); });
此时Angular请求时需要携带Token头Authorization: Bearer 你的用户api_token,不需要再校验CSRF。
最终优化建议
- 立刻删除重复定义的API路由,只保留一处,并确保该路由绑定了
auth和admin中间件。 - 删除
web.php中web中间件组外的Auth::routes(),保留组内的即可。 - 校验你的
admin中间件逻辑是否正确:必须判断当前登录用户的角色是否为admin,不能仅判断是否登录。 - 给所有Webhooks路由加签名校验,避免伪造请求。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

