使用LDAP / AD登录身份验证时如果使用AD记录不存在用户行,我该如何创建用户行

时间:2017-07-12 13:55:04

标签: mysql ruby-on-rails ruby authentication ldap

目前我的session_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登录的用户(如my previous question所示)是否在我的users表中有一个字段,以及是否不要使用用户名自动创建一个并自动将其归结为Rails所做的user_id并从LDAP获取一个字段并将其放入我的SQLSERVER DB,问题出在我登录时使用我的帐户它只是将我重定向到'/'(root),没有任何错误通知,也没有在我的database上创建新行

我正在使用SqlServer Management Studio,我的用户表包含以下字段:id NumeroEmpregado nome created_at updated_at

我想从NumeroEmpregado(LDAP中的属性为LDAP)自动提供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 %>
  • 我该怎么做?我的代码中有哪些错误?

2 个答案:

答案 0 :(得分:0)

更新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属性中。

答案 1 :(得分:0)

我认为你也想重写用户的创建,因为基本上你是先尝试创建它,然后再调用find或create。你可以用同样的方法拥有它,因此它是main.todos。您可能希望确保用户也已创建/存在(find_or_create_by将返回true)。

.persisted?