2017-07-12 7 views
0

を使用して、非存在であるならば現在、私は私のsessions_controllerのためにこのコードを持っているユーザーの行を作成します:どのように私は1つのADレコードに

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テーブルにフィールドがあり、そうでなければ自動的にユーザー名を作成して、それが自動的にuser_idであり、Railsがフィールドを取得してLDAPSQLSERVER DBに入れると、自分のアカウントでログインするときに問題が発生します。エラー通知なしで '/'(ルート)にリダイレクトされます。そして私の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 %> 
  • は、どのように私はこれを行うことができます/私のコード内のエラーは何ですか?その後

    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 
    

    このようなあなたのコントローラでそれを使用します:

答えて

0

更新AuthenticaeUserはこのように見て

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属性に格納されていることを前提としていサーバ。

0

基本的には最初に作成しようとしているので、ユーザーの作成を書き直したいと思います。あなたはそれをすべて同じ方法で使うことができるので、それは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 
+0

これを@Gerryのコードでどのように実装できますか? –

+0

@AnroDeodoはい、あなたは、 'user.persisted? 'を使って、失敗した作成されたユーザーを捕まえられる良い方法です。追加の属性がモデルに必要とされている場合、 'たびに失敗します。 – Gerry

+1

ここでの唯一の難点は、' User.find_or_create_by(ユーザ名ノームが)ということです。もしそうなら、 'create_with'が便利です。 – Gerry

関連する問題