mysql - ejemplos - django
al momento de la autenticación de inicio de sesión con LDAP/AD, ¿cómo puedo crear una fila de usuarios si no existe ninguno usando registros AD? (2)
Actualmente tengo este código para mi 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
Lo que quiero hacer es verificar si el usuario que estoy iniciando sesión con LDAP
(como se muestra en mi pregunta anterior ) tiene un campo en la tabla de mis users
y si no crea automáticamente uno con el nombre de usuario y atribuyéndolo automáticamente user_id
que hace Rails y obtener un campo del LDAP
y ponerlo en mi SQLSERVER DB
, el problema es cuando inicio sesión con mi cuenta Simplemente me redirige a ''/'' (raíz) sin ningún aviso de error y sin crear una nueva fila en mi database
Estoy usando SqlServer Management Studio
y mi tabla de usuarios tiene los siguientes campos: id NumeroEmpregado nome created_at updated_at
Quiero hacer que NumeroEmpregado
dé automáticamente desde LDAP
(el atributo en LDAP es title
). Me preocuparé más tarde por eso, y quiero que nome
sea el username
dado en el formulario:
<%= 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 %>
- ¿Cómo puedo hacer esto / ¿Cuáles son los errores en mi código?
Actualice AuthenticaeUser
para que se vea así:
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
Entonces úselo en su controlador de esta manera:
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
Esto supone que el valor NumeroEmpregado
se almacena en el atributo de title
dentro de su servidor LDAP.
Creo que también quieres volver a escribir la creación del usuario, porque básicamente estás tratando de crearlo primero, y la llamada encuentra o crea de nuevo. Puede tenerlo todo en el mismo método, por lo tanto, es find_or_create_by
. Probablemente desee asegurarse de que el usuario también haya sido creado / existe ( .persisted?
verdadero para cualquiera de los dos).
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