2015-11-24 4 views
2

Я использую Devise 3.5.2 для аутентификации с жемчужиной devise_ldap_authenticable на Rails 4.2.4. Я перешел от выпущенного урона 0.8.5 к уровню мастер-уровня github (0.8.6).Указать без аутентификации с помощью LDAP

Из того, что я могу сказать, код аутентификации плагина LDAP не запущен. Он не записывает никаких сообщений журнала.

Раньше я использовал обычную проверку подлинности базы данных для работы в этом приложении. Теперь я пытаюсь получить аутентификацию LDAP.

Например:

Started POST "https://stackoverflow.com/users/sign_in" for ::1 at 2015-11-23 16:05:14 -0500 
    ActiveRecord::SchemaMigration Load (87.6ms) SELECT schema_migrations.* FROM schema_migrations 
Processing by Devise::SessionsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"Mos...w==", "user"=>{"login"=>"leonsp", "password"=>"...", "remember_me"=>"0"}} 
Completed 401 Unauthorized in 95ms (ActiveRecord: 0.0ms) 

Там должны быть сообщения журнала LDAP там.

Моя модель пользователя:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    # 
    # :database_authenticable is not enabled 
    devise :ldap_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable, 
    :confirmable, :lockable, :zxcvbnable 

    attr_accessible :email, :userid, :shortuserid, :login # etc... 

    # Virtual attribute for authenticating by either userid or email 
    # This is in addition to a real persisted field like 'userid' 
    attr_accessor :login 

    # ... 

    def self.find_for_database_authentication(warden_conditions) 
    Rails.logger.debug "Finding for database authentication" 
    conditions = warden_conditions.dup 
    login = conditions.delete(:login).try(:downcase) 
    if login.present? 
     Rails.logger.debug "Finding by login #{login}" 
     where(conditions.to_hash).find_by([ 
     "lower(userid) = :value OR lower(shortuserid) = :value OR lower(email) = :value", { value: login } 
     ]) 
    else 
     Rails.logger.debug "Finding by conditions #{login}" 
     find_by(conditions.to_hash) 
    end 
    end 

    def self.find_for_ldap_authentication(warden_conditions) 
    Rails.logger.debug "Finding for ldap authentication" 
    conditions = warden_conditions.dup 
    login = conditions.delete(:login).try(:downcase) 
    if login.present? 
     Rails.logger.debug "Finding by login #{login}" 
     if login.include? "@" 
     conditions[:email] = login 
     super conditions 
     else 
     conditions[:userid] = login 
     super conditions 
     end 
    else 
     Rails.logger.debug "No login. Using default behaviour" 
     super 
    end 
    end 

    # ... 

Вот инициализатор Завещания. Я добавил monkeypatch на фронте во время отладки:

module Devise 
    module Strategies 
    class LdapAuthenticatable < Authenticatable 
     def authenticate! 
     Rails.logger.debug "=== Starting LDAP Authentication ===" 
     super 
     Rails.logger.debug "=== Done LDAP Authentication ===" 
     end 
    end 
    end 
end 

# Use this hook to configure devise mailer, warden hooks and so forth. 
# Many of these configuration options can be set straight in your model. 
Devise.setup do |config| 
    # TODO: https://github.com/cschiewek/devise_ldap_authenticatable/issues/153 

    # ==> LDAP Configuration 
    # config.ldap_logger = true 
    # config.ldap_create_user = false 
    # config.ldap_update_password = true 
    # config.ldap_config = "#{Rails.root}/config/ldap.yml" 
    # config.ldap_check_group_membership = false 
    # config.ldap_check_group_membership_without_admin = false 
    # config.ldap_check_attributes = false 
    # config.ldap_use_admin_to_bind = false 
    # config.ldap_ad_group_check = false 
    config.ldap_logger = true 
    config.ldap_create_user = true 
    config.ldap_update_password = true 
    config.ldap_use_admin_to_bind = true 

    config.ldap_auth_username_builder = proc do |attribute, login, ldap| 
    username_string = "#{attribute}=#{login},#{ldap.base}" 
    Rails.logger.debug "Generated username as #{username_string}" 
    username_string 
    end 

    # ==> Configuration for any authentication mechanism 
    # Configure which keys are used when authenticating a user. The default is 
    # just :email. You can configure it to use [:username, :subdomain], so for 
    # authenticating a user, both parameters are required. Remember that those 
    # parameters are used only when authenticating and not when retrieving from 
    # session. If you need permissions, you should implement that in a before filter. 
    # You can also supply a hash where the value is a boolean determining whether 
    # or not authentication should be aborted when the value is not present. 
    config.authentication_keys = [:login, :email, :userid] 

    # ... 

Я могу успешно соединиться с сервером LDAP на компьютере с помощью ldapsearch:

ldapsearch -x -W -D "cn=admin,dc=my_domain,dc=com" -H ldap://my_hostname.my_domain.com "(cn=leonsp)" 

Вот соответствующая конфигурация ldap.yml:

## Authorizations 
# Uncomment out the merging for each environment that you'd like to include. 
# You can also just copy and paste the tree (do not include the "authorizations") to each 
# environment if you need something different per environment. 
authorizations: &AUTHORIZATIONS 
    allow_unauthenticated_bind: false 
    group_base: ou=groups,dc=my_domain,dc=com 
    ## Requires config.ldap_check_group_membership in devise.rb be true 
    # Can have multiple values, must match all to be authorized 
    required_groups: 
    ## Requires config.ldap_check_attributes in devise.rb to be true 
    ## Can have multiple attributes and values, must match all to be authorized 
    require_attribute: 
    objectClass: inetOrgPerson 

## Environment 

development: 
    host: ldap://my_hostname.my_domain.com 
    port: 389 
    attribute: cn 
    base: dc=my_domain,dc=com 
    admin_user: cn=admin,dc=my_domain,dc=com 
    admin_password: ... 
    ssl: none 
    # <<: *AUTHORIZATIONS 

Правильно ли я полагаю, что код плагина LDAP для Devise не работает?

Почему он не работает?

Почему нет моих заявлений об отладке?

Какие дополнительные методы я могу обезвредить командами debug для отладки проблемы?

Какую еще диагностику я могу собрать?

Редактировать: Я отслеживаю выполнение с помощью отладчика byebug. До сих пор я могу сказать, что :ldap_authenticable отображается в списке стратегий во время входа в систему, но, похоже, не приводит к какому-либо действию :ldap_authenticable.

ответ

2

Главной проблемой было то, что я включил дополнительные параметры в config.authentication_keys. Это сделало Devise::Strategies#parse_authentication_key_values терпеть неудачу. Только обязательные параметры должны быть включены в authentication_keys.

Другие вопросы, связанные с тем, что приложение предназначено для того, чтобы пользователи могли входить в систему либо с их именем пользователя, либо с его адресом электронной почты.Чтобы разрешить пользователям войти в систему, используя либо, я должен был:

  • Override login_with в User модели
  • Override self.find_for_ldap_authentication в User модели
  • Переименуйте поддельный attr_accessor :login к attr_accessor :username для того, чтобы лучше отличать его от разного значения :login в драгоценном камне

Последний выпуск: не включать протокол (например,)) в главных атрибутах: ldap.yml

0

Для тех, кто подходит к этой теме, я смог заставить его работать, спустившись до версии gem 0.8.8.

Смежные вопросы