I have an ldap connection on my RoR app but now how do I check users on login?

て烟熏妆下的殇ゞ 提交于 2020-01-03 02:20:08

问题


I'm developing an Ruby on Rails webapp and I'm trying to use LDAP authentication to authenticate my users, I have the connection set up and working to the LDAP, but now I can't find any examples or documentation online on how to write code to authenticate users against my LDAP on Ruby on Rails

I'm using: Ruby v2.2 and Rails v5.0.3 and the gem I'm using to connect to ldap is gem 'net-ldap', '~> 0.16.0'

This is my login form at the moment, authenticating with a sqlserver DB, but I want it to authenticate against my LDAP DB :

class SessionsController < ApplicationController

  def new
  end


  def create
    user = User.find_by_NumeroEmpregado(params[:NumeroEmpregado])

    if user && user.authenticate(params[:password])

      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

users_controller.rb

class UsersController < ApplicationController

  def new
  end

  def create
    user = User.new(user_params)
    if user.save
      session[:user_id] = user.id
      redirect_to '/'
    else
    flash[:error] = "Erro!           \nNenhum dos campos pode ser deixado em branco"
    redirect_to '/signup'

    end
  end

private
  def user_params
    params.require(:user).permit(:NumeroEmpregado, :nome, :password, :password_confirmation)
  end
end
  • How can I reformulate this code into authenticating with my LDAP DB?

回答1:


You could create a service that handles that process:

app/services/authenticate_user.rb

class AuthenticateUser
  def initialize(user, password)
    @user = user
    @password = password
  end

  def call
    user_is_valid?
  end

  private
  def user_is_valid?
    ldap = Net::LDAP.new
    ldap.host = your_server_ip_address
    ldap.port = 389
    ldap.auth(@user, @password)
    ldap.bind
  end
end

Then use it in your controller:

class SessionsController < ApplicationController
  def new
  end

  def create
    username = params[:NumeroEmpregado]
    password = params[:password]
    name     = "Some Name"      # Change "Some Name" to set the correct name  

    if AuthenticateUser.new(username, password).call
      user = User.create_with(nome: name).find_or_create_by(NumeroEmpregado: username)
      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

AuthenticateUser.new(user, password).call will return true when valid user and password are provided, and will return false otherwise.

This is a basic example covering only the LDAP authentication, you will need to adapt it for your specific needs, including exception handling.



来源:https://stackoverflow.com/questions/45055287/i-have-an-ldap-connection-on-my-ror-app-but-now-how-do-i-check-users-on-login

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!