Adonis JS - 密码哈希化

5

我已经查阅了以下资料:

  1. http://adonisjs.com/docs/3.1/database-hooks#_hooks_events
  2. http://adonisjs.com/docs/3.1/encryption-and-hashing#_hashing_values
  3. https://adonisjs.svbtle.com/basic-authentication-with-adonisjs#using-hash-provider_3
  4. https://auth0.com/blog/creating-your-first-app-with-adonisj-and-adding-authentication/

还有其他一些资料。

这应该很简单,但我不知道为什么解决不了。我想在登录时使用 Adonis 的身份验证工具,需要在保存之前对密码进行哈希处理。我卡在这里了。

视图

<h1>Sign up</h1>
{{ form.open({url: '/addNew', action: 'UserController.addNewUser'}) }}

{{ csrfField }}

<div class="field">
{{ form.label('username', 'Choose a username') }}
{{ form.text('username') }}
</div>

<div class="field">
{{ form.label('email', 'Enter email address') }}
{{ form.text('email') }}
</div>

<div class="field">
{{ form.label('password', 'Choose a strong password') }}
{{ form.password('password') }}
</div>

<div class="button">
{{ form.submit('Sign Up') }}
</div>

{{ form.close() }}

控制器: 用户控制器

'use strict'

const Database = use('Database')
const User = use('App/Model/User')
const user = new User()

class UserController {

* index (request, response) {
 const users = yield Database.select('*').from('users')
 response.json(users)
}

* addNewUser (request, response){

 user.name = request.input('username')
 user.email = request.input('email')
 user.password = request.input('password')
 user.entry = "Lorem Ipsum";

//Insert into database
  const userId = yield Database
 .insert({name: user.name, email: user.email, password: user.password, entry: user.entry})
 .into('users')

 response.json(userId)
 }
}
module.exports = UserController

模型:用户

'use strict'

const Lucid = use('Lucid')


class User extends Lucid {

static boot () {
   super.boot()
   this.addHook('beforeCreate', 'User.encryptPassword')
  }
}


module.exports = User

钩子:用户

'use strict'

const Hash = use('Hash')
const User = exports = module.exports = {}

User.encryptPassword = function * (next) {
  this.password = yield Hash.make(request.input('password'))
  yield next
}

谢谢!

2个回答

3
你应该使用Model本身来创建记录。为什么要使用Database提供程序呢?
文档中没有提到需要实例化一个模型,然后使用数据库提供程序进行调用。所以应该这样做:

控制器

* addNewUser (request, response) {
  const user = new User()
  user.name = request.input('username')
  user.email = request.input('email')
  user.password = request.input('password')
  user.entry = "Lorem Ipsum";
  yield user.save()
  response.json(user.id)
}

在您的钩子函数中,您无法访问request对象。我相信您没有仔细阅读文档。

钩子函数

'use strict'

const Hash = use('Hash')
const User = exports = module.exports = {}

User.encryptPassword = function * (next) {
   this.password = yield Hash.make(this.password)
   yield next
}

请查看这里的钩子文档 http://adonisjs.com/docs/3.1/database-hooks#_basic_example

在Adonis v4模型内使用的钩子

class User extends Model {
  static boot () {
    super.boot()

    this.addHook('beforeCreate', async (userInstance) => {
      userInstance.password = await Hash.make(userInstance.password)
    })
  }
}

点击此处查看钩子的文档 https://adonisjs.com/docs/4.1/database-hooks#_defining_hooks


太好了!正如你所说,我没有费心阅读文档,只是在胡乱编造东西! - Roy

0

有一种方法可以在不使用钩子或模型的情况下完成它。只需在控制器本身中对密码进行哈希处理即可。但我想使用钩子来完成它。无论如何,以下是代码:

控制器:UserController -> addNewUser()

user.name = request.input('username')
user.email = request.input('email')
const pswd = request.input('password')
user.password = yield Hash.make(pswd)

注意:我不确定 Hash.make 究竟使用了哪种加密方式。但是 Adonis 的 encryption 工具无法验证密码。还有一件事,哈希密码始终以$2a$10$开头。各位大佬请帮忙!

1
Adonis使用bcrypt https://en.wikipedia.org/wiki/Bcrypt和Blowfish密码。这就是为什么它以$2a$10$开头的原因。 - Romain Lanz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接