php - 普通用户和管理员的页面限制
问题描述
好吧,在我用于练习的小网站上,我创建了页面,我从数据库中的表中保存了我的数据,而且,我有普通用户和管理员。我通过我的 sql 创建了管理员,我可以通过页面上的注册表单创建一个普通用户。我想要做的是,正如我所说,我有一个页面,我从表中保存了我的数据,我想让用户无法看到该页面,而管理员可以看到该页面。我只想做出这些限制。但是,我不知道如何从代码中开始,我将在这里发布我认为你需要帮助我的代码,所以,如果你需要更多的东西,我就在这里!
登录.php:`
<?php include('functions.php') ?>
<!DOCTYPE html>
<html>
<head>
<title>Prijavi se</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div class="header">
<h2>Prijavi se</h2>
</div>
<form method="post" action="login.php">
<?php echo display_error(); ?>
<div class="input-group">
<label>Korisnicko ime</label>
<input type="text" name="username" >
</div>
<div class="input-group">
<label>Lozinka</label>
<input type="password" name="password">
</div>
<div class="input-group">
<button type="submit" class="btn" name="login_btn">Prijavi se</button>
</div>
<p>
Jos uvek nemate nalog? <a href="register.php">Registruj se</a>
</p>
</form>
`
函数.php:`
$db = mysqli_connect('localhost', 'root', '', 'it210projekat');
$username = "";
$email = "";
$errors = array();
if (isset($_POST['register_btn'])) {
register();
}
if (isset($_POST['login_btn'])) {
login();
}
if (isset($_GET['logout'])) {
session_destroy();
unset($_SESSION['user']);
header("location: ../login.php");
}
function register(){
global $db, $errors;
$username = e($_POST['username']);
$email = e($_POST['email']);
$password_1 = e($_POST['password_1']);
$password_2 = e($_POST['password_2']);
if (empty($username)) {
array_push($errors, "Unesite ime");
}
if (empty($email)) {
array_push($errors, "Unesite email");
}
if (empty($password_1)) {
array_push($errors, "Unesite lozinku");
}
if ($password_1 != $password_2) {
array_push($errors, "Lozinke se ne poklapaju");
}
if (count($errors) == 0) {
$password = md5($password_1);
if (isset($_POST['user_type'])) {
$user_type = e($_POST['user_type']);
$query = "INSERT INTO users (username, email, user_type, password)
VALUES('$username', '$email', '$user_type', '$password')";
mysqli_query($db, $query);
$_SESSION['success'] = "Uspesno ste napravili nalog!!";
header('location: login.php');
}else{
$query = "INSERT INTO users (username, email, user_type, password)
VALUES('$username', '$email', 'user', '$password')";
mysqli_query($db, $query);
$logged_in_user_id = mysqli_insert_id($db);
$_SESSION['user'] = getUserById($logged_in_user_id);
$_SESSION['success'] = "Uspesno ste se prijavili";
header('location: login.php');
}
}
}
function getUserById($id){
global $db;
$query = "SELECT * FROM users WHERE id=" . $id;
$result = mysqli_query($db, $query);
$user = mysqli_fetch_assoc($result);
return $user;
}
function login(){
global $db, $username, $errors;
$username = e($_POST['username']);
$password = e($_POST['password']);
if (empty($username)) {
array_push($errors, "Username is required");
}
if (empty($password)) {
array_push($errors, "Password is required");
}
if (count($errors) == 0) {
$password = md5($password);
$query = "SELECT * FROM users WHERE username='$username' AND password='$password' LIMIT 1";
$results = mysqli_query($db, $query);
if (mysqli_num_rows($results) == 1) {
$logged_in_user = mysqli_fetch_assoc($results);
if ($logged_in_user['user_type'] == 'admin') {
$_SESSION['user'] = $logged_in_user;
$_SESSION['success'] = "Uspesno ste se prijavili";
header('location: pocetna.php');
}else{
$_SESSION['user'] = $logged_in_user;
$_SESSION['success'] = "Uspesno ste se prijavili";
header('location: pocetna.php');
}
}else {
array_push($errors, "Pogresno korisnicko ime ili lozinka");
}
}
}
function isLoggedIn()
{
if (isset($_SESSION['user'])) {
return true;
}else{
return false;
}
}
function isAdmin()
{
if (isset($_SESSION['user']) && $_SESSION['user']['user_type'] == 'admin' ) {
return true;
}else{
return false;
}
}
function e($val){
global $db;
return mysqli_real_escape_string($db, trim($val));
}
function display_error() {
global $errors;
if (count($errors) > 0){
echo '<div class="error">';
foreach ($errors as $error){
echo $error .'<br>';
}
echo '</div>';
}
}
?>`
我在页面顶部有这个,我想对普通用户进行限制:
<?php if (isset($_SESSION['success'])) : ?>
<div class="error success" >
<h3>
<?php
echo $_SESSION['success'];
unset($_SESSION['success']);
?>
</h3>
</div>
<?php endif ?>
<div class="profile_info">
<div>
<?php if (isset($_SESSION['user'])) : ?>
<strong><?php echo $_SESSION['user']['username']; ?></strong>
<?php endif ?>
</div>
</div>
</div>
解决方案
在您的函数文件中,您正在$_SESSION['user']
为用户设置数据库行中的数据;这意味着您只需要检查是否$_SESSION['user']['user_type']
是管理员。
所以,很简单,在您只希望管理员看到的页面上(在顶部,在您的functions.php
呼叫下方),执行以下操作:
if($_SESSION['user']['user_type'] != 'Admin') {
//could redirect page here
die('This page is not available to non-administrators.');
}
我注意到您的登录/注册代码中还有其他一些问题。
- 1)永远不要使用 md5()作为密码,它被认为和明文一样糟糕。相反,使用
password_hash()
和password_verify()
PHP 函数。 - 2) 你的 mysql 查询有受到 SQL 注入攻击的风险,你应该将它们转换为参数化查询。
推荐阅读
- flutter - 如何在显示小部件时自动播放音频文件
- php - img 的来源:PHP 网站(VSCode 和 XAMPP)中的“/images/...”与“images/...”
- angular - 使用 Angular 前端部署 .NETCore API 时出错 - HTTP 错误 500.0 - ANCM 进程内处理程序加载失败
- android - 在一个查询中从两个表中删除而不加入
- git - 如何在 jenkins 多分支脚本管道中获取最新的 git 提交作者姓名或消息并在分支条件下使用
- javascript - 将值分配给计算属性 vuejs
- r - 如何在 R 中整个 data.frame 列的函数之间使用?
- python - Ebay 令牌和 GetDealItems API 调用问题
- java - 如何从java中的数组列表生成二维码并存储到数据库?
- laravel - Laravel [ErrorException] hash_file():读取 8192 字节失败,errno=13 权限被拒绝,Windows 操作系统