You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter4登录页刷新CSRF错误及URL异常问题求助

问题说明

我做了一个登录页面,点击提交后刷新页面时,会出现**"The action you have requested is not allowed."**错误(截图如下):
The action you 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:32:23