質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

Laravel5でログインの認証がうまく行かない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,545

nirakka-

score 5

前提・実現したいこと

データベースのデータを管理するWebアプリケーションを作っています。
既存のデータベースのユーザーテーブルを使って、ログイン機能を実装しようとしているのですが、
Registerからユーザー登録はできるのですが、ログインができない状態です。
ユーザーテーブルの構造は次のようになっています。

+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id       | varchar(20)  | NO   | PRI | NULL    |       |
| password | varchar(255) | NO   |     | NULL    |       |
| Role     | smallint(6)  | NO   |     | NULL    |       |
| status   | smallint(6)  | NO   |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+


上記のuserテーブルを使ってログイン機能を実装したいです。
php artisan make:authでLaravelのデフォルトの認証機能を作成してそれらを編集しています。

発生している問題

Registerからユーザーデータするのはうまくいくのですが登録したユーザーデータでログインするとIDのみが保持された状態でログイン画面に戻ります。

該当のソースコード

ログイン機能でいじったのは以下の部分です。

AuthController.php

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

class AuthController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Registration & Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users, as well as the
    | authentication of existing users. By default, this controller uses
    | a simple trait to add these behaviors. Why don't you explore it?
    |
    */

    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    /**
     * Where to redirect users after login / registration.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * Create a new authentication controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware($this->guestMiddleware(), ['except' => 'logout']);
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'id' => 'required|max:20',
            'password' => 'required|min:6|confirmed',
            'Role'=> 'required',
            'status' => 'required'
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return User
     */
    protected function create(array $data)
    {
        return User::create([
            'id' => $data['id'],
            'password' => bcrypt($data['password']),
            'Role' => $data['Role'],
            'status' => $data['status']
        ]);
    }
}


login.blade.php

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading">Login</div>
                <div class="panel-body">
                    <form class="form-horizontal" role="form" method="POST" action="{{ url('/login') }}">
                        {{ csrf_field() }}

                        <div class="form-group{{ $errors->has('id') ? ' has-error' : '' }}">
                            <label class="col-md-4 control-label">id</label>

                            <div class="col-md-6">
                                <input type="text" class="form-control" name="id" value="{{ old('id') }}">

                                @if ($errors->has('id'))
                                    <span class="help-block">
                                        <strong>{{ $errors->first('id') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>

                        <div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
                            <label class="col-md-4 control-label">Password</label>

                            <div class="col-md-6">
                                <input type="password" class="form-control" name="password">

                                @if ($errors->has('password'))
                                    <span class="help-block">
                                        <strong>{{ $errors->first('password') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>

                        <div class="form-group">
                            <div class="col-md-6 col-md-offset-4">
                                <div class="checkbox">
                                    <label>
                                        <input type="checkbox" name="remember"> Remember Me
                                    </label>
                                </div>
                            </div>
                        </div>

                        <div class="form-group">
                            <div class="col-md-6 col-md-offset-4">
                                <button type="submit" class="btn btn-primary">
                                    <i class="fa fa-btn fa-sign-in"></i>Login
                                </button>

                                <a class="btn btn-link" href="{{ url('/password/reset') }}">Forgot Your Password?</a>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection


User.php

<?php

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{   
    protected $table = 'M_USER';
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */


    protected $fillable = [
        'id',  'password', 'Role', 'status',
    ];


    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
             'password',
    ];

    public $timestamps = false;
}


route.php

<?php

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/


Route::auth();

Route::get('/home', 'HomeController@index');

試したこと

bcrypt()を外してからデータ登録をし直してみましたが、結果は変わりませんでした。

補足情報(言語/FW/ツール等のバージョンなど)

PHP 5.6.21
Laravel Framework version 5.2.32

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

ユーザテーブルにユーザ名に相当するカラムが無いのでちょっと特殊な作りのように見えますが、「id」と「password」を入力してログインする(idが所謂ユーザ名に相当する)という前提で書きます。

AuthController

use AuthenticatesAndRegistersUsers


しています。
ログインや登録といったロジックはその名の通りAuthenticatesAndRegistersUsersトレイトにまとめられています。

AuthenticatesAndRegistersUsersトレイトでは

use AuthenticatesUsers

のように、AuthenticatesUsersトレイトをuseしています。
こちらにユーザ認証に関するメソッドが収められています。その中に、

/**
 * Get the login username to be used by the controller.
 *
 * @return string
 */
public function loginUsername()
{
    return property_exists($this, 'username') ? $this->username : 'email';
}

というメソッドがあります。
デフォルトではパスワードとusername、またはemailのセットで認証しますが今回のケースではどちらも存在しません。
今回はidがusernameに相当するので、このメソッドがidをreturnするようにします。

もちろんvendor以下のファイルを直接弄ることは出来ないので、AuthControllerあたりでオーバーライドします。

public function loginUsername()
{
    return 'id';
}

こちらの環境ではとりあえずこれでログインできました。

--
(追記)
寝ぼけてました。
property_existsで判定してるのでAuthControllerloginUsername()をオーバーライドせずとも

protected $username = 'id';

のように指定してあげれば良いですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/02 21:48

    まさに、自分が求めていた答えです。
    ありがとうございました。

    キャンセル

0

追記です。laravelのデフォルトのAuthではuserテーブルにprimary keyとなる連番を付与しないといけないようです。

+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| no        | int(10) unsigned  | NO   | PRI | NULL    |       |
| id        |varchar(255) |  NO    |      | NULL  |      |
| password | varchar(255) | NO   |     | NULL    |       |
| Role     | smallint(6)  | NO   |     | NULL    |       |
| status   | smallint(6)  | NO   |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+

このテーブル構造でうまくいきました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる