mysql - windows ldap登入




在使用LDAP/AD進行登錄驗證時,如何使用AD記錄創建用戶行(如果不存在) (2)

目前我有我的sessions_controller代碼:

class SessionsController < ApplicationController
  def new
  end

  def create
    username = params[:nome]
    password = params[:password]
    name     = username 

    if AuthenticateUser.new(username, password).call
      user = User.create_with(nome: name).find_or_create_by(nome: user)
      session[:user_id] = user.id
      redirect_to '/'
    else
      flash[:error] = "Erro!              \nNúmero de Empregado e/ou password incorrecto(a)"
      redirect_to '/login'
     end
  end

  def destroy
    session[:user_id] = nil
    redirect_to '/index/new'
  end
end

我想要做的是檢查用LDAP登錄的用戶(如我以前的問題所示)是否在我的users表中有一個字段,如果不是用用戶名自動創建一個字段並自動歸屬user_id Rails做的,從LDAP獲取一個字段,並將其放入我的SQLSERVER DB ,問題是當我登錄我的帳戶它只是重定向到“/”(根)沒有任何錯誤通知,並沒有創建一個新的行在我的database

我正在使用SqlServer Management Studio和我的用戶表具有以下字段: id NumeroEmpregado nome created_at updated_at

我想讓NumeroEmpregado自動從LDAPLDAP屬性是title )。 以後我會擔心的,我想讓nome成為以下形式的username

 <%= form_tag '/login' do %>
  <div class="form-group">
    <div class="text">
      Número de Empregado: <br> 
      <%= text_field_tag :nome %><br>
      Password: <br>
      <%= password_field_tag :password %><br>
    </div>
  </div>
  <%= submit_tag "Submit", class: "button" %>
<% end %>
  • 我該怎麼做/我的代碼中有什麼錯誤?

我想你也想重新編寫用戶的創建,因為基本上你正在嘗試創建它,然後調用查找或再次創建。 你可以使用同樣的方法,因此它是find_or_create_by 。 您可能要確保用戶已創建/存在( .persisted?將返回true)。

if AuthenticateUser.new(username, password).call
  user = User.find_or_create_by(nome: username)
  if user.persisted?
    session[:user_id] = user.id
    redirect_to '/'
  else
    #...
  end
else
  flash[:error] = "Erro!              \nNúmero de Empregado e/ou password incorrecto(a)"
  redirect_to '/login'
end

更新AuthenticaeUser看起來像這樣:

class AuthenticateUser
  def self.call(*args)
    new(*args).call
  end

  def initialize(username, password)
    @username = "#{username}@company.com"
    @password = password
  end

  def call
    search_title_if_valid_user
  end

  private
  def search_title_if_valid_user
    ldap = Net::LDAP.new(
      host: server_ip_address,
      port: 389,
      base: "DC=corp,DC=com",   # change for your company values
      auth: { method: :simple, username: @username, password: @password }
    )

    ldap.search(attributes: ["title"]) if ldap.bind
  end
end

然後像這樣在你的控制器中使用它:

class SessionsController < ApplicationController
  def new
  end

  def create
    username = params[:nome]
    password = params[:password]

    title = AuthenticateUser.call(username, password)

    if title
      user = User.create_with(nome: username).find_or_create_by(NumeroEmpregado: title)
      session[:user_id] = user.id
      redirect_to '/'
    else
      flash[:error] = "Erro!              \nNúmero de Empregado e/ou password incorrecto(a)"
      redirect_to '/login'
     end
  end

  def destroy
    session[:user_id] = nil
    redirect_to '/index/new'
  end
end

這假定NumeroEmpregado值存儲在LDAP服務器的title屬性中。