我仍然掌握Scala和函数式编程。
我正在尝试实现一种身份验证方法,但我只想在密码与哈希匹配的情况下返回,而且我不太清楚如何做到这一点。
请原谅下面的代码,我仍在努力试图将功能包裹起来。希望我已经足够说明我想要完成的任务。我只想返回一个结果, 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问题。
答案 0 :(得分:4)
as(Member.member.singleOpt)
会返回Option[Member]
。您可以filter
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
。
答案 1 :(得分:2)
返回类型是Option,表示它必须是Some(包含单个值)或None(不包含任何内容)。 Member.member.password应该是Option [Member]类型,所以else case应该是None(任何Option的子类)。
http://www.scala-lang.org/api/current/index.html#scala.Option
答案 2 :(得分:1)
您的方法返回Option[Member]
,这是一个很好的功能样式。如果您的身份验证通过,您可以返回Some[Member]
Member.member.singleOpt
。None
。否则返回null
而不是{{1}}。