Mysql
 sql >> база данни >  >> RDS >> Mysql

Управление на потребителски акаунт, роли, разрешения, удостоверяване PHP и MySQL - част 3

Това е част 3 от поредица от уроци за това как да създадете система за управление на потребителски акаунти. Можете да намерите другите части тук: част 1, част 2.

Проверка на формуляра

В този момент на страницата signup.php, ако просто щракнете върху бутона за регистрация, без да попълвате някое от полетата на формуляра, няма да получите обратна връзка, но формулярът също не прави нищо. То просто стои там и се взира в теб. Остава така, защото има грешки в $errors от нашата функция validateUser() , която дефинирахме по-рано които все още не показваме във формуляра. Тези грешки съществуват в двойки ключ-стойност.

Например $errors['username'] съдържа грешката, ако има такава, за полето потребителско име. Така че можем да проверим дали грешката в потребителското име съществува, след което добавяме bootstrap клас has-error към елемента div, който обвива полето за въвеждане на потребителско име. Това прави текста на етикета и границата на въвеждането червени на цвят, което показва, че има грешка.

Ще проверяваме полетата за потребителско име, имейл, парола, потвърждаване на паролата. Така че отворете вашия файл signup.php и заменете тези четири полета с този код:

<div class="form-group <?php echo isset($errors['username']) ? 'has-error' : '' ?>">
  <label class="control-label">Username</label>
  <input type="text" name="username" value="<?php echo $username; ?>" class="form-control">
  <?php if (isset($errors['username'])): ?>
    <span class="help-block"><?php echo $errors['username'] ?></span>
  <?php endif; ?>
</div>
<div class="form-group <?php echo isset($errors['email']) ? 'has-error' : '' ?>">
  <label class="control-label">Email Address</label>
  <input type="email" name="email" value="<?php echo $email; ?>" class="form-control">
  <?php if (isset($errors['email'])): ?>
    <span class="help-block"><?php echo $errors['email'] ?></span>
  <?php endif; ?>
</div>
<div class="form-group <?php echo isset($errors['password']) ? 'has-error' : '' ?>">
  <label class="control-label">Password</label>
  <input type="password" name="password" class="form-control">
  <?php if (isset($errors['password'])): ?>
    <span class="help-block"><?php echo $errors['password'] ?></span>
  <?php endif; ?>
</div>
<div class="form-group <?php echo isset($errors['passwordConf']) ? 'has-error' : '' ?>">
  <label class="control-label">Password confirmation</label>
  <input type="password" name="passwordConf" class="form-control">
  <?php if (isset($errors['passwordConf'])): ?>
    <span class="help-block"><?php echo $errors['passwordConf'] ?></span>
  <?php endif; ?>
</div>

Точно под всяко поле за въвеждане условно показваме съобщението за грешка за всяко поле на формуляр.

Само в случай, че не сте знаели за тернарния оператор, ето кратко обяснение.

<?php echo isset($errors['username']) ? 'has-error' : '' ?>

Това изявление основно казва, че ако променливата $errors['username'] е зададена на стойност (не е празна), показва has-error, в противен случай показва празен низ. По същество това е просто оператор if-else.

Сега можете да изпробвате тази проверка, като щракнете върху празния формуляр. Ще видите добре форматирани съобщения за валидиране.

Влизане на потребител

В основната папка на вашето приложение създайте файл с име login.php.

login.php:

<?php include('config.php'); ?>
<?php include(INCLUDE_PATH . '/logic/userSignup.php'); ?>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>UserAccounts - Login</title>
  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
  <!-- Custome styles -->
  <link rel="stylesheet" href="assets/css/style.css">
</head>
<body>
  <?php include(INCLUDE_PATH . "/layouts/navbar.php") ?>
  <div class="container">
    <div class="row">
      <div class="col-md-4 col-md-offset-4">
        <form class="form" action="login.php" method="post">
          <h2 class="text-center">Login</h2>
          <hr>
          <!-- display form error messages  -->
          <?php include(INCLUDE_PATH . "/layouts/messages.php") ?>
          <div class="form-group <?php echo isset($errors['username']) ? 'has-error' : '' ?>">
            <label class="control-label">Username or Email</label>
            <input type="text" name="username" id="password" value="<?php echo $username; ?>" class="form-control">
            <?php if (isset($errors['username'])): ?>
              <span class="help-block"><?php echo $errors['username'] ?></span>
            <?php endif; ?>
          </div>
          <div class="form-group <?php echo isset($errors['password']) ? 'has-error' : '' ?>">
            <label class="control-label">Password</label>
            <input type="password" name="password" id="password" class="form-control">
            <?php if (isset($errors['password'])): ?>
              <span class="help-block"><?php echo $errors['password'] ?></span>
            <?php endif; ?>
          </div>
          <div class="form-group">
            <button type="submit" name="login_btn" class="btn btn-success">Login</button>
          </div>
          <p>Don't have an account? <a href="signup.php">Sign up</a></p>
        </form>
      </div>
    </div>
  </div>
<?php include(INCLUDE_PATH . "/layouts/footer.php") ?>

Сега отворете userSignup.php и в края на файла добавете този код, за да влезете в потребител:

// ...

// USER LOGIN
if (isset($_POST['login_btn'])) {
	// validate form values
	$errors = validateUser($_POST, ['login_btn']);
	$username = $_POST['username'];
	$password = $_POST['password']; // don't escape passwords.

	if (empty($errors)) {
		$sql = "SELECT * FROM users WHERE username=? OR email=? LIMIT 1";
		$user = getSingleRecord($sql, 'ss', [$username, $username]);

		if (!empty($user)) { // if user was found
			if (password_verify($password, $user['password'])) { // if password matches
				// log user in
				loginById($user['id']);
			} else { // if password does not match
				$_SESSION['error_msg'] = "Wrong credentials";
			}
		} else { // if no user found
			$_SESSION['error_msg'] = "Wrong credentials";
		}
	}
}

Ако щракнете върху бутона за вход, без да го попълните, във формуляра ще се появят съобщения за валидиране, точно както в случая на страницата за регистрация.

Сега въведете имейла и паролата за потребителския акаунт, който създадохме по-рано и щракнете върху бутона за влизане. Ако идентификационните данни са правилни, ще бъдете влезли и ще бъдете пренасочени към началната страница. Ще се покаже светкавично съобщение, което ви казва, че вече сте влезли. 

Но ще забележите, че въпреки че потребителят вече е влязъл, връзките за регистрация и влизане в навигационната лента все още се показват, което няма смисъл, нали? Нека ги заменим с влязлото потребителско име и падащо меню с връзка за излизане.

Отворете файла navbar.php и заменете кода, който е в него с този:

navbar.php:

<!-- the whole site is wrapped in a container div to give it some margin on the sides -->
<!-- closing container div can be found in the footer -->
<div class="container">
  <nav class="navbar navbar-default">
    <div class="container-fluid">
      <div class="navbar-header">
        <a class="navbar-brand" href="#">UserAccounts</a>
      </div>
      <!-- <ul class="nav navbar-nav">
        <li class="active"><a href="#">Home</a></li>
        <li><a href="#">Page 1</a></li>
        <li><a href="#">Page 2</a></li>
      </ul> -->
      <ul class="nav navbar-nav navbar-right">
        <?php if (isset($_SESSION['user'])): ?>
          <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
              <?php echo $_SESSION['user']['username'] ?> <span class="caret"></span></a>

              <?php if (isAdmin($_SESSION['user']['id'])): ?>
                <ul class="dropdown-menu">
                  <li><a href="<?php echo BASE_URL . 'admin/profile.php' ?>">Profile</a></li>
                  <li><a href="<?php echo BASE_URL . 'admin/dashboard.php' ?>">Dashboard</a></li>
                  <li role="separator" class="divider"></li>
                  <li><a href="<?php echo BASE_URL . 'logout.php' ?>" style="color: red;">Logout</a></li>
                </ul>
              <?php else: ?>
                <ul class="dropdown-menu">
                  <li><a href="<?php echo BASE_URL . 'logout.php' ?>" style="color: red;">Logout</a></li>
                </ul>
              <?php endif; ?>
          </li>
        <?php else: ?>
          <li><a href="<?php echo BASE_URL . 'signup.php' ?>"><span class="glyphicon glyphicon-user"></span> Sign Up</a></li>
          <li><a href="<?php echo BASE_URL . 'login.php' ?>"><span class="glyphicon glyphicon-log-in"></span> Login</a></li>
        <?php endif; ?>
      </ul>
    </div>
  </nav>

Сега опреснете страницата index.php. Ако все още сте влезли, ще видите, че заглавката е променена и сега показва вашето потребителско име в навигационната лента. Когато щракнете върху потребителското име, ще се появи падащо меню с връзка за излизане. Ако щракнете върху него, ще се каже, че страницата не е намерена, защото все още не сме създали файла logout.php. Нека сега създадем този файл в основната папка на нашето приложение.

logout.php: 

<?php
  session_start();
  session_destroy();
  unset($_SESSION['user']);
  header("location: login.php");
?>

И ние приключихме с нормалното удостоверяване на потребителя. Сега преминаваме към същността на въпроса, която е администраторската секция. Надявам се, че ви е приятно.

В момента влизаме в системата само чрез една функция, функцията loginById(). При тази функция, ако се установи, че потребителят, който влиза, е администратор, той се пренасочва към файла dashboard.php.

Администраторска секция

В папката на администратора създайте файла dashboard.php:

dashboard.php:

<?php include('../config.php') ?>
<?php include(ROOT_PATH . '/admin/middleware.php') ?>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Admin</title>
  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
  <!-- Custome styles -->
  <link rel="stylesheet" href="../static/css/style.css">
</head>
<body>
  <?php include(INCLUDE_PATH . "/layouts/admin_navbar.php") ?>

  <div class="col-md-4 col-md-offset-4">
      <h1 class="text-center">Admin</h1>
      <br />
      <ul class="list-group">
        <a href="<?php echo BASE_URL . 'admin/posts/postList.php' ?>" class="list-group-item">Manage Posts</a>
        <a href="<?php echo BASE_URL . 'admin/users/userList.php' ?>" class="list-group-item">Manage Users</a>
        <a href="<?php echo BASE_URL . 'admin/roles/roleList.php' ?>" class="list-group-item">Manage Roles</a>
      </ul>
  </div>
  <?php include(INCLUDE_PATH . "/layouts/footer.php") ?>
</body>
</html>

В браузъра си посетете http://localhost/user-accounts/admin/dashboard.php и ще видите някои предупредителни съобщения. Това е така, защото включваме някои два файла, които все още не съществуват:Middleware.php и admin_navbar.php.

Що се отнася до Middleware.php, ще работим върху него по-късно. Но засега просто го създайте в администраторската папка и го оставете празно, за да може предупредителното съобщение да изчезне и да ни остави на мира.

Що се отнася до admin_navbar.php, създайте го в папката includes/layouts:

admin_navbar.php:

<!-- the whole site is wrapped in a container div to give it some margin on the sides -->
<!-- closing container div can be found in the footer -->
<div class="container">
  <nav class="navbar navbar-inverse">
    <div class="container-fluid">
      <div class="navbar-header">
        <a class="navbar-brand" href="<?php echo BASE_URL . 'admin/dashboard.php' ?>">Dashboard</a>
      </div>
      <ul class="nav navbar-nav navbar-right">
        <?php if (isset($_SESSION['user'])): ?>
          <li><a href="<?php echo BASE_URL . 'index.php' ?>"><span class="glyphicon glyphicon-globe"></span></a></li>
          <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
              <?php echo $_SESSION['user']['username'] . ' (' . $_SESSION['user']['role'] . ')'; ?> <span class="caret"></span></a>
            <ul class="dropdown-menu">
              <li><a href="<?php echo BASE_URL . 'admin/users/editProfile.php' ?>">Profile</a></li>
              <li><a href="<?php echo BASE_URL . 'admin/dashboard.php' ?>">Dashboard</a></li>
              <li role="separator" class="divider"></li>
              <li><a href="<?php echo BASE_URL . 'logout.php' ?>" style="color: red;">Logout</a></li>
            </ul>
          </li>
        <?php endif; ?>
      </ul>
    </div>
  </nav>
  <?php include(INCLUDE_PATH . "/layouts/messages.php") ?>

В браузъра си опреснете страницата dashboard.php сега и предупредителните съобщения ще изчезнат.

Dashboard.php е административната област, нали? Не се предполага, че е достъпен от обикновени потребители. Така че трябва да пренасочим всеки нормален потребител, който се опитва да посети тази страница, обратно към началната страница. Освен това все още не създаваме/управляваме администраторски потребители и роли. Всичко това идва скоро.

Нека приключим тази част тук. В следващата част продължаваме с управлението на администраторски потребителски акаунти, както и контрол на достъпа.

Ако харесвате тези уроци и искате повече от тях, моля, помислете дали да споделите/препоръчате уроците сред приятелите си. Това ще измине наистина дълъг път, за да ме подкрепи в създаването на повече от това.

Благодаря, че следвате и ще се видим в следващата част.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Python поддържа ли MySQL подготвени изявления?

  2. Как да наблюдавате MySQL/MariaDB бази данни с помощта на Netdata на CentOS 7

  3. Свързване чрез предходен еквивалент за MySQL

  4. Изчислете текущата сума в MySQL

  5. Различни начини за преглед на таблици в MySQL Server