错误:POST http://localhost:8765/users/delete/delete8 403禁止

问题描述

我正在使用 cakePHP4。试图添加一些甜蜜。单击删除按钮时会弹出 Sweetalert,但当我单击确认删除时,它不会删除数据。

模板/布局/用户/index.PHP

<table>
<tr>
    <th>Username</th>
    <th>Usertype</th>
    <th>Created</th>
    <th>Action</th>
</tr>

<?PHP foreach ($users as $user) : ?>
    <tr>
        <td>
            <?= $this->Html->link($user->username,['action' => 'view',$user->slug]); ?>
        </td>
        <td>
            <?= $this->Html->tag('span',$user->utype) ?>
        </td>
        <td>
            <?= $user->created->format(DATE_RFC850); ?>
        </td>
        <td>
            <?= $this->Html->link('Edit',['action' => 'edit',$user- 
               >slug]); ?> /
            
            <a href="#" class="delete" data-slug="<?=$user->slug? 
               >">Delete</a>
           
        </td>
    </tr>
<?PHP endforeach; ?>

模板/布局/用户/index.PHP

<script>

deletes = document.getElementsByClassName('delete');
Array.from(deletes).forEach((element) => {
  element.addEventListener("click",(e) => {
    let ajax_url = $(e.target).attr('data-slug');
    
    Swal.fire({
      title: 'Are you sure?',text: "You won't be able to revert this!",icon: 'warning',showCancelButton: true,confirmButtonColor: '#3085d6',cancelButtonColor: '#d33',confirmButtonText: 'Yes,delete it!'
    }).then((result) => {
      if (result.isConfirmed) {
          $.ajax({
            method: 'POST',url: '/users/delete/'+ ajax_url,beforeSend: function(xhr){
                xhr.setRequestHeader(
                    'X-CSRF-Token',<?= json_encode($this->request- 
                       >getParam('_csrftoken')); ?>
                );
            },success: function(response){
                if(response){
                    Swal.fire(
                        'Deleted!','Your file has been deleted.','success'
                    )
                }
                else {
                    Swal.fire({
                      icon: 'error',title: 'Oops...',text: 'No data deleted',})
      }
            },error: function(e){
                console.log('error',e);
            }
          })
       
      } 
    })
  })
})

删除方法如下在我的UsersController.PHP

UsersController.PHP

public function delete($slug)
{
    $this->request->allowMethod(['post','delete']);
    $user = $this->Users->findBySlug($slug)->firstorFail();
    if ($this->Users->delete($user)) {
        $this->Flash->success("Deleted Successfully");
        return $this->redirect(['action' => 'index']);
    }
    $this->Flash->error('Unable to Delete user');
    return $this->redirect(['action' => 'index']);
}

路由文件在这里 配置/路由.PHP

  <?PHP

   use Cake\Http\Middleware\CsrfProtectionMiddleware;
   use Cake\Routing\Route\DashedRoute;
   use Cake\Routing\RouteBuilder;


  $routes->setRouteClass(DashedRoute::class);

  $routes->scope('/',function (RouteBuilder $builder) {

   $builder->connect('/',['controller' => 'Pages','action' => 
'display','home']);
  
  $builder->connect('/users/delete/{slug}',['controller' => 'Users','action' => 'delete']);

  $builder->connect('/pages/*','Pages::display');

  $builder->fallback();

});

解决方法

我确定是 CSRF 令牌。尝试更换

<?= json_encode($this->request->getParam('_csrfToken')); ?>

<?= json_encode($this->request->getAttribute('csrfToken')); ?>

我也不确定你的“beforeSend: function(xhr)”,你可以在这里看到一个有效的ajax调用示例:

https://stackoverflow.com/a/67253585/15256337

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...