ruby-on-rails Rails 7 + devise + devise_ldap_authenticatable:before_保存问题

xdyibdwo  于 11个月前  发布在  Ruby
关注(0)|答案(1)|浏览(109)

我用Rails 7 + device + device_ldap_authenticatable编写了一个应用程序
我的用户模型如下所示。

class User < ApplicationRecord

  devise :ldap_authenticatable

  before_save :get_from_ldap

  def get_from_ldap
    puts '1 ##########################################'
    self.username = <WHAT EVER CODE>
    puts '2 ##########################################'
  end
end

字符串
这可以完美地工作,但只有一次。第一次,当用户在第一次登录后被创建到数据库中时。
我不确定,但我认为这与一些 * device_ldap_authenticatable* 指令有关,因为before_保存通常被调用为始终正确?

config.ldap_create_user = true


我做错了什么?
我想在每次用户登录时使用某种方法或技术来完成此操作,以确保我从Active Directory中获得所有更改。
谢谢.

更新#:

我试过使用 before_validationafter_validation,所有这些回调都只调用一次。用户第一次登录时被创建到数据库中。这不是正常的权限?你知道吗?
我的设计.rb

# ==> 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
  # config.ldap_ad_group_check = false

  # Sin esta linea trata de buscar por mail en vez de por el atributo definido en
  # config.ldap_config = "#{Rails.root}/config/ldap.yml"
  # 
  # https://stackoverflow.com/questions/44121543/rails-devise-ldap-authentication-cannot-find-user
  #
  config.ldap_auth_username_builder = Proc.new() {|attribute, login, ldap| login}


我的LDAP,yml

## Authorizations
authorizations: &AUTHORIZATIONS
  allow_unauthenticated_bind: false

development:
  host: 13.0.0.1
  port: 389
  attribute: userPrincipalName
  group_membership_attribute: member
  base: dc=mydomain,dc=net
  admin_user: cn=Admin,ou=Users,ou=first,dc=mydomain,dc=net
  admin_password: ***********
  ssl: false
  # <<: *AUTHORIZATIONS

hpcdzsge

hpcdzsge1#

好吧。回调函数只在保存时调用(当然)。在我的用例中,这只在创建每个用户时的第一次登录时调用。Nexts登录从不更新DB,所以保存从不被调用。
为了解决这个问题,我想了一个方法来强制更新。
Devise trackable模块是我的解决方案。感谢How do I add trackable to an existing Devise setup?
如果我将**:trackable**添加到User模型中,则每次登录都会调用回调。

class User < ApplicationRecord

  devise :ldap_authenticatable, :trackable

  before_save :get_from_ldap

  def get_from_ldap

    self.username = self.email.split('@')[0]

    # Se recuperan todos los grupos a los que pertenece el usuario
    groups = self.ldap_groups

    <MY CODE>    

    self.role = <ROLE FROM MY CODE>

  end
end

字符串

相关问题