[vuejs/vue-router]用vuex 和 vue-router时,如何做用户登录?

2024-05-08 535 views
1

我是这样做的: 用户在登录后把token存在localStorage中,这一切都成功。假如此时用户关闭网页再次打开,从localStorage中读取token,ajax请求服务端验证此token并获得用户信息,保存在vuex store中,但我发现在Router.beforeEach中无法得到ajax请求服务端验证的结果后的vuex store状态,造成打开页面时没有登录,需要再次F5刷新才有。

现在我不知道如何做才能解决。

回答

9

登陆/鉴权应该用cookie而不是localStorage吧....后端下发有SET-COOKIE头 前端的请求浏览器也会自动带上cookie... 登陆验证这层理论上不应该和vue有任何关系,前端只应该提供登陆入口,其余时候都是假设已经登陆,发请求,并在后端返回需要登录时提示用户登录。前端保存登陆状态是没有用的。

2

@fnlctrl 没懂你意思,至于cookie还是localStorage是无所谓的,只是存一个字符串而已。只要支持就够了。你可以能没明白我要问的问题。

3

@waney 浏览器不会自动把localStorage内容带在HTTP请求头..

但我发现在Router.beforeEach中无法得到ajax请求服务端验证的结果后的vuex store状态,造成打开页面时没有登录

假定你的验证请求是写在vuex的actions里的,那router.beforeEach里肯定也拿不到那个异步action的回调啊..

假设登陆过,有token,那么打开页面的时候vuex的action请求用户信息,并更新数据绑定,结束。没token,那么当后端返回需要登录的时候,调用一下router.redirect。所以这里其实没有beforeEach什么事..

不是issue的问题还是请发到论坛去吧..

6

我是这么做的,前端不需要使用 cookie, localstorage

import User from 'store/user'

router.map({
    '/login': {
        component: require('page/user/login'),
        name: 'user/login',
        layout: 'login'
    },
    '/order': {
        component: require('page/user/order'),
        name: 'user/order',
        layout: 'order',
        auth: 'user'
    }
})

router.beforeEach(({to, next}) => {
    switch (to.auth) {
        case 'user':
            User.state.user ||
                to.router.go({name: 'user/login'})
            break
    }
    next()
})

router.start({
    created () {
        User.actions.getUser()
    },
    name: 'mobile'
}, 'body')
0

@yozman 你怎么确保用户下一次自动登录

2

@waney

router.start({
    created () {
        // 这里从服务器请求当前已登录的用户信息
        // 并更新 User store 的 state.user
        // 由于写在了根节点刷新之后也会生效的
        User.actions.getUser()
    },
    name: 'mobile'
}, 'body')
4

@waney 说一下我目前的处理方法: 在根组件的created勾子函数中,调用tokenLogin action (这里面会判断是否已经缓存登录信息,如有就会自动登录。在正常登录的时候,你需要保存登录信息状态等)

9

你好,issue 是用来报 bug 的,不是用来提问的。报 bug 时,请确保有完整的重现步骤。不符合要求的 issue 会被直接关闭。

3

no

6

啊这