php - 如何使用在不同表中注册的用户创建具有访问级别的登录系统?
问题描述
我想知道如何创建具有访问级别的 php 登录系统,但用户在不同的 SQL 表中注册。前段时间,我做了一个登录系统,也有访问级别,但是用户注册在一个表中,也就是说,使他们与众不同的是我在表中创建的一个名为“id_permissoes”的字段。
这是您使用的代码:
<?php
// Initialize the session
session_start();
// Verifica se não há a variável da sessão que identifica o usuário
if ($_SESSION['nivelAcesso'] == 1) {
// Redireciona o visitante de volta pro login
header("Location: admin");
}
if ($_SESSION['nivelAcesso'] == 2) {
// Redireciona o visitante de volta pro login
header("Location: co");
}
if ($_SESSION['nivelAcesso'] == 3) {
// Redireciona o visitante de volta pro login
header("Location: cc");
}
// Include config file
require_once "config.php";
// Inicializa variáveis
$email = $password = "";
$email_err = $password_err = "";
// Processing form data when form is submitted
if(isset($_REQUEST["submit"])){
// Verifica e-mail vazio
if(empty(trim($_REQUEST["email"]))){
$email_err = "Introduza o seu email.";
} else{
$email = trim($_REQUEST["email"]); // trim -retira espaços no princípio ou fim da string
}
// Verifica password vazia
if(empty(trim($_REQUEST["password"]))){
$password_err = "Introduza a sua password.";
} else{
$password = trim($_REQUEST["password"]); // trim -retira espaços no princípio ou fim da string
}
// Valida credenciais
if(empty($email_err) && empty($password_err)){
// Prepara select statement
$stmt = $pdo->prepare("SELECT id_admin, nome, apelido, email, password, id_permissoes, primeiro_acesso FROM administradores WHERE email = :email");
if($stmt){
// Faz o bind das variáveis com os parametros do statement
$stmt->bindParam(":email", $param_email);
// Set parameters
$param_email = trim($_REQUEST["email"]);
// Executa o statement
if($stmt->execute()){
// Verifica se o email existe na base de dados. Se sim, valida a password
if($stmt->rowCount() == 1){
if($row = $stmt->fetch()){
$id = $row["id_admin"];
$email = $row["email"];
$nome = $row["nome"];
$apelido = $row["apelido"];
$permissoes = $row["id_permissoes"];
$primeiro_acesso = $row["primeiro_acesso"];
// $hashed_password = $row["password"];
if($password===$row["password"]){
// if(password_verify($password, $hashed_password)){
// Password correta, inicia sessão
if (!isset($_SESSION)) session_start();
// Guardar autenticação em variáveis de sessão
$_SESSION["id"] = $id;
$_SESSION["email"] = $email;
$_SESSION["nome"] = $nome;
$_SESSION["nivelAcesso"] = $permissoes;
$_SESSION["apelido"] = $apelido;
$_SESSION["primeiro_acesso"] = $primeiro_acesso;
// Redireccionar para a página de acolhimento
if(isset($_SESSION['destino']) && $_SESSION['destino'] != "") {
header("Location: ".$_SESSION['destino']);
}else{
if($_SESSION["nivelAcesso"] == "1"){
header("Location: admin");
}elseif($_SESSION["nivelAcesso"] == "2"){
header("Location: co");
}else{
header("Location: cc");
}
}
} else{
// Mensagem de erro, caso password errada
$password_err = "A password que introduziu não é válida.";
}
}
} else{
// Mensagem de erro, caso user não exista
$email_err = "Email não existente.";
}
} else{
echo "Oops! Alguma coisa correu mal aqui.";
}
}
// Close statement
unset($stmt);
}
// Close connection
unset($pdo);
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>CC | BackOffice</title>
<!-- Tell the browser to be responsive to screen width -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Font Awesome -->
<link rel="stylesheet" href="plugins/fontawesome-free/css/all.min.css">
<!-- Ionicons -->
<link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<!-- icheck bootstrap -->
<link rel="stylesheet" href="plugins/icheck-bootstrap/icheck-bootstrap.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="dist/css/adminlte.min.css">
<!-- Google Font: Source Sans Pro -->
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">
</head>
<body class="hold-transition login-page">
<div class="login-box">
<div class="login-logo">
<a href="#"><b>CC</b>BackOffice</a>
</div>
<!-- /.login-logo -->
<div class="card">
<div class="card-body login-card-body">
<p class="login-box-msg">Digite os seus dados para iniciar sessão</p>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<div class="form-group" <?php echo (!empty($email_err)) ? 'has-error' : ''; ?>">
<label>email</label>
<input class="au-input au-input--full" type="text" name="email" placeholder="email" value="<?php echo $email; ?>" autofocus>
<span style="color:red;" class="help-block"><?php echo $email_err; ?></span>
</div>
<div class="form-group" <?php echo (!empty($password_err)) ? 'has-error' : ''; ?>">
<label>Password</label>
<input class="au-input au-input--full" type="password" name="password" placeholder="Password">
<span style="color:red;" class="help-block"><?php echo $password_err; ?></span>
</div>
<div class="login-checkbox">
<label align="right">
<a href="https://m.me/filipengine">Problemas no acesso?</a>
</label>
</div>
<button class="au-btn au-btn--block au-btn--green m-b-20" type="submit" name="submit">Entrar</button>
</form>
</div>
<!-- /.login-card-body -->
</div>
</div>
<!-- /.login-box -->
<!-- jQuery -->
<script src="plugins/jquery/jquery.min.js"></script>
<!-- Bootstrap 4 -->
<script src="plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- AdminLTE App -->
<script src="dist/js/adminlte.min.js"></script>
</body>
</html>
但是,现在需要创建 3 个不同的表来分隔用户类型。
如何进行此验证?
我试图测试一些 if(如果它不存在于一个表中,则在另一个表中获取),但不能。
你能帮助我吗?
谢谢!
解决方案
我不确定 100% 你在问什么,我理解的是你要求将用户重定向到他们的角色页面。
我曾经在带有 switch 语句的项目中尝试过
- 在您的用户表中创建一个列调用角色,然后添加如下角色:
- 角色 = 1 是管理员
- 角色 = 2 是员工
- role = 3 是普通用户
- 角色 = 0 未经验证
比将用户重定向到您获得成功的位置并像这样设置会话变量。
$_SESSION['role'] = $role;
$role = intval($row['role']);
switch ($role){
case 0:
header("location: ../user/?log=activation");
break;
case 1:
header("location: ../admin/index.php");
break;
case 2:
header("location: ../Upanel/");
break;
case 3:
header("location: ../Upanel/");
break;
}
希望这会给你一个想法。
我真的不明白登录 2 表是什么意思 :)
编辑:重定向用户登录他们的类型:
使用 3 个表登录在您的 login.php 中添加一个简单的条件,如下所示
$(function(){
// bind change event to select
$('#dynamic_select').on('change', function () {
var url = $(this).val(); // get selected value
if (url) { // require a URL
window.location = url; // redirect
}
return false;
});
});
<select id="dynamic_select">
<option value="" selected>Please select login type</option>
<option value="teacherLogin.php">Teacher</option>
<option value="studentLogin.php">Student</option>
<option value="adminLogin.php">Admin</option>
</select>
推荐阅读
- javascript - 只运行一次 useEffect
- webpack - Webpack:NextJS:仅生成哈希类名
- c++ - 如何在图像上应用自定义过滤器?
- javascript - 如何使用 material-bottom-tabs (React Native) 导航到另一个选项卡的屏幕?
- r - 使用 R 直接从网站读取 HTML 表格
- javascript - 使用jquery单击功能时如何修复其他元素重置为默认值
- python - 如何从数据框中的值中删除 b'
- reactjs - 使用 concat 而不是 push in redux
- java - 龙目岛与 SuperBuilder
- python - 循环列表项的位置