2015.7.19
0からはじめるPHP#36【Laravel5で作るデータベース#10-認証(契約によるAuth実装)-】
前回ログインとログアウト、そしてユーザー登録の機能の動作を確認しました。
今回作っているデータベースは、特にユーザーの管理を必要としないので後は登録情報の変更ができればいい・・・・・・と思ってはいけません。
URLの直接入力による新規登録ができてはいけないので、新規登録画面の呼び出しができないことをまず確認します。
ということで、
auth/registerにアクセスするとできてしまいます。これではいけませんね。(笑)
このregisterを司るプログラムに何らかの制限をかければいいことになるのですが、具体的にどこをどう触ればどうなるのかってのは分からないです。
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;
/**
* Create a new authentication controller instance.
*
* @param \Illuminate\Contracts\Auth\Guard $auth
* @param \Illuminate\Contracts\Auth\Registrar $registrar
* @return void
*/
//public function __construct(Guard $auth, Registrar $registrar)
public function __construct(Guard $auth)
{
$this->auth = $auth;
//$this->registrar = $registrar;
$this->middleware('guest', ['except' => 'getLogout']);
}
怪しいのはこの
AuthControllerです。
どうやらここで
契約というものが使われているようです。僕も完全に把握してるわけではないのですが、このようにコンストラクターにある特定の引数を指定することにより、まとまったサービスをインポートできる・・・・・・というイメージなんでしょうかね。
コメントアウトしている24行目がデフォルトの記述なのですが、このRegisterarクラスと契約しているのがマズい・・・・・・ということで、これを消せば登録関係のサービスは使えなくなると思われます。
これで登録しようとするとバリデーションエラーが発生します。たぶん定義されてないものから呼び出そうとしているから、ですかね?
ちなみに、28行目を消さないと、これは普通にエラーになりますので認証機能全般が死にます。ので、コメントアウトするなり消すなりしましょう。僕は仕組みを理解しきれていないのですぐに戻せるようにコメントアウトするのに留めておきます。今は。
これだけで恐らくユーザー登録機能を停止させられたと思うんですが、登録画面が表示されてるのは気持ち悪いですね。
とりあえずよくわかんないので登録画面のビュー自体消しときましょう。テキトーに名前変えたら機能停止します。そんなテキトーでいいんですかって言われてもよく分からないので・・・・・・
class Registrar implements RegistrarContract {
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
public function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users',
'password' => 'required|confirmed|min:6',
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return User
*/
public function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
}
ちなみに、Registrarの実体・・・・・・ではないのですが、それに関連したデータがここにあるようです。
変なアクセスでデータを作られてもアレですし、とりあえずこのcreateメソッドもコメントアウトしといた方が良さそうですね。
今回はいろんなユーザーがアクセスするわけではなく、管理人のみが管理ページにアクセスできる、ということで、Registerとかリンクに貼ってあるページを流用するのはよくありません、ということでログインページのビューも新しく作ってしまいましょう。
基本的には
views/auth/login.blade.phpをいじればいいです。っていうか、不要なdivとかを全部とりあえず消しときゃいいかなと思います。
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Musel Login
<link rel="stylesheet" type="text/css" href="./css/style.css">{{--スタイルシート--}}
</head>
<body>
@if (count($errors) > 0)
<strong>Whoops!</strong> There were some problems with your input.<br>
@foreach ($errors->all() as $error)
・{{ $error }}
@endforeach
@endif
<form class="form-horizontal" role="form" method="POST" action="{{ url('/auth/login') }}">
>input type="hidden" name="_token" value="{{ csrf_token() }}">
email<input type="text" class="form-control" name="email" value="{{ old('email') }}"><br>
Password<input type="password" class="form-control" name="password"><br>
<input type="checkbox" name="remember"> Remember Me
<button type="submit" class="btn btn-primary">Login</button>
<a class="btn btn-link" href="{{ url('/password/name') }}">Forgot Your Password?</a>