在Restful Authentication中,我发现current_user
非常复杂,当@current_user
设置为false时,则表示不再尝试再次查找用户(通常来自数据库)虽然nil
表示没问题,但可以在DB中再次查找:
lib/authenticated_system.rb
def current_user
@current_user ||= (login_from_session
|| login_from_basic_auth
|| login_from_cookie) unless @current_user == false
end
复杂的是,如果它试图从login_from_session
等查找数据库,但找不到它,那么分配给@current_user
的最终值是{{1} ,并且该方法返回nil
(这是方法中的最后一个评估值)。除非其他地方的代码中有另外两个地方实际上可以将nil
设置为false,并且会触发@current_user
,导致整个语句返回unless
,而nil
}保留为@current_user
,方法返回false
...
我几乎说不出话来依赖这些错综复杂的事实。 nil
具有特殊含义,false
在代码中具有特殊含义,但没有记录,没有评论,nil
可以是current_user
,而nil
可以继续@current_user
。它实际上是一种设计模式,所以人们熟悉并熟悉它吗?
答案 0 :(得分:1)
在Rails历史中,RestfulAuthentication在这一点上被认为是非常陈旧和令人讨厌的,部分原因是代码就像你指出的那样。
我认为大多数人会建议您使用更现代的身份验证解决方案,例如Devise或Authlogic。