所以,我对rails和设计有些新意,所以如果这是一个基本问题我会提前道歉。我在任何地方都找不到任何关于此的信息,我彻底搜查了。这也让我想知道Devise是否适合这个,但是我们走了:
我有一个应用程序,其中设计用户身份验证工作得很好,我得到它,正确实现它并且它工作。
在我的应用中,用户可以属于某个群组,并且该群组的密码是用户必须输入才能“加入”群组的。
我成功将devise :database_authenticatable
添加到我的模型中,当我创建它时,会创建一个加密密码。
我的问题是,我无法对此进行身份验证!我有一个表单,用户加入组,搜索他们的组,然后输入密码。
这就是我的尝试:
def join
@home = Home.find_for_authentication(params[:_id]) # method i found that devise uses
if @home.valid_password?(params[:password]);
render :json => {success: true}
else
render :json => {success: false, message: "Invalid password"}
end
end
这给了我错误:can't dup NilClass
在这一行:@home = Home.find_for_authentication(params[:_id])
有什么问题?
答案 0 :(得分:1)
问题出在这里:
Home.find_for_authentication(params[:_id])
我之前从未使用database_authenticatable
(会研究它,谢谢!),所以我checked the Devise为您提供文档
他们推荐的方法:
User.find(1).valid_password?('password123') # returns true/false
-
<强>对象吗
您使用的方法has a doc:
根据给定的条件(即通过登录表单)查找第一条记录。 始终在身份验证过程中调用此方法,但它 也可以包裹。例如,数据库可验证 提供一个包含呼叫的
find_for_database_authentication
这种方法。这允许您自定义两个数据库 通过自定义可验证或整个验证堆栈find_for_authentication.
覆盖以添加自定义条件,创建连接或使用a namedscope在验证时过滤记录
实际代码如下所示:
def self.find_for_authentication(tainted_conditions)
find_first_by_auth_conditions(tainted_conditions)
end
看看这段代码,在我看来,通过一个单一的参数并不会削减它。您需要一个对象(因此User.find([id])
),或者您需要向该方法发送一系列参数
然后我找到了this:
class User
def self.authenticate(username, password)
user = User.find_for_authentication(:username => username)
user.valid_password?(password) ? user : nil
end
end
我建议这样做:
@home = Home.find_for_authentication(id: params[:_id])
...