我刚从Sorcery转到Devise。巫术是半无效的,虽然身份验证在轨道5中工作---测试助手不是。所以,我决定让开关成为Devise。我一直在收到可怕的401错误:
Completed 401 Unauthorized
我已经看到很多关于这个的问题......但是,这些答案都没有帮助我。
我的问题有点误导,因为你会立即假设我有一些魔法装置的残余物。我可能,但我已经彻底检查了一切。
1 - 如果我在Devise中使用忘记密码功能,我将在更改密码后自动登录---但是,我无法使用那些涂层凭据登录...得到401错误。
2 - 如果我完全清除现有密码(因为我非常确定巫术加密不同于设计加密)并使用设计更新密码或
3 - 当我遇到以下方法时,我已经跟踪了Devise和我的问题表面中的身份验证路径:
def valid_password?(password)
Devise::Encryptor.compare(self.class, encrypted_password, password)
end
即使使用设计成功更新了密码,似乎encrypted_password!=密码。
作为跟随Devise内部的auth路径的一部分,我还应该指出我正在使用Devise方法user.skip_confirmation!手动确认用户---因此,用户确认不应该是此问题的一部分。
我正在使用自定义Devise视图(虽然还没有改变它们)。我还生成了一个自定义会话控制器,因为我认为/认为这个问题可能与Pundit策略有关。但是,我正在使用以下内容在应用程序控制器中跳过策略验证...因此,Pundit应该不是问题:
after_action :verify_authorized, except: :index, unless: :devise_controller?
after_action :verify_policy_scoped, only: :index, unless: :devise_controller?
cookies_serializer在其他答案中被提出了很多次......我试过:json,:marshal,和:hybrid没有任何影响。
因此,身份验证失败,因为Devise :: Encryptor.compare(self.class,encrypted_password,password)返回false。但是,如果Devise保存了新密码---怎么能比较不返回true。并且,是的 - 我已正确输入凭据。
感谢您的帮助!
答案 0 :(得分:0)
确定。所以,attr_accessor:password,:Devise中不再需要password_confirmation ---而且,我的问题是负责任的。通过设置attr_accessor:password,我的app正在创建一个password =()方法,该方法在设计中覆盖了相同的方法。结果是无论我的密码最终是什么?'。我最初通过创建自己的密码设置器来找到它:
def password=(new_password)
@password = new_password
self.encrypted_password = password_digest(@password) if @password.present?
end
这与Devise内部结构中的方法完全相同。使用这种方法我的密码保存,我能够登录。我认为这很奇怪...所以,我删除了我的自定义方法,并且attr_accessor和身份验证继续工作。所以,基本上attr_accessor覆盖了设计方法,然后我创建了一个覆盖attr_accessor方法的setter方法。
这是很多工作,最终是如此简单。我希望这有助于其他人。我还有一些额外的测试要做,如果我发现其他任何问题,我会修改它。