我在我的 Rails 应用程序中使用 Devise 和 devise_ldap_authenticatable gem。我希望用户能够使用他们的用户名而不是电子邮件地址登录,但有一个问题。当我在 Chrome 浏览器中输入登录名和密码并单击“登录”时,会出现消息
"include the @ sign in the email address"
。但是,当我输入电子邮件地址时,日志中会出现有关无法使用指定用户进行授权的错误,这是事实,因为域中没有此类用户。因此,LDAP 集成似乎工作正常,但我在设备配置中找不到一些验证。以下是我当前的配置
devise.rb
Devise.setup do |config|
# ==> LDAP Configuration
config.ldap_logger = true
config.ldap_create_user = true
config.ldap_update_password = false
config.ldap_config = "#{Rails.root}/config/ldap.yml"
config.ldap_use_admin_to_bind = true
require 'devise/orm/active_record'
config.authentication_keys = [:username]
config.case_insensitive_keys = [:username]
config.strip_whitespace_keys = [:username]
config.skip_session_storage = [:http_auth]
config.stretches = Rails.env.test? ? 1 : 12
config.responder.error_status = :unprocessable_entity
config.responder.redirect_status = :see_other
end
应用程序/模型/user.rb
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :ldap_authenticatable,
:trackable, :timeoutable
enum role: {logged_in: 0, reader: 1, regular: 2, moderator: 3, acceptor: 4, admin: 5}
end
控制器/用户/sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
before_action :configure_sign_in_params, only: [:create]
# GET /resource/sign_in
def new
super
end
# POST /resource/sign_in
def create
super
end
# DELETE /resource/sign_out
def destroy
super
end
protected
# If you have extra params to permit, append them to the sanitizer.
def configure_sign_in_params
devise_parameter_sanitizer.permit(:sign_in, keys: [:username])
end
end
应用程序/视图/用户/会话/new.html.erb
<h2>Log in</h2>
<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
<div class="field">
<%= f.label :username, "Enter your login" %><br />
<%= f.email_field :username, autofocus: true, autocomplete: "username" %>
</div>
<div class="field">
<%= f.label :password %><br />
<%= f.password_field :password, autocomplete: "current-password" %>
</div>
<% if devise_mapping.rememberable? %>
<div class="field">
<%= f.check_box :remember_me %>
<%= f.label :remember_me %>
</div>
<% end %>
<div class="actions">
<%= f.submit "Log in" %>
</div>
<% end %>
<%= render "users/shared/links" %>
我正在使用
Rails 7.1.3.2
ruby 3.2.3
devise (4.9.4)
devise_ldap_authenticatable (0.8.7)
这里缺少什么?
我发现了问题。应该是
<div class="field">
<%= f.label :username, "Enter your login" %><br />
<%= f.text_field :username, autofocus: true, autocomplete: "username" %>
</div>
相反
<div class="field">
<%= f.label :username, "Enter your login" %><br />
<%= f.email_field :username, autofocus: true, autocomplete: "username" %>
</div>
设备视图生成器使用默认电子邮件配置。