Hướng dẫn how do you control user access in php application? - làm thế nào để bạn kiểm soát quyền truy cập của người dùng trong ứng dụng php?

Tại một điểm nhất định, ứng dụng của bạn sẽ cần xử lý quyền truy cập của người dùng và kiểm soát từng người dùng cụ thể với nội dung cụ thể. Ví dụ phổ biến nhất mà chúng tôi sẽ gặp sẽ là người dùng thường xuyên và người dùng quản trị. Người dùng thường xuyên chỉ nên xem nội dung có liên quan đến họ. Người dùng quản trị viên trong nhiều trường hợp sẽ có thể xem tất cả người dùng, thông tin nhạy cảm mà nếu trong tay sai, có thể gây ra thiệt hại cho trang web. Có nhiều cách để có một trang web đơn giản, có bảng điều khiển người dùng thông thường và bảng quản trị. Từ bài đăng trước của tôi về Saving Records vào cơ sở dữ liệu, hãy để Lừa lấy cùng một bảng chúng tôi đã tạo cho người dùng và thêm một trường gọi là USERS_ROLE với kiểu dữ liệu của ENUM và các giá trị của quản trị viên, người dùng.

Tạo bảng người dùng

CREATE TABLE users(
        users_id int(11) NOT NULL auto_increment,
        users_fname VARCHAR(60),
        users_lname VARCHAR(60),
        users_email VARCHAR(60),
        users_pass VARCHAR(32),
        users_role ENUM('admin', 'user'),
        PRIMARY KEY (users_id)
    );

Bây giờ với trường mới này trong cơ sở dữ liệu, chúng tôi có thể xác định loại người dùng nào đang thực sự truy cập trang web của chúng tôi. Tôi đã thấy rằng cách tốt nhất để xác định loại người dùng là thêm cùng trường này vào biến sessions của chúng tôi khi chúng tôi đăng nhập. Nếu bạn chưa tìm ra cách đăng nhập người dùng, thì hãy xem qua hướng dẫn đó ở đây.

Hãy cùng thực hiện một số thay đổi đối với tệp ‘Validate_login.php của chúng tôi, thêm phiên người dùng. Bằng cách đó, người dùng có thể duyệt qua trang web mà không được yêu cầu xác thực. Điều đầu tiên chúng ta phải làm là bắt đầu session. Sau khi bắt đầu session, chúng tôi xác nhận thông tin đăng nhập của người dùng. Khi thông tin đăng nhập đã được xác minh, chúng tôi sẽ tiếp tục và tạo một biến sessions. Biến này sẽ chứa thông tin duy nhất cho người dùng cụ thể đó, bao gồm vai trò đã được gán cho người dùng đó. Vì vậy, thay vì lặp lại rằng đăng nhập đã thành công, chúng tôi viết một số logic cho nhu cầu của chúng tôi. Hãy để một cái nhìn:

validate_login.php


session_start();

$email = $_POST["users_email"];
$pass = $_POST["users_pass"];


$con = mysql_connect("localhost","root","");

if(! $con)
{
    die('Connection Failed'.mysql_error());
}


mysql_select_db("my_dbname",$con);

$result = mysql_query("SELECT users_id, users_email, users_role " + 
  "FROM users WHERE users_email = $email AND users_pass = $pass");

$total = mysql_num_rows($result);

$protocol = $_SERVER['HTTPS'] ? "https" : "http";
$url = $protocol.'://'.$_SERVER['HTTP_HOST'];

if($total == 1){
    
    $row = mysql_fetch_assoc($result);
    $_SESSION['users_id'] = $row['users_id'];
    $_SESSION['users_email'] = $row['users_email'];
    $_SESSION['users_role'] = $row['users_role'];
    
    
    
    $url .= '/members.php';    
}
else{
    
    $url .= '/login.php?error=true';
}
header("Location: $url");
exit;

?>

Lưu ý rằng chúng tôi chuyển hướng người dùng đến trang đăng nhập nếu thông tin đăng nhập không phù hợp. Chúng tôi cũng đã thêm một cái gì đó vào cuối URL. Chúng tôi vừa gửi một lỗi biến, có thể được truy cập thông qua biến


session_start();

$email = $_POST["users_email"];
$pass = $_POST["users_pass"];


$con = mysql_connect("localhost","root","");

if(! $con)
{
    die('Connection Failed'.mysql_error());
}


mysql_select_db("my_dbname",$con);

$result = mysql_query("SELECT users_id, users_email, users_role " + 
  "FROM users WHERE users_email = $email AND users_pass = $pass");

$total = mysql_num_rows($result);

$protocol = $_SERVER['HTTPS'] ? "https" : "http";
$url = $protocol.'://'.$_SERVER['HTTP_HOST'];

if($total == 1){
    
    $row = mysql_fetch_assoc($result);
    $_SESSION['users_id'] = $row['users_id'];
    $_SESSION['users_email'] = $row['users_email'];
    $_SESSION['users_role'] = $row['users_role'];
    
    
    
    $url .= '/members.php';    
}
else{
    
    $url .= '/login.php?error=true';
}
header("Location: $url");
exit;

?>
0 trong PHP. Biến này là hiển thị cho người dùng nếu có sự cố với quy trình đăng nhập. Để hiển thị lỗi cho người dùng, chỉ cần hỏi xem biến có được đặt không và nếu vậy, thì hãy hiển thị thông báo lỗi, như thế này:

(withih đăng nhập.php)

 
if(isset($_GET['error'] && $_GET['error'] == true){
    echo 'Invalid Username and/or Password.';
}
?>

Những dòng trước đó có thể được thêm vào bất cứ nơi nào trong mã của bạn, và tất nhiên, bạn sẽ đặt chúng ở một nơi hợp lý. Bây giờ, đây là phần thú vị. Trong trang Thành viên mới, chúng tôi muốn hiển thị nội dung liên quan đến người dùng. Hãy giả sử rằng chúng ta có các menu trên các tệp riêng biệt, trong đó chúng ta sẽ gọi ‘admin_menu.php, và‘ user_menu.php. Để xác định menu nào để hiển thị, chúng tôi chỉ có thể sử dụng câu lệnh


session_start();

$email = $_POST["users_email"];
$pass = $_POST["users_pass"];


$con = mysql_connect("localhost","root","");

if(! $con)
{
    die('Connection Failed'.mysql_error());
}


mysql_select_db("my_dbname",$con);

$result = mysql_query("SELECT users_id, users_email, users_role " + 
  "FROM users WHERE users_email = $email AND users_pass = $pass");

$total = mysql_num_rows($result);

$protocol = $_SERVER['HTTPS'] ? "https" : "http";
$url = $protocol.'://'.$_SERVER['HTTP_HOST'];

if($total == 1){
    
    $row = mysql_fetch_assoc($result);
    $_SESSION['users_id'] = $row['users_id'];
    $_SESSION['users_email'] = $row['users_email'];
    $_SESSION['users_role'] = $row['users_role'];
    
    
    
    $url .= '/members.php';    
}
else{
    
    $url .= '/login.php?error=true';
}
header("Location: $url");
exit;

?>
1 hoặc sử dụng câu lệnh

session_start();

$email = $_POST["users_email"];
$pass = $_POST["users_pass"];


$con = mysql_connect("localhost","root","");

if(! $con)
{
    die('Connection Failed'.mysql_error());
}


mysql_select_db("my_dbname",$con);

$result = mysql_query("SELECT users_id, users_email, users_role " + 
  "FROM users WHERE users_email = $email AND users_pass = $pass");

$total = mysql_num_rows($result);

$protocol = $_SERVER['HTTPS'] ? "https" : "http";
$url = $protocol.'://'.$_SERVER['HTTP_HOST'];

if($total == 1){
    
    $row = mysql_fetch_assoc($result);
    $_SESSION['users_id'] = $row['users_id'];
    $_SESSION['users_email'] = $row['users_email'];
    $_SESSION['users_role'] = $row['users_role'];
    
    
    
    $url .= '/members.php';    
}
else{
    
    $url .= '/login.php?error=true';
}
header("Location: $url");
exit;

?>
2. Trong ví dụ này, tôi sẽ sử dụng câu lệnh

session_start();

$email = $_POST["users_email"];
$pass = $_POST["users_pass"];


$con = mysql_connect("localhost","root","");

if(! $con)
{
    die('Connection Failed'.mysql_error());
}


mysql_select_db("my_dbname",$con);

$result = mysql_query("SELECT users_id, users_email, users_role " + 
  "FROM users WHERE users_email = $email AND users_pass = $pass");

$total = mysql_num_rows($result);

$protocol = $_SERVER['HTTPS'] ? "https" : "http";
$url = $protocol.'://'.$_SERVER['HTTP_HOST'];

if($total == 1){
    
    $row = mysql_fetch_assoc($result);
    $_SESSION['users_id'] = $row['users_id'];
    $_SESSION['users_email'] = $row['users_email'];
    $_SESSION['users_role'] = $row['users_role'];
    
    
    
    $url .= '/members.php';    
}
else{
    
    $url .= '/login.php?error=true';
}
header("Location: $url");
exit;

?>
2. Trang thành viên của chúng tôi có thể trông giống như thế này:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
            "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Jotorres Members Page</title>
</head>
<body>
<h2>Welcome to members page.</h2>

</body>
</html>

Như bạn có thể thấy, với một


session_start();

$email = $_POST["users_email"];
$pass = $_POST["users_pass"];


$con = mysql_connect("localhost","root","");

if(! $con)
{
    die('Connection Failed'.mysql_error());
}


mysql_select_db("my_dbname",$con);

$result = mysql_query("SELECT users_id, users_email, users_role " + 
  "FROM users WHERE users_email = $email AND users_pass = $pass");

$total = mysql_num_rows($result);

$protocol = $_SERVER['HTTPS'] ? "https" : "http";
$url = $protocol.'://'.$_SERVER['HTTP_HOST'];

if($total == 1){
    
    $row = mysql_fetch_assoc($result);
    $_SESSION['users_id'] = $row['users_id'];
    $_SESSION['users_email'] = $row['users_email'];
    $_SESSION['users_role'] = $row['users_role'];
    
    
    
    $url .= '/members.php';    
}
else{
    
    $url .= '/login.php?error=true';
}
header("Location: $url");
exit;

?>
2 đơn giản, bạn có thể xử lý những gì bạn muốn hiển thị cho các loại người dùng khác nhau. Bạn sẽ có thể thêm các menu mới như ‘

session_start();

$email = $_POST["users_email"];
$pass = $_POST["users_pass"];


$con = mysql_connect("localhost","root","");

if(! $con)
{
    die('Connection Failed'.mysql_error());
}


mysql_select_db("my_dbname",$con);

$result = mysql_query("SELECT users_id, users_email, users_role " + 
  "FROM users WHERE users_email = $email AND users_pass = $pass");

$total = mysql_num_rows($result);

$protocol = $_SERVER['HTTPS'] ? "https" : "http";
$url = $protocol.'://'.$_SERVER['HTTP_HOST'];

if($total == 1){
    
    $row = mysql_fetch_assoc($result);
    $_SESSION['users_id'] = $row['users_id'];
    $_SESSION['users_email'] = $row['users_email'];
    $_SESSION['users_role'] = $row['users_role'];
    
    
    
    $url .= '/members.php';    
}
else{
    
    $url .= '/login.php?error=true';
}
header("Location: $url");
exit;

?>
5.

Tóm lại, bạn có thể thấy việc xử lý vai trò người dùng trong một trang web dễ dàng như thế nào mà không phải tạo quá nhiều trang khác nhau. Hãy nhớ rằng, vì mục đích đơn giản, tôi chưa thêm bất kỳ bộ lọc hoặc vệ sinh nào cho đầu vào của người dùng. Đó chỉ là trách nhiệm của bạn về cách bạn muốn xử lý bảo mật trong trang web của mình.

Hy vọng bạn thích đọc cái này!

Là một nhà khoa học máy tính, tôi cố gắng tìm hiểu thêm hàng ngày trong lĩnh vực của mình. Tất cả mọi thứ tôi học được, tôi chia sẻ với cộng đồng của mình bằng cách viết các bài báo cho các tài liệu tham khảo trong tương lai.

Làm thế nào PHP có thể được sử dụng để kiểm soát quyền truy cập của người dùng?

ACL (Danh sách kiểm soát truy cập) là danh sách kiểm soát các quyền đối tượng, xác định người dùng nào có thể thực thi một tác vụ nhất định. Nó có thể được mở rộng thêm để chứa không chỉ người dùng, mà cả các nhóm người dùng. Đây là một khía cạnh quan trọng của bảo mật PHP và được sử dụng trong hầu hết các ứng dụng có kích thước trung bình và lớn.. It can be further extended to contain not only users, but also user groups. This is an important aspect of PHP security and is used in virtually all medium- and large-sized applications.

Làm cách nào để đặt quyền của người dùng trong PHP?

Thay đổi quyền cho tệp "test.txt":..
// Đọc và viết cho chủ sở hữu, không có gì cho mọi người khác.Chmod ("test.txt", 0600) ;.
// Đọc và viết cho chủ sở hữu, đọc cho mọi người khác.chmod ("test.txt", 0644) ;.
// Mọi thứ cho chủ sở hữu, đọc và thực hiện cho mọi người khác.Chmod ("test.txt", 0755) ;.

RBAC trong PHP là gì?

RBAC là một mô hình trong đó các vai trò được tạo ra cho các chức năng công việc khác nhau và các quyền để thực hiện các hoạt động nhất định sau đó được gắn với các vai trò.Người dùng có thể được chỉ định một hoặc nhiều vai trò hạn chế quyền truy cập hệ thống của họ vào các quyền mà họ đã được ủy quyền.a model in which roles are created for various job functions, and permissions to perform certain operations are then tied to roles. A user can be assigned one or multiple roles which restricts their system access to the permissions for which they have been authorized.

Chúng ta có thể sử dụng cơ sở dữ liệu truy cập trong PHP không?

Có, PHP có thể truy cập hầu như bất kỳ cơ sở dữ liệu nào có sẵn ngày hôm nay.Tôi đã nghe nói có thể truy cập Microsoft SQL Server từ PHP.. I heard it's possible to access Microsoft SQL Server from PHP.