将devise与Rails一起使用并将authentication_keys设置为[:username]时出现401 Auth错误

问题描述

嗨,我遇到的错误类似于此处的一些错误,但我认为根本原因是不同的,因为我发现没有解决方案。基本上,我在一个小项目上使用了Devise in Rails,尽管使用sign_up页面可以很好地工作(将用户放置在数据库中),但sign_in页面似乎可以找到用户,但没有将其设置为当前用户。从现成的解决方案中,我唯一改变的是使用:username作为auth密钥而不是:email。

class ApplicationController < ActionController::Base
  protect_from_forgery prepend: true

  skip_before_action :verify_authenticity_token
  before_action :configure_permitted_parameters,if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit(:username,:email,:password,:password_confirmation) }
    devise_parameter_sanitizer.permit(:sign_in) { |u| u.permit(:username,:remember_me) }

    devise_parameter_sanitizer.permit(:account_update) { |u| u.permit(:username,:current_password) }
  end
end

在我的初始化器/devise.rb中:

  config.authentication_keys = [:username]
  config.case_insensitive_keys = [:username]
  config.strip_whitespace_keys = [:username]

用户模型

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable,:lockable,:timeoutable,:trackable and :omniauthable

  devise :database_authenticatable,:registerable,:recoverable,:rememberable,:validatable

  def email_required?
    false
  end

  def email_changed?
    false
  end

  def will_save_change_to_email?
    false
  end
end

,控制台的输出如下所示:

Started POST "/users/sign_in" for ::1 at 2020-08-11 17:12:53 +0100
Processing by Devise::SessionsController#create as HTML
  Parameters: {"authenticity_token"=>"EbXx8CI0+FsF1HkNwHqsUW09BJ0HOW2lJDjWmJEc03d0AeaBOWVxNFpupUA+qLKIsiVMZ9kfbmCZidZMZIKoXA==","user"=>{"username"=>"bob","password"=>"[FILTERED]","remember_me"=>"0"},"commit"=>"Log in"}
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."username" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["username","bob"],["LIMIT",1]]
Redirected to http://localhost:3031/
Completed 302 Found in 103ms (ActiveRecord: 0.4ms | Allocations: 3788)


Started GET "/" for ::1 at 2020-08-11 17:12:53 +0100
Processing by BoardsController#index as HTML
Completed 401 Unauthorized in 0ms (ActiveRecord: 0.0ms | Allocations: 248)

董事会负责人只需:

before_action :authenticate_user!

由于身份验证失败,该页面重定向回sign_in。

感谢您的任何建议!

解决方法

将其放在此处,以防其他人遇到此问题。

如果使用的是Stimulus Reflex,则当前会禁用rails cookie_store,而改用cache_store。您可以切换回去:

config.session_store :cache_store

恢复默认设置

config.session_store :cookie_store

或运行rails dev:cache在开发环境中启用cache_store。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...