Trong bài thực hành này, chúng ta sẽ thực hiện phân quyền người dùng dựa vào vai trò trong ứng dụng web.. Xây dựng module phân quyền Tạo các form thêm mới quyền, vai trò và người dùng v
Trang 1BAN CƠ YẾU CHÍNH PHỦ
Trang 2MỤC LỤC
1 Điều kiện tiên quyết 1
2 Giới thiệu 1
3 Kịch bản thực hành 1
4 Mục tiêu bài thực hành 1
5 Tổ chức thực hành 1
6 Môi trường thực hành 2
7 Sơ đồ thực hành 2
8 Các nhiệm vụ cần thực hiện 2
Nhiệm vụ 1 Xây dựng Database 2
Nhiệm vụ 2 Xây dựng module phân quyền 3
Nhiệm vụ 3 Thực hiện phân quyền người dùng theo vai trò 22
9 Đánh giá bài thực hành Error! Bookmark not defined.
Trang 3DANH MỤC HÌNH ẢNH
Hình 1 Sơ đồ database 2
Hình 2 Form login 4
Hình 3 Menu bar 5
Hình 4 Form thêm mới quyền 7
Hình 5 Bảng hiển thị danh sách quyền 8
Hình 6 Tạo form thêm mới quyền 9
Hình 7 Bảng hiển thị danh sách vai trò 11
Hình 8 Form thêm mới user 15
Hình 9 Bảng hiển thị danh sách user 17
Hình 10 Form gán vai trò cho user 18
Hình 11 Kiểm tra vai trò và quyền của user 21
Trang 41 Điều kiện tiên quyết
Bài thực hành xác thực người dùng trong ứng dụng Web
2 Giới thiệu
Bất kể hệ thống website nào cũng có người dùng và đi kèm với nó là việc xác thực (authentication) và phân quyền (authorization) với từng người dùng Sau khi người dùng đăng nhập thành công, nhiệm vụ tiếp theo của ứng dụng web là xác định những tài nguyên mà người dùng được phép truy cập Thao tác này được gọi
là phân quyền người dùng (users authorization) Có 3 mô hình phân quyền truy cập điển hình là: phân quyền truy cập tùy quyền (discretionary access control), phân quyền truy cập bắt buộc (mandatory access control) và phân quyền dựa vào vai trò (role – based access control) Đối với ứng dụng web, mô hình phân quyền thường được dùng là phân quyền dựa vào vai trò
Trong bài thực hành này, chúng ta sẽ thực hiện phân quyền người dùng dựa vào vai trò trong ứng dụng web
3 Kịch bản thực hành
3.1 Xây dựng database:
Xây dựng database với các bảng sau: users, roles, permission, user_has_roles, roles_has_permissions
3.2 Xây dựng module phân quyền
Tạo các form thêm mới quyền, vai trò và người dùng và các bảng hiển thị thông tin Sau đó thực hiện việc kiểm tra phân quyền
3.3 Thực hiện việc phân quyền
Trong một hệ thống sẽ có một người dùng duy nhất có quyền thiết lập mô hình phân quyền cho hệ thống Sau khi đăng nhập thành công, người quản trị ứng dụng web sẽ :
- Thiết lập vai trò của người dùng
- Thiết lập các quyền theo vai trò
- Mỗi một user sẽ có một hoặc nhiều vai trò trong hệ thống
4 Mục tiêu bài thực hành
Bài thực hành giúp chúng ta hiểu rõ:
- Hiểu rõ về cơ chế phân quyền thường dùng trong ứng dụng web
- Biết cách xây dựng chức năng phân quyền đối với một ứng dụng web
5 Tổ chức thực hành
Yêu cầu thực hành: độc lập
Thời gian: 45 phút
Trang 56 Môi trường thực hành
- Yêu cầu phần cứng:
+ Số lượng máy tính cần chuẩn bị : 1
+ Cấu hình tối thiểu của Intel Core i3, 4GB RAM
- Yêu cầu phần mềm trên máy:
+ Hệ điều hành trên máy tính : Window
+ Phần mềm : Sublime Text 3, Xampp
- Yêu cầu kết nối mạng Internet: có
7 Sơ đồ thực hành
Không có
8 Các nhiệm vụ cần thực hiện
Nhiệm vụ 1 Xây dựng Database
Xây dựng database với các bảng và mối quan hệ giữa các bảng như sau:
Hình 1 Sơ đồ database
Tạo bảng users như sau:
ALTER TABLE users
Tạo bảng user_has_roles:
CREATE TABLE `user_has_roles`
(
Trang 6role_id int(10) UNSIGNED NOT NULL,
)
Tạo khóa ngoại cho các bảng user_has_roles:
ALTER TABLE role_has_permissions
ADD PRIMARY KEY (id),
ADD KEY role_has_permissions_permission_id_foreign (permission_id), ADD KEY role_has_permissions_role_id_foreign (role_id);
Tạo ràng buộc giữa bảng users và bảng user_has_roles:
ALTER TABLE user_has_roles
ADD CONSTRAINT user_has_roles_ibfk_1 FOREIGN KEY (user_id) REFERENCES users (id)
Tương tự tạo và liên kết các bảng còn lại như sơ đồ trên
Nhiệm vụ 2 Xây dựng module phân quyền
Bước 1: Tạo thư mục phanquyen trong thư mục htdocs
Tạo thư mục phanquyen/includes để chứa các file thư viện kết nối database
Bước 2: Tạo kết nối đến mysql để lấy dữ liệu:
- Tạo file database.php trong thư mục phanquyen/includes:
<?php
$database['host'] = 'localhost'; //Tên Hosting
$database['dbname'] = 'tech_php'; //Tên của Database
$database['username'] = 'root'; //Tên sử dụng Database
$database['password'] = ''; //Mật khẩu sử dụng Database
$connect=mysqli_connect("{$database['host']}","{$database['username']}","{$database['password']}"); // Tạo kết nối
mysqli_select_db($connect, "{$database['dbname']}") or die("Không thể chọn database"); // chọn bảng
mysqli_set_charset($connect, 'UTF8'); // set ngôn ngữ
?>
Sau khi tạo xong file kết nối database, khi tạo thẻ <?php ?> ở phần đầu các file php cần thêm dòng code sau để kết nối đến database:
include 'includes/database.php';
Bước 3: Tạo liên kết tới các file css,bootstrap
Khi tạo các file php, các thẻ liên kết này thường được đặt ở phần đầu và để trong thẻ <head></head>
<link rel="stylesheet" awesome/4.7.0/css/font-awesome.min.css">
// sử dụng javasscript
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Trang 7<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js">
<div id="formContent" style="max-width:350px;margin:0 auto;">
<h1 style="font-size: 25px;font-weight: 500; margin: 30px 0 20px; text-align:
center;"> Đăng Nhập Hệ Thống </h1>
<form method="POST">
<div class="form-group">
<label for="email"> Email: </label>
<input type="email" class="form-control" id="login" name="email"
placeholder="Email">
</div>
<div class="form-group">
<label for="password">Password: </label>
<input type="password" class="form-control" id="password" name="password" placeholder="Password">
Thực hiện đoạn code sau trong thẻ <?php ?> ở phần đầu file để kiểm tra khi
người dùng click vào button Đăng nhập:
if (isset($_POST['email']) && isset($_POST['password'])) {
$email = trim($_POST['email']);
$password = trim($_POST['password']);
Trang 8$password = md5($password); // Mã hóa md5 mật khẩu
$query = mysqli_query($connect, "SELECT
users.email, users.id as user_id, users.name as user_name,
LEFT JOIN user_has_roles ON users.id = user_has_roles.user_id
LEFT JOIN roles ON roles.id = user_has_roles.role_id
LEFT JOIN role_has_permissions ON role_has_permissions.role_id = roles.id
LEFT JOIN permissions ON role_has_permissions.permission_id = permissions.id
WHERE email = '$email' AND password = '$password'
$_SESSION['auth_user']['permission_name'] = explode(',', $permissions);
header('Location: ' 'index.php'); // return redirect về login
Sử dụng đoạn code dưới đây để thực hiện đăng xuất: Khi user đăng xuất sẽ
quay trở về trang login
Tạo menu với thông tin sau: Trang chủ, Quản lý user, Quản lý vai trò, Quản
lý quyền, Đăng xuất
Hình 3 Menu bar
Thực hiện đoạn code sau để tạo menu:
<nav class="navbar navbar-default">
Trang 9Kiểm tra khi user login vào sẽ có vai trò và quyền hạn nào với website, từ đó
sẽ có quyền được truy cập vào các tab menu nào bên trên, thêm dòng code sau để thực hiện kiểm tra:
<?php if(in_array('Phân quyền',$_SESSION['auth_user']['permission_name'])) {
?> // dòng này ở dưới dòng code tạo tab Trang chủ
<?php } ?> // dòng này ở dưới dòng code tạo tab Quản lý quyền
Sau khi tạo xong, khi tạo các file php thêm dòng code vào phần
<body><body> để thực hiện kết nối tới file nav.php để hiển thị menu:
Trang 10Hình 4 Form thêm mới quyền
Thực hiện đoạn code sau để tạo form thêm mới:
<label for="name"> Tên: </label>
<input type="text" name="name" required class="form-control"> </div>
<div class="form-group">
<label for="description"> Mô tả: </label>
<textarea name="description" cols="30" rows="10" control"></textarea>
</div>
<div class="form-group">
<input type="hidden" name="add-permission" value="1">
<input type="submit" class="btn btn-sm btn-warning" value="Thêm mới">
Trang 11$created_at = date("Y-m-d H:i:s");
$sql_insert = "INSERT INTO permission_groups(name, description, created_at) VALUES ('{$name}','{$description}','{$created_at}')";
$query_insert = mysqli_query($connect, $sql_insert);
if ($query_insert) // nếu lưu thành công {
header('Location: ' '?page=dang-nhap'); // trở về login
- Tạo bảng hiển thị danh sách quyền như sau:
Hình 5 Bảng hiển thị danh sách quyền
Thực hiện đoạn code dưới đây để tạo bảng hiển thị danh sách nhóm quyền:
Trang 12- Tạo form thêm mới vai trò như sau:
Hình 6 Tạo form thêm mới quyền
Thực hiện đoạn code sau để tạo form thêm mới:
<div class="row">
<div class="col-md-6">
<h2> Thêm mới vai trò </h2>
</div>
Trang 13<div class="col-md-12" style="margin-top:30px;">
<div class="col-md-6" style="max-width:500px;border:1px solid
<label for="description">Mô tả:</label>
<textarea class="form-control" name="description" cols="30"
<div class="panel panel-info">
<div class="panel-heading"> Chọn quyền: </div>
Tiếp theo thực hiện câu lệnh sau trong thẻ <?php ?> ở phần đầu file để lấy
dữ liệu từ bảng permissions, lấy tất cả các quyền có trong hệ thống để chọn quyền cho vai trò :
$sql_pms = "SELECT * FROM permissions";
Trang 14}
Sau khi lấy tất cả các quyền có trong database, sử dụng đoạn code sau để thực hiện việc insert dữ liệu vào bảng roles khi người dùng click button “Thêm mới”:
$role_id = false; // tạo biến role_id
('{$name}','{$description}','{$created_at}')";
$insert = mysqli_query($connect, $sql);
if ($insert == true) {
$role_id = mysqli_insert_id($connect
if (count($in_permissions) > 0 && $role_id != false) {
foreach ($in_permissions as $pms_id) {
Tạo danh sách vai trò như sau:
Hình 7 Bảng hiển thị danh sách vai trò
Thực hiện đoạn code dưới đây để tạo danh sách vai trò:
<h2> Quản lý vai trò </h2>
<a href="add-role.php" class="btn btn-sm btn-info"> Thêm mới vai trò
</a>
60px;border:1px solid #eee">
<thead>
<tr>
Trang 15<a href="edit-role.php?id=<?= $item['id']; ?>"
class="btn btn-success btn-sm"> Sửa vai trò </a> <a onclick="return confirm('Bạn có chắc xóa không
?')" href="delete-role.php?id=<?= $item['id']; ?>" class="btn btn-warning btn-sm"> Xóa vai trò </a> </td>
Bước 10: Tạo file edit-role.php trong thư mục phanquyen để thực hiện chỉnh sửa các vai trò:
Lưu ý: form chỉnh chửa giống form tạo mới vai trò, có thể copy bên file role.php:
add-<h2> Chỉnh sửa vai trò </h2>
<form method="post">
<div class="col-md-12" style="margin-top:30px;">
<div class="col-md-6" style="max-width:500px;border:1px solid
#eee;padding:20px;">
<div class="form-group">
<label for="name">Tên:</label>
Trang 16<input type="text" value="<?= $role_data['name']; ?>" class="form-control" name="name">
</div>
<div class="form-group">
<label for="description">Mô tả:</label>
<textarea class="form-control" name="description" cols="30" rows="10"><?= $role_data['description']; ?></textarea>
</div>
</div>
<div class="col-md-6">
<div class="col-md-12">
<div class="panel panel-info">
<div class="panel-heading"> Chọn quyền </div>
Tiếp theo thực hiện câu lệnh truy vấn sau trong thẻ <?php ?> ở phần đầu file
để lấy dữ liệu từ bảng permissions:
// Lấy tất cả quyền đổ ra checkbox
$sql_pms = "SELECT * FROM permissions";
Trang 17$query_role = mysqli_query($connect, "SELECT * FROM
role_has_permissions.role_id WHERE roles.id = '$id'");
// Kiểm tra Vai trò đã có hay chưa?
if (mysqli_num_rows(mysqli_query($connect, "SELECT name FROM roles
WHERE name = '$name' AND id <> '$id'")) > 0) {
header('Location: ' $_SERVER['HTTP_REFERER']); // return exit;
}
$role_id = false;// tạo biến role_id
$sql = "UPDATE roles SET name = '{$name}', description =
'{$description}', updated_at = '{$date}' WHERE id = '$id'";
$update = mysqli_query($connect, $sql);
if ($update) {
$role_id = $id;
if (count($in_permissions) > 0) {
role_has_permissions WHERE role_id = '$role_id'");
foreach ($in_permissions as $pms_id) {
$update_rl_has_pms = mysqli_query($connect, "INSERT INTO
Trang 18Sử dụng đoạn code sau để thực hiện xóa vai trò khi người dùng click vào button “Xóa vai trò”:
if (isset($_GET['id'])) {
$id = $_GET['id'];
$query = mysqli_query($connect, $sql);
if ($query) { header('Location: ' $_SERVER['HTTP_REFERER']);
exit;
} else { header('Location: ' $_SERVER['HTTP_REFERER']); // return back
exit;
} }
Bước 12: Tạo file add-user.php để thêm mới user
Tạo form thêm user như sau:
Hình 8 Form thêm mới user
Thực hiện đoạn code sau để tạo form thêm mới:
<div class="panel" style="box-shadow: none;">
<h2 style="text-align: center;"> Thêm mới thành viên </h2>
<form class="form_add_user" method="post" action="?page=dang-ky"> <div class="form-group">
<input type="text" id="login" class="form-control" name="name" placeholder="Tên tài khoản">
Trang 19$email = trim($_POST['email']);
$password = trim($_POST['password']);
$password = md5($password); // Mã hóa md5 mật khẩu
$sql = "INSERT INTO users(name, email, password, created_at) VALUE
Query SQL $insert = mysqli_query($connect, $sql); // Lưu Thông tin đăng ký