Adonis JS - 哈希密码

时间:2016-11-22 04:23:20

标签: password-hash adonis.js

我已经完成了

  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/
  5. 还有一些。

    这应该相当简单,但我不知道为什么我无法解决这个问题。我想在“登录”时使用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() }}
    

    Controller:UserController

    '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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

有一种方法可以在不使用钩子或模型的情况下完成。只需在控制器本身中散列密码即可。但是我想用Hook来做。无论如何,这是代码:

Controller:UserController - &gt; 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工具无法验证密码。还有一件事,Hashed密码始终以 $ 2a $ 10 $ 开头。伙计们请帮忙!