作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我仍在掌握 Scala 和函数式编程的窍门。
我正在尝试实现一种身份验证方法,但我只想在密码与哈希匹配时返回,但我不太确定该怎么做。
请原谅下面的代码,我仍在努力尝试围绕功能性问题进行思考。希望我已经付出了足够的努力来说明我想要完成的事情。我只想返回一个结果,IF 和 ONLY IF 密码与提供的密码匹配,否则我希望它表现得像什么都没找到一样。
def authenticate(name: String, password: String): Option[Member] = {
DB.withConnection { implicit c =>
SQL("select * from member where lower(membername)={membername}").on(
'membername -> name.toLowerCase()
).as(Member.member.singleOpt)
if(BCrypt.checkpw(password, Member.member.password)) {
Member.member.singleOpt
} else {
null
}
}
}
我正在使用 PlayFramework 和 Anorm。但是,我认为这更像是一个普遍的 Scala 问题。
最佳答案
as(Member.member.singleOpt)
返回一个 Option[Member]
。您可以像任何集合一样过滤
Option
,这将允许您过滤掉凭据不正确的用户。
def authenticate(name: String, password: String): Option[Member] = {
DB.withConnection { implicit c =>
SQL("select * from member where lower(membername)={membername}").on(
'membername -> name.toLowerCase()
).as(Member.member.singleOpt)
.filter(member => BCrypt.checkpw(password, member.password))
}
}
filter
的内部函数只有在找到Member
时才会被调用。如果 BCrypt.checkpw(password, member.password)
为 false,则 Some(member)
将变为 None
,因此 authenticate
将在凭据不正确时返回 None
。
关于scala - 如何仅在条件为真时返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24977076/
我是一名优秀的程序员,十分优秀!