CakePHP配置admin前缀后登录重定向当前页出现过多跳转问题求助
问题原因梳理
- 未给admin前缀下的UsersController的login动作设置公开访问权限:Auth/Authentication组件默认拦截所有未登录请求,包括登录页本身,导致未登录时访问登录地址会被反复重定向到登录地址,触发重定向次数过多异常
- 路由前缀大小写不匹配:路由配置里前缀用的是首字母大写的
Admin,Auth组件配置里写的是小写admin,CakePHP路由前缀大小写敏感,会导致路由解析错误 - 混用
Auth组件与新版本Authentication插件:登录逻辑里用的是Authentication插件的结果校验,但重定向用的是旧Auth组件的redirectUrl(),二者会话数据不互通,会导致登录成功后重定向逻辑异常 unauthorizedRedirect配置错误:直接设置为$this->referer(),如果用户直接访问登录页没有来源页,或者来源页本身是需要授权的页面,会反复触发重定向
修复步骤
步骤1:统一路由前缀大小写
修改路由配置,将前缀统一为规范小写,避免解析错误:
Router::prefix('admin', function(RouteBuilder $builder) { $builder->connect('/', ['controller' => 'Pages', 'action' => 'index']); $builder->fallbacks(DashedRoute::class); });
步骤2:给登录动作放开权限校验
在Admin/UsersController中添加beforeFilter方法,将登录动作标记为无需登录即可访问:
public function beforeFilter(\Cake\Event\EventInterface $event) { parent::beforeFilter($event); // 放开登录动作的权限校验 $this->Authentication->addUnauthenticatedActions(['login']); }
步骤3:修正认证配置与登录逻辑
首先修正AppController中Auth组件的unauthorizedRedirect配置,避免referer导致的死循环:
public function initialize() { parent::initialize(); $this->loadComponent('RequestHandler'); $this->loadComponent('Flash'); $this->loadComponent('Auth', [ 'loginAction' => [ 'controller' => 'Users', 'action' => 'login', 'prefix' => 'admin' ], // 未授权时统一跳转到登录页,不要使用referer 'unauthorizedRedirect' => [ 'controller' => 'Users', 'action' => 'login', 'prefix' => 'admin' ], 'logoutRedirect' => [ 'controller' => 'Users', 'action' => 'login', 'prefix' => 'admin' ] ]); }
再修正登录动作的重定向逻辑,统一使用Authentication插件的逻辑,不要混用两个认证组件的方法:
public function login() { $this->request->allowMethod(['get', 'post']); $result = $this->Authentication->getResult(); if ($result->isValid()) { // 优先跳转到用户之前访问的页面,无来源页则跳转到admin首页 $redirect = $this->request->getQuery('redirect', [ 'controller' => 'Pages', 'action' => 'index', 'prefix' => 'admin' ]); return $this->redirect($redirect); } if ($this->getRequest()->is("post") && !$result->isValid()) { $this->Flash->error('邮箱或密码错误。'); } $this->viewBuilder()->setLayout('AdminTheme.login'); }
步骤4:清理缓存生效配置
修改完成后执行控制台命令清理所有缓存,避免旧配置残留:bin/cake cache clear_all
内容的提问来源于stack exchange,提问作者user11791297
相关产品推荐
相关产品推荐

