Drupal 8登录后重定向至内部URL问题求助
Drupal 8登录后重定向403问题解决
问题原因
你直接调用$response->send()会强制立即触发跳转,跳过了Drupal登录流程中的会话权限初始化和权限验证环节。哪怕管理员实际有权限访问目标页面,系统还没完成用户权限的加载确认,就被强制跳转,因此返回"Access denied"错误。
解决方案
方案一:使用Drupal目标路径服务(推荐)
利用Drupal内置的重定向机制,设置登录后的目标路径,让系统按正常流程完成权限验证后再跳转:
use Drupal\Core\Url; function mymodule_user_login($account) { // 替换为你的仪表盘页面对应的路由名称(优先用路由名而非硬编码URI) $url = Url::fromRoute('your_dashboard_route_name'); // 设置登录后跳转的目标路径 \Drupal::service('redirect.destination')->set($url->toString()); }
如何查找路由名称:
- 访问仪表盘页面,查看页面源代码,找带有
data-drupal-link-system-path的元素,对应路由可通过Drush命令drush routes-list搜索路径获取;- 或在模块的
routing.yml文件中查找仪表盘页面的路由定义。
方案二:通过Drupal内核处理响应
如果必须使用RedirectResponse,不要直接调用send(),而是把响应交给Drupal内核处理:
use Drupal\Core\Url; use Symfony\Component\HttpFoundation\RedirectResponse; function mymodule_user_login($account) { $url = Url::fromRoute('your_dashboard_route_name'); $response = new RedirectResponse($url->toString()); // 将响应注入请求属性,由Drupal内核完成后续流程 \Drupal::request()->attributes->set('_controller_result', $response); }
额外注意事项
- 避免硬编码
internal:/dashboard-overview这类URI,使用路由名称更健壮,后续路径变更时无需修改代码; - 确认仪表盘页面的路由权限配置正确,确保管理员及目标用户组拥有访问该页面的权限。
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

