首页 > 解决方案 > 为什么在 laravel 5.6 中从表单发送数据时会出现 401 错误?

问题描述

我工作 laravel 5.6.23 和 vue.js,我用自己的警卫(管理员)实现了中间件身份验证。这些是我的路线。

Route::prefix('admin')->middleware('auth:admin')->group(function () {
    Route::get('/', function () {
        return view('admin.welcomeLibrarian');
    });
    Route::resource('Admins','AdminController');
    Route::resource('Authors', 'AuthorController');
    Route::get('Books/authors','BookController@authors');
    Route::get('Books/themes','BookController@themes');
    Route::get('Books/editorials','BookController@editorials');
    Route::get('Books/check/{id}','BookController@check');
    Route::resource('Books', 'BookController');
    Route::get('Loans/debtsUser/{id}','LoanController@debtsUser');
    Route::get('Loans/userLoads/{id}','LoanController@userLoads');
    Route::get('Loans/destroyDebt/{id}','LoanController@destroyDebt');
    Route::resource('Loans', 'LoanController');
    Route::resource('Editorials', 'EditorialController');
    Route::resource('Themes', 'ThemesController');
    Route::post('RegisterUser','Auth\RegisterController@create');

    Route::get('Users','Auth\UserController@listUsers');
    Route::delete('Users/{id}','Auth\UserController@destroy');
    Route::put('Users/{id}','Auth\UserController@update');
    Route::get('userShow/{id}','Auth\UserController@show');
});

当您从表单发送数据时,一切正常,但是从用户表单发送数据时出现错误 401,我不明白为什么只有创建新用户的路由失败?下一个模板是一个插槽。

<template>
    <v-flex xs12 sm12 lg6>
    <v-card>
        <v-toolbar color="pink">
            <v-card-title primary-title>{{ source.title }}</v-card-title>
        </v-toolbar>
        <v-form v-model="valid" >
            <input type="hidden" name="_token" :value="csrf">
            <slot name='content-form'></slot>
        </v-form>
        <v-card-actions>
            <v-spacer></v-spacer>
            <v-btn color="green darken-1" flat="flat" @click="save()"  :disabled="!valid">Save</v-btn>
            <v-btn color="green darken-1" flat="flat" @click="$router.push(source.return)">Cancel</v-btn>          
        </v-card-actions>
    </v-card>
    <v-dialog v-model="dialog" max-width="290">
      <v-card>
        <v-card-title class="headline">{{ msm }}</v-card-title>
        <v-card-actions>
          <v-spacer></v-spacer>
          <v-btn color="green darken-1" flat="flat"  @click="$router.push(source.return)">return to list</v-btn>
          <v-btn color="green darken-1" flat="flat"  @click="resetForm">continue here</v-btn>
        </v-card-actions>
      </v-card>
    </v-dialog>
    </v-flex>
</template>
<script>
export default {
    props:{
        source:Object,
        form:Object
    },
    data: () => ({
        csrf: document.querySelector('meta[name="csrf-token"]').getAttribute('content'),
        valid: true,
        dialog:false,
        msm:'',
        error:false
    }),
    methods:{
        save(){
                let vm=this
                axios[this.source.method](this.source.create,this.form)
                    .then(function(response) {
                        Vue.set(vm.$data,'msm',response.data)
                    })
                    .catch(function(error) {
                        Vue.set(vm.$data, 'msm', error.response)
                        Vue.set(vm.$data,'error',true)
                })
                this.dialog=true
            },
        resetForm(){
            this.$emit('resetProps')
            this.dialog=false
        }
    } 
}
</script>

这是给用户的

<template>
  <v-layout justify-center align-center >
    <form-component :source='source' :form='form'>
        <div slot='content-form'>
            <v-text-field v-model="form.id" :rules="idRules" label="ID" v-show='updateShow' required></v-text-field>
            <v-text-field v-model='form.name' :rules="nameRules" label="Name" required></v-text-field>
            <v-text-field v-model="form.email" :rules="emailRules" label="email" required></v-text-field>
            <v-text-field v-model="form.phone" :rules="idRules" label="phone" required></v-text-field>
            <v-text-field v-model="form.password"  label="password" type="password" :rules="passRule" ></v-text-field>
        </div>
    </form-component>
  </v-layout>
</template>
<script>
import formComponent from "../utilities/form.vue"
export default {
    data: () => ({
        updateShow:true,
        source:{
            title:'Add User',
            create:'admin/RegisterUser',
            method:'post',
            return:'/Users'
        },
        form:{
            id:'',
            name:'',
            phone:'',
            password:'',

        },
        user:{},
        items: ['user','librarian','administrador'],
        nameRules:[
                v=> /^[A-Za-z\s]*$/gi.test(v) || 'sorry, the only letters ',
                v=> !!v || 'sorry, the name is required'
        ],
        idRules:[
                v=> /^[0-9]*$/gi.test(v) || 'sorry, the only numbers ',
                v=> !!v || 'sorry, the id is required'
        ],
        emailRules:[
            v => !!v || 'E-mail is required',
            v => /^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$/.test(v) || 'E-mail must be valid'
        ],
        passRule:[v => !!v || 'the password is required']
    }),
    beforeMount(){
        if(this.$route.meta.mode === 'edit') {
            this.source.title = 'Edit User'
            this.source.create = 'admin/Users/' + this.$route.params.id
            this.source.method = 'put'
            this.initializeUpdate(this.$route.params.id)
            this.updateShow=false
        }
    },
    components:{
        formComponent
    },
    methods:{
        initializeUpdate(id){
            let vm=this
            axios.get(`admin/userShow/${id}`)
            .then(function(response) {
                Vue.set(vm.$data,'form',response.data)
            })
        }
    }
}
</script>

标签: phpauthenticationaxioslaravel-5.6

解决方案


错误在控制器中,我忘记为多重身份验证进行正确的配置。前:

public function __construct()
{
    $this->middleware('guest');
}

后:

public function __construct()
{
    $this->middleware('guest:web');
}

推荐阅读