Đi qua một loạt 7 phần trong chuỗi seri Tạo website bằng PHP, trong phần này mình tiếp tục hướng dẫn cách tạo phân quyền cho website PHP

Giới thiệu về phân quyền cho website PHP

Phân quyền chính là cách thức mà chúng ta chỉ định những quyền được phép và không được phép cho một tài khoản nào đó. Chẳng hạn như trong hệ thống chúng ta hiện có 3 user có 3 quyền khác nhau.

  • user A : chỉ được phép xem bài viết ngoài ra không được làm gì cả
  • user B : được xem bài viết và tạo bài viết của riêng mình
  • user C : được quyền cao nhất và sử dụng toàn bộ hệ thống như thêm bài viết, xóa bài viết, thêm thành viên, xóa thành viên, chỉnh sửa các chức năng quan trọng của website,…

Một hệ thống phân quyền có khi sẽ rất đơn giản, nhưng đôi khi cũng sẽ rất phức tạp tùy vào quy mô website của chúng ta lớn hay nhỏ.

Trong phạm vi bài viết ngày hôm nay, mình sẽ thiết kế một hệ thống phân quyền cho website PHP đơn giản để các bạn có thể nắm được cơ bản về nó, sau này đi sâu về các bài viết sau này hoặc khi xây dựng những website lớn hơn, các bạn sẽ tự tạo cho mình một hệ thống phân quyền khác phức tạp hơn.

Tạo phân quyền cho website PHP

a. Tạo file permission.php

Trong phạm vi bài viết này mình sẽ hướng dẫn các bạn tạo phân quyền đơn giản bao gồm :

  • Nếu người dùng chưa đăng nhập thì khi cố tính truy cập vào những trang bên trang quản trị thì sẽ bị chuyển hướng ra lại trang đăng nhập
  • Nếu người dùng đã đăng nhập nhưng không có quyền admin thì sẽ nhận thông báo không có đủ quyền truy cập

Bên trong thư mục admin/includes, bạn tạo 1 file và đăt tên là permission.php. Bên trong file này các bạn gõ code theo như dưới đây :

<?php
if (isset($_SESSION['user_id']) == false) {
	// Nếu người dùng chưa đăng nhập thì chuyển hướng website sang trang đăng nhập
	header('Location: http://localhost/website/dang-nhap.php');
}else {
	if (isset($_SESSION['permision']) == true) {
		// Ngược lại nếu đã đăng nhập
		$permission = $_SESSION['permision'];
		// Kiểm tra quyền của người đó có phải là admin hay không
		if ($permission == '0') {
			// Nếu không phải admin thì xuất thông báo
			echo "Bạn không đủ quyền truy cập vào trang này<br>";
			echo "<a href='http://localhost/website/index.php'> Click để về lại trang chủ</a>";
			exit();
		}
	}
}
?>

b. Giải thích

Kiểm tra người dùng đã đăng nhập hay chưa

Các bạn nhìn đoạn code dưới đây

if (!isset($_SESSION['user_id'])) {

đây là đoạn code kiểm tra người dùng đó đã đăng nhập hay chưa bằng cách sử dụng hàm isset. Nó dùng để kiểm tra xem một giá trị có được thiết lập hay không. Rõ ràng chúng ta thấy nếu như người dùng chưa đăng nhập, tức là $_SESSSION[‘user_id’], sẽ không tồn tại (xem lại bài Tạo trang đăng nhập), thì ngay lập túc chúng ta sẽ sử dụng hàm header để chuyển hướng người dùng về trang đăng nhập bằng cách sử dụng hàm header như sau

header('Location: http://localhost/website/dang-nhap.php');

Kiểm tra quyền quản trị của người dùng

Nếu như người dùng đã đăng nhập, thì ta sẽ tiến hành kiểm tra xem người đó có đủ quyền để truy cập vào những trang quản trị hay không.

Đầu tiên ta sẽ kiểm tra xem có tồn tại quyền người dùng bằng đoạn code sau

if (isset($_SESSION['permision']) == true) {

Nếu tồn tại ta sẽ tiếp tục lấy giá trị của biến $_SESSION[‘permission’] này

$permission = $_SESSION['permision'];

Sau khi đã lấy được giá trị $permission ta sẽ kiểm tra xem người này có phải admin hay ko (ta quy ước permission phải lớn hơn 0 thì mới là admin ), nếu không thì sẽ chuyển hướng người dùng ra lại trang chủ index.php

if ($permission == '0') {
	// Nếu không phải admin thì xuất thông báo
	echo "Bạn không đủ quyền truy cập vào trang này<br>";
	echo "<a href='http://localhost/website/index.php'> Click để về lại trang chủ</a>";
	exit();
}

c. Tiến hành áp dụng phân quyền cho website PHP

Ở 2 bước trên, mình đã tạo xong file permission.php, giờ thì mình sẽ include file này vào bất kì một file nào bên trong folder admin để kiểm tra phân quyên trên file đó.

Hiện giờ bên trong folder admin của chúng ta chỉ có 1 file là them-bai-viet.php. Nên ta sẽ tiến hành áp dụng phân quyền cho file này trước, sau này nếu có nhiều file hơn thì ta vẫn áp dụng tương tự

Các bạn mở lại file them-bai-viet.php và thêm đoạn code này vào

<?php include("includes/permission.php")?>

khi đó, toàn bộ nội dung trang them-bai-viet.php của chúng ta sẽ như sau :

<?php
	session_start(); 
 ?>
<?php require_once("includes/connection.php");?>
<?php include("includes/permission.php");?>
<?php include ("includes/header.php"); ?>
<?php
	if (isset($_POST["btn_submit"])) {
		//lấy thông tin từ các form bằng phương thức POST
		$title = $_POST["title"];
		$content = $_POST["content"];
		$is_public = 0;
		if (isset($_POST["is_public"])) {
			$is_public = $_POST["is_public"];
		}
		
		$user_id = $_SESSION["user_id"];

		$sql = "INSERT INTO posts(title, content, user_id, is_public, createdate, updatedate ) VALUES ( '$title', '$content', '$user_id', '$is_public', now(), now())";
		// thực thi câu $sql với biến conn lấy từ file connection.php
		mysqli_query($conn,$sql);
		echo "Bài viết đã thêm thành công";
	}

?>

	<form action="them-bai-viet.php" method="post">
		<table>
			<tr>
				<td colspan="2"><h3>Thêm bài viết mới</h3></td>
			</tr>	
			<tr>
				<td nowrap="nowrap">Tiêu đề bài viết :</td>
				<td><input type="text" id="title" name="title"></td>
			</tr>
			<tr>
				<td nowrap="nowrap">Nội dung :</td>
				<td><textarea name="content" id="content" rows="10" cols="150"></textarea></td>
			</tr>
			<tr>
				<td nowrap="nowrap">Public bài viết ? :</td>
				<td><input type="checkbox" id="is_public" name="is_public" value="1"> public</td>
			</tr>
			<tr>
				<td colspan="2" align="center"><input type="submit" name="btn_submit" value="Thêm bài viết"></td>
			</tr>

		</table>
		
	</form>
<?php include "includes/footer.php" ?>

d. Tiến hành chạy thử file them-bai-viet.php

Tiến hành kiểm tra chức năng chuyển hướng ra trang dang-nhap.php nếu người dùng chưa đăng nhập.

Các bạn không đăng nhập gì cả, mà hãy truy cập thẳng vào địa chỉ sau:

localhost/website/admin/them-bai-viet.php

các bạn sẽ thấy ngay lập tức mình bị chuyển hướng qua lại trang chủ.

Tiến hành kiểm tra chức năng thông báo khi người dùng đã đăng nhập nhưng không đủ quyền

Các bạn đăng nhập vào website với user có giá trị permission = 0, thì sẽ thấy hiện ra thông báo không đủ quyền truy cập như sau :

tạo phân quyền cho website php
Thông báo không đủ quyền truy cập

Tổng kết

Kêt thúc bài viết về phân quyền trong website php, mình đã hướng dẫn các bạn đơn giản cách phân quyền. Thực ra phân quyền cho website nó không đơn giản chỉ là phân quyền như mình đã hướng dẫn, nhưng nó là nền tảng để các bạn có thể tạo ra những phân quyền khác dành cho các hệ thống lớn hơn.

Nếu có bất kỳ thắc mắc về hướng dẫn của mình, để lại bình luận bên dưới mình sẽ trả lời sớm nhất có thể.

Ngoài ra nếu bạn có góp ý nào về bài viết này, mình rất hoan nghênh để chúng ta cùng nhau phát triển.

Chúc các bạn học tốt !

Nguồn: Kungfuphp.com