ورود و خروج کاربر در یک سیستم مبتنی بر وب نیازی اساسی است و در چارچوب mvc این کار به شکل خاصی صورت می گیرد. در این بخش روش لاگین و لاگ اوت کردن کاربر را در چارچوب MVC آموزش می دهیم.
برای پیاده سازی تایید هویت کاربر و کنترل دسترسی کاربران به قسمت های اصلی برنامه و اطلاعات باید روشی برای شناسایی و تائید هویت و مجازشماری کاربران داشته باشیم.
معمول ترین راه برای تائید هویت و کنترل دسترسی کاربران، ایجاد یک جدول در بانک اطلاعاتی برای نگهداری مشخصات از جمله نام کاربری و کلمه عبور کاربران و طراحی فرم لاگین در برنامه برای واردکردن نام کاربری و کلمه عبور و استفاده از session برای نگهداری وضعیت کاربران مجاز وارد شده می باشد.
روش کار به این صورت است که با نمایش فرم لاگین، نام کاربری و کلمه عبور دریافت می شود و با اجرای یک پرس و جو در بانک اطلاعاتی اگر کاربری با این مشخصات در جدول کاربران وجود داشت، برای او نشانه ای (مثلا نام کاربری ) در داخل session ذخیره می شود و از این پس برای اجرای هر صفحه از سایت به session رجوع می شود، اگر نشانه فوق در سشن وجود داشت یعنی اینکه کاربر به درستی لاگین کرده است و گرنه کاربر غیرمجاز بوده و باید لاگین کند و به صفحه لاگین هدایت می شود .
پیاده سازی ورود و خروج کاربر در چارچوب mvc
برای پیاده سازی ورود/خروج کاربر در برنامه مبتنی بر mvc مراحل ششگانه زیر را انجام می دهیم:
1- یک جدول به نام tbl_users با ستون های شناسه کاربر، نام کاربری و کلمه عبور ایجاد کرده و مشخصات یک کاربر را در آن درج می کنیم.
2- سپس یک فایل user_model.php حاوی کلاس مدل برای کاربران در پوشه models ایجاد کرده و توابعی برای خواندن مشخصات کاربر بر اساس نام کاربری و کلمه عبور به آن اضافه می کنیم تا نام کاربری و کلمه عبور را بعنوان پارامتر دریافت کند و مشخصات کامل کاربر را از بانک اطلاعاتی خوانده و برگرداند.
<?phpclass user_model extends model
{
public function getRowByUP($uname , $upass )
{
$sql = "SELECT * FROM tbl_users
WHERE `uname`='$uname' and `upass`=$upass ";
$row = $this->getRow($sql);
return $row;
}
}
?>
3- یک فایل الگو بنام login.tpl در زیر پوشه user از پوشه views برای دریافت نام کاربری و کلمه عبور از کاربر طراحی می کنیم:
<?php include('views/header.tpl');?>
<form action="index.php?id=user/check" method="post">
<table width="80%" border="0" >
<tr>
<td width="20%"> </td>
<td width="80%"><h2> login</h2></td>
</tr>
<tr>
<td>username :</td>
<td><input name="uname" type="text" /></td>
</tr>
<tr>
<td>password:</td>
<td><input name="upass" type="password" /></td>
</tr>
<tr>
<td> </td>
<td><input name="" type="submit" value=" Login " /></td>
</tr>
</table></form>
<?php include('views/footer.tpl');?>
این فرم نام کاربری و کلمه عبور را دریافت کرده و با درخواست user/check به کنترولر می فرستد.
4- یک کلاس کنترولر در فایل user_controller.php در پوشه controllers ایجاد می کنیم که دارای توابع زیر است:
تابع login : برای درخواست نمایش فرم لاگین
تابع check : برای درخواست بررسی اعتبار نام کاربری و کلمه عبور
تابع logout: برای درخواست لاگ اوت شدن(خروج) کاربر
<?php
class user_controller extends controller
{
public function login()
{
$this->_setView("login");
$this->_view->set('title', 'Login User');
return $this->_view->output();
}
//.............public function check()
{
$uname =$_POST['uname'];
$upass =$_POST['upass'];
$row = $this->_model->getRowByUP($uname , $upass );
if ($row )
{
$_SESSION['uname']=$row['uname'];
header('location:index.php?stud/index');
exit;
}
else
return $this->login();
}public function logout()
{
unset($_SESSION['uname']);
header('location:index.php?user/login');
}
}?>
در تابع login ، فایل الگو برای نمایش به کاربر تعیین شده و به او نمایش داده می شود.
در تابع check : نام کاربری و کلمه عبور از فرم دریافت شده و بانک اطلاعاتی بررسی می شود اگر کاربری با این مشخصات وجود داشت، نام کاربری او در داخل session ذخیره شده و صفحه نمایش لیست دانشجویان درخواست می شود ( شما می توانید هر درخواستی را اینجا قرار دهید) و اگر کاربری پیدا نشد تابع login فراخوانی می شود تا دوباره فرم لاگین به کاربر نشام داده شود.
در تابع logout : ابتدا نام کاربری از سشن پاک می شود (تابع unset برای حذف متغیر از حافظه استفاده می شود) ، پس از حذف نشانۀ session صفحه لاگین درخواست می شود.
5- فایل bootstrap.php از پوشه utilities را اصلاح می کنیم. فایل bootstrap.php همان فایلی است که برای هر درخواستی اجرا می شود و درخواست را تفسیر کرده و تابع درخواستی از کنترلر را فراخوانی می کند. ما می توانیم در ابتدای این فایل session را شروع به کار کنیم. و قبل از فراخوانی تابع کنترولر، اعتبار کاربر را بررسی کنیم، اگر کاربر از قبل لاگین کرده و داخل سشن نشانه نام کاربری وجود دارد به او اجازه فراخوانی بدهیم و گرنه صفحه لاگین را به او نشان بدهیم.
<?php
session_start(); // شروع بکار سشن
$controller = "stud";
$action = "index";
$query = null;if (isset($_GET['id']))
{
$params = array();
$params = explode("/", $_GET['id']);
$controller = ucwords($params[0]);
if (isset($params[1]) && !empty($params[1]))
{
$action = $params[1];
}
if (isset($params[2]) && !empty($params[2]))
{
$query = $params[2];
}
}$modelName = $controller;
$controller .= '_controller';
$load = new $controller($modelName, $action);
// بررسی اعتبار کاربر
if ($action!='login' && !isset($_SESSION['uname']))
header('location:index.php?id=user/login');
if (method_exists($load, $action) )
$load->$action($query);
else echo "request invalid";
?>
برای بررسی عدم اعتبار کاربر از دستورات زیر استفاده شده است:
if ($action!='login' && !isset($_SESSION['uname']))
header('location:index.php?id=user/login');
در این دستورات، اگر نام تابع درخواستی مخالف login است و در session هم نام کاربری (نشانۀ لاگین) وجود ندارد کاربر به صفحه لاگین هدایت شده است . اگر برای چند درخواست کاربر نیاز به لاگین نداشته باشد، می توان همه درخواست ها را در آرایه دلخواهی (مثلاً $list1) قرار داد و شرط فوق را بصورت زیر تغییر داد:
$list1=array('user/login' , 'stud/index');
$req=strtolower("$modelName/$action");
if (!in_array($req,$list1) && !isset($_SESSION['uname']))
header('location:index.php?id=user/login');
در آرایه $lidt1 فقط دو درخواست user/login و stud/index قرارگرفته پس برای درخواست این دو صفحه نیازی به لاگین کردن کاربر نخواهد بود، شما می توانید درخواست های دیگری به آن اضافه کنید.
6- برای اضافه کردن امکان لاگ اوت برای کاربر می توان یک متغیر بنام uname در تابع _set کلاس کنترولر تعریف کرد تا برای همه درخواست ها به view فرستاده شود ، در صورتی که کاربر لاگین کرده، نام کاربری را به آن نسبت می دهیم و گرنه پوچ را.
protected function _setView($viewName)
{
$this->_view = new View(HOME . DS . 'views' . DS . strtolower($this->_modelBaseName) . DS . $viewName . '.tpl'); if (isset($_SESSION['uname']))
$this->_view->set('uname' , $_SESSION['uname']);
else $this->_view->set('uname' , '' );
}
در فایل الگوی header.tpl این متغیر را بررسی می کنیم اگر مقدار آن پوچ بود لینک لاگین و اگر غیرپوچ بود لینک هایی برای دسترسی به امکانات سایت و لینک لاگ اوت را نشان بدهد.
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<h3>
<?php if ($uname!=''){ ?>
<a href="index.php?id=stud/index"> studnets </a> |
<a href="index.php?id=dars/index"> Doroos</a> |
<a href="index.php?id=user/logout">logout</a>
<?php } ?>
</h3>
<h1>
<?php echo $title ; ?>
</h1>
<hr />
در نتیجه شکل کلی صفحات بصورت زیر خواهد بود :
در این بخش روش لاگین کاربر در برنامه مبتنی بر mvc را آموزش دادیم و حداقل کدنویسی های لازم برای این کار را به سایت اضافه کردیم.شما می توانید با تکمیل کلاس های مدل، کنترولر و فایل های view امکانات بیشتری برای مدیریت کاربران نیز اضافه کنید.