sql >> Databáze >  >> RDS >> Mysql

Správa uživatelských účtů, role, oprávnění, autentizace PHP a MySQL - 3. část

Toto je část 3 série návodů, jak vytvořit systém správy uživatelských účtů. Další díly naleznete zde: část 1, část 2.

Ověření formuláře

Pokud v tomto okamžiku na stránce signup.php kliknete na tlačítko registrace bez vyplnění jakéhokoli pole formuláře, nezískáte žádnou zpětnou vazbu, ale formulář také nic nedělá. Jen tam zůstane a zírá na tebe. Zůstane to tak, protože v $errors z funkce validateUser(), kterou jsme definovali dříve, jsou chyby, které ve formuláři zatím nezobrazujeme. Tyto chyby existují v párech klíč–hodnota.

Například $errors['username'] obsahuje chybu, pokud existuje, pro pole uživatelského jména. Takže můžeme zkontrolovat, zda existuje chyba uživatelského jména, a poté přidáme třídu bootstrap has-error do prvku div, který obaluje vstupní pole uživatelského jména. Tím se text štítku a vstupní hranice zbarví červeně, což znamená, že došlo k chybě.

Ověříme pole uživatelského jména, e-mailu, hesla a potvrzení hesla. Otevřete tedy svůj soubor signup.php a nahraďte tato čtyři pole tímto kódem:

<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>

Přímo pod každým vstupním polem podmíněně zobrazujeme chybovou zprávu pro každé pole formuláře.

Pro případ, že byste nevěděli o ternárním operátoru, zde je krátké vysvětlení.

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

Toto prohlášení v podstatě říká, že pokud je proměnná $errors['username'] nastavena na hodnotu (není prázdná), zobrazí has-error, jinak zobrazí prázdný řetězec. Je to v podstatě jen prohlášení if-else.

Nyní si můžete toto ověření vyzkoušet kliknutím na prázdný formulář. Uvidíte pěkně naformátované ověřovací zprávy.

Přihlášení uživatele

V kořenové složce vaší aplikace vytvořte soubor s názvem 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") ?>

Nyní otevřete userSignup.php a na konec souboru přidejte tento kód pro přihlášení uživatele:

// ...

// 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";
		}
	}
}

Pokud kliknete na přihlašovací tlačítko bez jeho vyplnění, objeví se ve formuláři ověřovací zprávy stejně jako v případě přihlašovací stránky.

Nyní zadejte e-mail a heslo k uživatelskému účtu, který jsme vytvořili dříve, a klikněte na tlačítko přihlášení. Pokud byly přihlašovací údaje správné, budete přihlášeni a přesměrováni na domovskou stránku. Zobrazí se blesková zpráva, která vám sdělí, že jste nyní přihlášeni. 

Ale všimnete si, že i když je uživatel nyní přihlášen, stále se zobrazují odkazy na přihlášení a přihlášení v navigační liště, což nedává smysl, že? Nahraďte je přihlášeným uživatelským jménem a rozevíracím seznamem s odkazem na odhlášení.

Otevřete soubor navbar.php a nahraďte kód, který je v něm s tímto:

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>

Nyní obnovte stránku index.php. Pokud jste byli stále přihlášeni, uvidíte, že se záhlaví změnilo a nyní zobrazuje vaše uživatelské jméno na navigační liště. Když kliknete na uživatelské jméno, objeví se rozbalovací nabídka s odkazem na odhlášení. Pokud na něj kliknete, zobrazí se stránka nenalezena, protože jsme ještě nevytvořili soubor logout.php. Nyní tento soubor vytvoříme v kořenové složce naší aplikace.

logout.php: 

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

A máme hotovo s běžnou autentizací uživatele. Nyní se dostáváme k jádru věci, kterou je administrační sekce. Doufám, že si to užíváte.

Právě teď přihlašujeme uživatele pouze jednou funkcí, funkcí loginById(). V této funkci, pokud je zjištěno, že uživatel, který se přihlašuje, je administrativní uživatel, je přesměrován do souboru dashboard.php.

Sekce správce

Ve složce admin vytvořte soubor 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>

Ve svém prohlížeči navštivte http://localhost/user-accounts/admin/dashboard.php a uvidíte několik varovných zpráv. Je to proto, že jsme zahrnuli některé dva soubory, které ještě neexistují:middleware.php a admin_navbar.php.

Pokud jde o middleware.php, budeme na něm pracovat později. Ale zatím je jen vytvořte ve složce admin a nechte ji prázdnou, aby varovná zpráva mohla zmizet a nechat nás na pokoji.

Pokud jde o admin_navbar.php, vytvořte jej ve složce 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") ?>

Ve svém prohlížeči nyní obnovte stránku dashboard.php a varovné zprávy zmizí.

Dashboard.php je oblast pro správu, že? Běžní uživatelé k němu nemají mít přístup. Potřebujeme tedy přesměrovat každého normálního uživatele, který se pokouší navštívit tuto stránku, zpět na domovskou stránku. Také zatím nevytváříme/nespravujeme administrátory a role. To vše již brzy.

Ukončeme zde tuto část. V další části pokračujeme správou uživatelských účtů admin a také řízením přístupu.

Pokud se vám tyto výukové programy líbí a chcete jich více, zvažte sdílení/doporučení výukových programů mezi své přátele. To bude opravdu dlouhá cesta, která mě podpoří při vytváření dalšího.

Děkujeme za sledování a uvidíme se u další části.


  1. Identifikace struktury kusovníku (BOM) v databázích

  2. Jak zkopírovat data velké tabulky do jiné tabulky v SQL Server

  3. Android :Chyba Sqlite - (1) blízko null:chyba syntaxe

  4. Získejte datum/čas z unixového časového razítka v SQLite