Laravel : Basic Authentication

หลังจากที่เล่น Bootstrap ก็ลองมาเล่น Laravel หน่อย โดยใช้จาก Tutorial ของ Blog นี้ และลองนั่งทำตาม ก็ได้แต่ทำตาม ยังดัดแปลงไม่ได้ แถมเจอปัญหาระหว่างทางนิดหน่อย เลยมาจดไว้ดีกว่า

หน้าจอ

ในเว็บเป็นการทำงานเกี่ยวกับ authentication แบบง่าย เรื่อง Front-End ก็ใช้ Bootstrap ซึ่งก็สะดวกดี มีหน้าจอตามนี้

  • Login
  • Register
  • Dashboard

2014-12-14_2109

(login)

2014-12-14_2109_001

(register)

2014-12-14_2113

(dashboard : after login)

ทีนี้แต่ละส่วนก็แตกย่อยมี Function ตามนี้

Login

  • getLogin : เรียก Page login
  • postSigin : Process login (validation)

Register

  • getRegister : เรียก Page register
  • postCreate : Process register (valiation, Save ข้อมูลเข้า DB)

Dashboard

  • getDashboard : เรียก Page dashboard
  • getLogout : Process logout 

Database

เคยชินกับการสร้าง Schema บน GUI ของ DB Laravel ก็มี migrate DB เหมือนกัน แต่รู้สึกว่ามันไม่เร็ว (อาจจะเร็วมั้งนะ ถ้าทำคล่องๆ) 

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `email` varchar(20) NOT NULL,
  `password` varchar(100) NOT NULL,
  `firstname` varchar(20) NOT NULL,
  `lastname` varchar(20) NOT NULL,
  `timestamps` datetime NOT NULL,
  `remember_token` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

remember_token เป็นสิ่งจำเป็นเสมอของ Laravel 4.1.26 ขึ้นไป หน้าที่ของมันคือ session ที่ยังคงมีอยู่จะใช้งานไม่ได้หลังจากที่ logout แล้ว

Coding

app/config/database.php

แก้ไข connection ของ database

		'mysql' => array(
			'driver'    => 'mysql',
			'host'      => 'localhost',
			'database'  => 'send',
			'username'  => 'xxxxx',
			'password'  => 'xxxxx;',
			'charset'   => 'utf8',
			'collation' => 'utf8_unicode_ci',
			'prefix'    => '',
		),

app/views/layouts/main.blade.php 

<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="widt=device-width, initial-scale=1.0">
	<title>Authentication App With Laravel 4</title>
	{{ HTML::style('packages/bootstrap/css/bootstrap.min.css') }}
	{{ HTML::style('css/main.css') }}
</head>
<body>


<div class="navbar navbar-fixed-top">
	<div class="navbar-inner">
		<div class="container">
			<ul class="nav">
				@if (!Auth::check())
					<li>{{ HTML::link('users/register', 'Register') }}</li>
					<li>{{ HTML::link('users/login', 'Login') }}</li>
				@else
					<li>{{ HTML::link('users/logout', 'logout') }}</li>
				@endif
			</ul>
		</div>
	</div>
</div>


<div class="container">
	@if(Session::has('message'))
		<p class="alert">{{ Session::get('message') }}</p>
	@endif

	{{ $content }}
</div>

</body>
</html>

public/css/main.css

body {
	padding-top: 40px;
}

.form-signup, .form-signin {
	width: 400px;
	margin: 0 auto;
}

app/controllers/UserControllers.php

<?php

Class UsersController extends BaseController {

	protected $layout = "layouts.main";


	public function __construct() {
		$this->beforeFilter('csrf', array('on'=>'post'));
		$this->beforeFilter('auth', array('only'=>array('getDashboard')));
	}

	public function getLogin() {
		$this->layout->content = View::make('users.login');
	}

	public function getRegister() {
		$this->layout->content = View::make('users.register');
	}

	public function postCreate() {

		$validator = Validator::make(Input::all(), User::$rules);

		if($validator->passes()) {

			$user = new User;
			$user->firstname = Input::get('firstname');
			$user->lastname = Input::get('lastname');
			$user->email = Input::get('email');
			$user->password = Hash::make(Input::get('password'));
			$user->save();

			return Redirect::to('users/login')->with('message', 'Thanks for registering');
		} else {

			return Redirect::to('users/register')->with('message', 'The following error occurred')->withErrors($validator)->withInput();
		}
	}

	public function postSignin() {
		if (Auth::attempt(array('email'=>Input::get('email'), 'password'=>Input::get('password')))) {
			return Redirect::to('users/dashboard')->with('message', 'You are now logged in!');
		} else {
			return Redirect::to('users/login')
				->with('message', 'Your username/password combination was incorrect')
				->withInput();
		}
	}

	public function getDashboard() {
		$this->layout->content = View::make('users.dashboard');
	}

	public function getLogout() {
		Auth::logout();
		return Redirect::to('users/login')->with('message', 'You are now logged out!');
	}

}
?>

app/routes.php

Route::controller('users', 'UsersController');

app/views/register.blade.php

{{ Form::open(array('url'=>'users/create', 'class'=>'form-sigup')) }}

<h2 class="form-signup-heaing">Please Register</h2>

<ul>
	@foreach($errors->all() as $error)
		<li>{{ $error }}</li>
	@endforeach
</ul>

{{ Form::text('firstname', null, array('class'=>'input-block-level', 'placeholder'=>'First Name')) }}
{{ Form::text('lastname', null, array('class'=>'input-block-level', 'placeholder'=>'Last Name')) }}
{{ Form::text('email', null, array('class'=>'input-block-level', 'placeholder'=>'Email Address')) }}
{{ Form::password('password', array('class'=>'input-block-level', 'placeholder'=>'Password')) }}
{{ Form::password('password_confirmation', array('class'=>'input-block-level', 'placeholder'=>'Confirm Password')) }}

{{ Form::submit('Register', array('class'=>'btn btn-large btn-primary btn-block')) }}

{{ Form::close() }}

app/models/User.php

	public $timestamps = false;

	public static $rules = array(
		'firstname'=>'required|alpha|min:2',
		'lastname'=>'required|alpha|min:2',
		'email'=>'required|email|unique:users',
		'password'=>'required|alpha_num|between:6,12|confirmed',
		'password_confirmation'=>'required|alpha_num|between:6,12'
		);

Note : ตรงบรรทัดที่ 1 ใช้เสมอ หากไม่ต้องการ stamp เวลาในการ login (Issue ไม่เจอ column update_at)

app/views/users/login.blade.php

{{ Form::open(array('url'=>'users/signin', 'class'=>'form-signin')) }}

	<h2 class="form-signin-heading">Please Login</h2>

	{{ Form::text('email', null, array('class'=>'input-block-level', 'placeholder'=>'Email Address')) }}
	{{ Form::password('password', array('class'=>'input-block-level', 'placeholder'=>'Password')) }}
	{{ Form::submit('Login', array('class'=>'btn btn-large btn-primary btn-block')) }}

{{ Form::close() }}

app/filters.php

Route::filter('auth', function()
{
	if (Auth::guest())
	{
		if (Request::ajax())
		{
			return Response::make('Unauthorized', 401);
		}
		else
		{
			return Redirect::guest('users/login');
		}
	}
});

Note : Customize จากเดิม Redirect::guest('login'); Path จะผิด

app/views/users/dashboard.blade.php

<h1>Dashboard</h1>

<p> Welcome to your Dashboard. You Rock! </p>

Add new comment

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.