基本上我有一个应用程序的登录/注册登录页。用户登录或注册后,我不希望他们再访问此路由。我不知道如何使用Hapi.js实现这一点。登录页面不使用任何身份验证策略,所以它不知道用户是否登录。
我通常使用的方法不是禁用路由本身,而是将登录用户重定向到登录路由之外。
正如您正确指出的那样,如果没有配置身份验证策略,那么您的登录路由当前不知道用户是否已登录。解决方案是向登录路由添加身份验证策略,但使用try模式。这意味着无论身份验证是否成功,都将执行处理程序。诀窍是,您可以检查用户是否通过了身份验证(通过检查request.auth.isAuthenticated
的值),并做出相应的反应。
所以你的路线可能是这样的:
server.route({
config: {
auth: {
strategy: 'session',
mode: 'try'
}
},
method: 'GET',
path: '/login',
handler: function (request, reply) {
if (request.auth.isAuthenticated) {
return reply.redirect('/'); // user is logged-in send 'em away
}
return reply.view('login'); // do the login thing
}
});
另一种结果相同的方法是将您的身份验证策略设置为try模式,作为所有路由的默认模式:
server.auth.strategy('session', 'cookie', 'try', {
password: 'password-that-is-longer-than-32-chars',
isSecure: true
});
注意第三个参数try
。使用这种方法,您不需要向路由本身添加任何auth-config,因为默认情况下它会尝试这种策略。根据server.auth.strategy
文件:
mode
-如果为true,则该方案将作为所需策略自动分配给任何没有身份验证配置的路由。只能分配给单个服务器策略。值必须为true(与"必需"相同)或有效的身份验证模式("必需"、"可选"、"尝试")。默认为false。
在hapi网站上的身份验证教程中有更多关于模式的信息。