Ruby on Rails 7 设计和 ldap 登录问题

问题描述 投票:0回答:1

我在我的 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)

这里缺少什么?

ruby-on-rails devise ldap
1个回答
0
投票

我发现了问题。应该是

<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>

设备视图生成器使用默认电子邮件配置。

© www.soinside.com 2019 - 2024. All rights reserved.