我已经完成了
还有一些。
这应该相当简单,但我不知道为什么我无法解决这个问题。我想在“登录”时使用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
}
谢谢!
答案 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 $ 开头。伙计们请帮忙!