CodeIgniter4登录页刷新CSRF错误及URL异常问题求助
问题说明
我做了一个登录页面,点击提交后刷新页面时,会出现**"The action you have requested is not allowed."**错误(截图如下):
同时存在另一个问题:当用户名或密码错误时,页面URL停留在/login/signIn,无法回到/login。
我的路由配置如下:
$routes->get('login', [Login::class, 'index'],['as' => 'user_login']); $routes->post('login/signIn', [Login::class,'signIn']);
控制器代码如下:
public function signIn() { helper('form'); $session = session(); $model = model(UserModel::class); $username = $this->request->getVar('username'); $password = $this->request->getVar('password'); $data = $model->where('username', $username)->first(); if($data){ $pass = $data['password']; if($pass == $password){ $ses_data = [ 'user_id' => $data['id'], 'username' => $data['username'], 'email' => $data['email'], 'logged_in' => TRUE ]; $session->set($ses_data); return redirect()->to('/'); }else{ $session->setFlashdata('msg', 'Wrong Password'); return view('templates/header') . view('login') . view('templates/footer'); } }else{ $session->setFlashdata('msg', 'username not Found'); return view('templates/header') . view('login') . view('templates/footer'); } }
解决方案
1. 修复刷新页面的权限错误
这个错误是CodeIgniter的CSRF保护机制触发的——提交POST请求后刷新页面,浏览器会重复发送POST请求,但此时原CSRF令牌已失效,导致权限拦截。
处理方式:
- 推荐方案:在登录表单中添加CSRF令牌字段,确保每次提交都携带有效令牌。在登录视图代码中加入:
<?= csrf_field() ?> - 临时调试方案:在POST路由中关闭CSRF保护(不建议生产环境使用),修改路由配置:
$routes->post('login/signIn', [Login::class,'signIn'], ['csrf' => false]);
2. 修复错误时URL不跳转的问题
当前错误分支直接返回视图,导致URL停留在/login/signIn。正确做法是重定向回登录路由,同时保留错误提示:
修改控制器中的错误分支代码:
// 密码错误分支 $session->setFlashdata('msg', '密码错误'); return redirect()->route('user_login'); // 用户名不存在分支 $session->setFlashdata('msg', '用户名不存在'); return redirect()->route('user_login');
重定向后URL会回到/login,且flash消息能正常在登录页面显示。
内容的提问来源于stack exchange,提问作者Yapeng
相关产品推荐
相关产品推荐

