出于安全原因,我们会创建用户并向他们发送临时生成的密码。在第一次登录时,用户应该在继续导航受保护的页面之前更改密码。
我使用运行本地护照模块的快递/节点网站。注册,登录用户所有工作。但是,我在第一次登录时更改了密码的最佳做法是丢失了。
我的想法是做以下事情:
data-toggle="tab"
正如您所看到的,我在数据库中设置了一个简单的布尔值(tinyInt 0-1)(默认为1)。之后我会设置一个post方法,在成功更改后,布尔值将设置为0.
这是正确的方式(' a'不是':p)?安全性怎么样?
答案 0 :(得分:4)
肯定是 正确的方法。我认为它非常适合您的需求。我个人喜欢数据库字段的使用如何直接反映其背后的业务逻辑。
备选方案,虽然我很喜欢你的解决方案,但可能是:
1
向数据库添加lastLogin
日期字段,默认为NULL
。这将在用户登录时存储日期时间戳。如果用户以前曾登录过,您可以将其用作隐式检查。我个人更喜欢为其目的使用明确的列(就像您使用firstLogin
列一样),因为应用程序的列和业务逻辑的目的非常明确。
<强> 2 强>
另一种替代方案是在用户上次更新密码时存储,即lastPasswordChange
默认为NULL
新用户。与上述相同的推理。如果您希望用户每隔n
天更改一次密码,则非常有用。
安全发言我会说这是坚实的。只要您的firstLogin
字段默认为1
,新用户就无法在首次登录时跳过密码更改。
但是,当用户更新其密码时,请务必更新同一查询中的firstLogin
字段或执行事务内的两个查询。这样,您始终可以确保密码和 firstLogin
字段都已更改。如果由于某种原因查询失败,您将有一个用户已经更改了密码,并被要求/被迫再次更改密码,或者有一个随机生成密码而没有被要求更改密码的用户。
在同一查询中执行此操作将确保两者同时更新或两者都不更新。在事务内部执行此操作会使您在任一查询失败时选择失败/回滚事务。
另一方面,您的代码可以这样编写(无论是您的方式都是正确的,这只是偏好和视觉问题):
/* POST login page. */
router.post('/login', function(req, res, next) {
passport.authenticate('local', {
successRedirect: '/dashboard/users',
failureRedirect: 'pages/login'
}, function(err, user, info) {
if(err) {
console.log('')
return res.render('pages/login', {title: 'Login', error: err.message});
}
if(!user) {
return res.render('pages/login', {title: 'Login', error: info.message});
}
return req.logIn(user, function(err) {
if(err) {
return res.render('pages/login', {title: 'Login', error: err.message});
}
// Using if/else if/else makes no difference since if the first if is executed
// in both cases nothing else will execute due to if/else or the return.
// In case the above statement resolves to `false` the effect wills till be the same
if (user.firstLogin) {
return res.redirect('/change-password'); // <- First login
}
// The else is not necessary due to the return in the line above.
return res.redirect('/dashboard/users');
});
})(req, res, next);
});
如果您想对这两个问题提供更具体的答案,我需要一个更具体的问题。
答案 1 :(得分:1)
移动&#34;首次登录&#34;这可能是一件好事。逻辑到一个单独的中间件,它为所有&#34;登录的路由&#34;执行。
根据您的建议,用户可以在重定向后离开/更改密码?