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

目前我的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表中是否有一个字段,如果没有自动创建一个用户名并自动归因于该用户Rails执行的user_id并从LDAP获取字段并将其放入我的SQLSERVER DB ,问题是当我使用我的帐户登录时它只是将我重定向到’/’(root)而没有任何错误通知并且没有创建新行在我的database

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

我想让NumeroEmpregadoLDAP自动给出( LDAP属性是title )。 我稍后会担心,我希望nome成为表单中给出的username

   
Número de Empregado:

Password:

  • 我该怎么做/我的代码有什么错误?

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

我想你也想重新编写用户的创建,因为基本上你是先尝试创建它,然后再调用find或create。 你可以在同一个方法中拥有它,因此它是find_or_create_by 。 您可能希望确保用户也已创建/存在( .persisted?.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