mysql - ldap用户认证 - 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或create。 你可以使用同样的方法,因此它是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属性中。