我有一个简单的应用程序,如果连接的用户不是管理员,则需要保护一些页面。
我使用nuxt/auth包来处理身份验证:
auth: {
strategies: {
local: {
scopeKey: 'roles',
token: {
property: 'access_token',
type: 'Bearer',
name: 'Authorization',
},
user: {
property: 'user',
},
endpoints: {
login: {url: '/api/auth/login', method: 'post'},
// logout: { url: '/api/auth/logout', method: 'post' },
user: {url: '/api/auth/me', method: 'get'}
}
},
},
redirect: {
login: '/',
logout: '/',
callback: '/housing',
home: '/home'
},
plugins: [
'~/plugins/auth.js',
]
},
这工作得很好,但我在实现中间件时遇到了问题。因此,如果用户没有ROLE_ADMIN
角色,我想将他们重定向到主页
export default function ({app, $auth, $axios}) {
if (!$auth.user.roles.includes('ROLE_ADMIN')) {
console.log("unauthorized");
app.router.push(app.localePath('home'));
}
}
我在我想要的页面上使用中间件。例如,当用户登录并转到管理页面而不刷新页面时,它可以完美地工作。
但是,如果他们去刷新页面或使用直接URL,在被我的中间件重定向到主页后,nuxt/auth会立即将我的用户重定向到";未经授权的";页
为什么会有这种行为?
很抱歉上次回答不好。这是一个新的。
在硬刷新或从搜索栏移动到URL的情况下(同样的事情(,你会失去所有状态,你的应用程序会再次从头开始加载。此时,您将再次执行所有的中间件。
这是文档页面的报价
中间件将按以下顺序串行执行:
- nuxt.config.js(按文件中的顺序(
- 匹配的布局
- 匹配的页面
因此,您将再次执行auth
(@nuxt/auth
(中间件,然后执行您自己的自定义中间件。现在,如果你不保存用户的信息(在硬刷新之前成功登录的用户(,身份验证模块将不知道你是谁,因此会提示你再次登录。
到目前为止,这里没有任何异常。
以下是关于如何通过硬刷新保持数据的答案的链接:https://stackoverflow.com/a/66872372/8816585
简单的答案是:禁用auth/next登录的重定向,并在您自己的上处理它
redirect: {
login: false,
logout: '/',
callback: '/housing',
home: '/home'
},
如果你不禁用它,它总是会在登录后将页面重定向到主页