Security ( คลาสที่เกี่ยวกับการเข้ารหัส )
คลาสนี้ใช้ในการสร้างระบบรักษาความปลอดภัยต่างอย่างเช่น การเข้ารหัสเพื่อใช้ใน password,session,cookie <a name="configuration"></a>
<a name="storing-passwords"></a> ## การเก็บรหัสผ่าน
Class Hash ของ laravel ใช้ส่วนขยาย Bcrypt ของ php มาพัฒนาต่อยอด
การสร้างค่า hash
1 $password = Hash::make('secret');
การตรวจสอบค่า hash
1 if (Hash::check('secret', $hashedPassword))
2 {
3 // The passwords match...
4 }
ตรวจว่า password ต้องการเข้ารหัสอีกครั้ง กรณีลืมรหัสผ่าน
1 if (Hash::needsRehash($hashed))
2 {
3 $hashed = Hash::make('secret');
4 }
<a name="authenticating-users"></a> ## การยืนยันตัวบุคคล
การล็อกอิน laravel เตรียมเมทอด Auth::attempt มาให้ตัวอย่างการใช้งาน
1 if (Auth::attempt(array('email' => $email, 'password' => $password)))
2 {
3 return Redirect::intended('dashboard');
4 }
ค่า email เราสามารถเปลี่ยนไปตามใจเราได้ครับ ส่วนเมทอด Redirect::intended ใช้ส่งผู้ใช้งานกลับไปที่ลิ้งที่เข้าเรียกมาครับ
เมื่อเมทอด attempt ถูกเรียก event auth.attempt จะถูกเรียกและ event auth.login จะถูกเรียกเมื่อการเข้าสู่ระบบสำเร็จ
ตรวจสอบว่ามีการล็อกอินค้างอยู่ไหม
1 if (Auth::check())
2 {
3 // The user is logged in...
4 }
ตัวอย่างการปรับปรุงเมทอด attempt ให้สามารถทำการจำชื่อผู้ใช้กับรหัสผ่านได้
1 if (Auth::attempt(array('email' => $email, 'password' => $password), true))
2 {
3 // The user is being remembered...
4 }
การกำหนดเงื่อนไขตอนล็อกอิน
1 if (Auth::attempt(array('email' => $email, 'password' => $password, 'active' => 1\
2 )))
3 {
4 //
5 }
การเข้าถึงเข้อมูลคนที่ล็อกอิน
1 $email = Auth::user()->email;
ใช้เมทอด loginUsingId เพื่อดึง Id ของคนที่ล็อกอินมา
1 Auth::loginUsingId(1);
สมมุตว่าเรากำหนดว่าการเปลี่ยนแปลงเลขบัตรเครดิตต้องใช้รหัสผ่านยืนยันเพิ่มเติม เมทอด validate สามารถทำงานนี้ให้เราได้
การใช้งานการยืนยันตัวตนโดยไม่ได้เข้าสู่ระบบ
1 if (Auth::validate($credentials))
2 {
3 //
4 }
<br /><br /><br />
การล็อกอินแบบไม่มี session หรือ cookies
1 if (Auth::once($credentials))
2 {
3 //
4 }
เมทอดที่ใช้ล็อกเอาท์
1 Auth::logout();
<a name="manually"></a> ## การจำลองการล็อกอิน
การล็อกอินแบบ ที่เราจำลองขึ้้นมาเองครับ เมทอดlogin ใช้ค่าจากฐานข้อมูลมาล็อกอินได้ทันทีเลย
1 $user = User::find(1);
2
3 Auth::login($user);
การป้องกัน CSRF
ทำการแนบค่า token เข้ากับฟอร์ม
1 <input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
ตรวจสอบค่า token ที่ถูกส่งมา
1 Route::post('register', array('before' => 'csrf', function()
2 {
3 return 'You gave a valid CSRF token!';
4 }));
<br /><br /><br /><br /><br /><br /> <a name="http-basic-authentication"></a> ## HTTP Basic Authentication
laravel เตรียม filter ชื่อ auth.basic เพื่อตรวจว่า มีการล็อกอินไหม
ตัวอย่าง
1 Route::get('profile', array('before' => 'auth.basic', function()
2 {
3 // Only authenticated users may enter...
4 }));
โดยค่าเริ่มต้นเเล้วเมทอด basic ใช้คอลัมน์ email ในการตรวจสอบ ถ้าเราจะเปลี่ยนก็ใช้
1 return Auth::basic('username');
laravel เตรียมฟังก์ชัน Oncebasic มาเพื่อการล็อกอินแบบไม่สร้าง session ไว้เหมาะกับการให้ ผู้ใช้งานใช้ในกรณีไปล็อกอินเครื่องที่ไม่ใช่ของตัวเอง
ตัวอย่าง
1 Route::filter('basic.once', function()
2 {
3 return Auth::onceBasic();
4 });
<br /><br /><br /> <a name="password-reminders-and-reset"></a> ## การจัดการการลืมรหัสผ่าน การลืมรหัสผ่านและการสร้างใหม่ ### ส่งรหัสผ่านใหม่
laravel เตรียมการมาให้เราสามารถสร้างระบบการส่และเปลี่ยนรหัสผ่าน ให้เราโดยการให้ User model ทำการสืบทอด Illuminate\Auth\Reminders\RemindableInterface.
การใช้งาน RemindableInterface
1 class User extends Eloquent implements RemindableInterface {
2
3 public function getReminderEmail()
4 {
5 return $this->email;
6 }
7
8 }
ต่อมาเราก็ต้องสร้างตารางให้ระบบลืมรหัสผ่านก่อนโดย php artisan auth:reminders
สร้างตัว migration ของตารางลืมรหัส
1 php artisan auth:reminders
2
3 php artisan migrate
การส่งรหัสใช้เมทอด Password::remind
ตัวอย่างการใช้งาน
1 Route::post('password/remind', function()
2 {
3 $credentials = array('email' => Input::get('email'));
4
5 return Password::remind($credentials);
6 });
หมายเหตุ: เราต้องสร้าง view ที่ชื่อ
auth.reminder.emailเพื่อรับ email เองนะครับ
เราสามารถส่งข้อความเพิ่มเติมให้ผู้ใช้โดยส่งพารามิเตอร์ไป $message ไปในฟังก์ชัน remind
1 return Password::remind($credentials, function($message, $user)
2 {
3 $message->subject('Your Password Reminder');
4 });
<br /><br />
โดยค่าเริ่มต้นเเล้วเมทอด remind จะส่งกลับมาที่หน้าที่เรียกใช้ ถ้าเกิดข้อผิดพลาดขึ้น ตัวแปร errorจะมีค่าขึ้นใน session ส่วนเมื่อสำเร็จตัวแปร success ก็จะปรากฏขึ้นมาใน session แทน หน้าตาของหน้า auth.reminder.email ควรเป็นแบบนี้ครับ
1 @if (Session::has('error'))
2 {{ trans(Session::get('reason')) }}
3 @elseif (Session::has('success'))
4 An e-mail with the password reset has been sent.
5 @endif
6
7 <input type="text" name="email">
8 <input type="submit" value="Send Reminder">
<br /><br /> ### การรีเซตรหัสผ่าน
การสร้าง route เพื่อรับการที่ผู้ใช้งานกดลิ้งทำการรีเซตรหัสผ่าน
1 Route::get('password/reset/{token}', function($token)
2 {
3 return View::make('auth.reset')->with('token', $token);
4 });
หน้า view ที่ทำการให้ผู้ใช้งานทำการเปลี่ยนรหัสผ่าน
1 @if (Session::has('error'))
2 {{ trans(Session::get('reason')) }}
3 @endif
4
5 <input type="hidden" name="token" value="{{ $token }}">
6 <input type="text" name="email">
7 <input type="password" name="password">
8 <input type="password" name="password_confirmation">
<br /><br /><br /><br /> ตัวอย่างการสร้าง route เพื่อทำการรับค่ารหัสผ่านใหม่
1 Route::post('password/reset/{token}', function()
2 {
3 $credentials = array('email' => Input::get('email'));
4
5 return Password::reset($credentials, function($user, $password)
6 {
7 $user->password = Hash::make($password);
8
9 $user->save();
10
11 return Redirect::to('home');
12 });
13 });
ถ้าการเปลี่ยนรหัสผ่านสำเร็จ User instance และรหัสผ่านใหม่จะถูกเก็บลงฐานข้อมูลและ ส่งกลับไปหน้า home
<a name="encryption"></a> ## Encryption
Laravel เตรียมการเข้ารหัสแบบ AES-256 โดยส่วนเสริม mcrypt ของ PHP มาให้เเล้ว
กาเข้ารหัส
1 $encrypted = Crypt::encrypt('secret');
Note: มั่นใจว่าเราเปลี่ยนค่า
keyตรงที่app/config/app.phpไม่งั้นการเข้ารหัสจะไม่ค่อยปลอดภัยครับ
การถอดรหัส
1 $decrypted = Crypt::decrypt($encryptedValue);
การกำหนดรูปแบบต่างๆ
1 Crypt::setMode('ctr');
2
3 Crypt::setCipher($cipher);