2010-10-17 7 views
0

Je travaille sur un script d'autorisation qui vérifie le nom d'utilisateur, le mot de passe et le niveau d'accès (rôles). Cela fonctionne bien tant qu'il n'y a qu'un seul rôle à vérifier.PHP array vs mysql query

Je voudrais apprendre comment je peux mettre les rôles dans un tableau et faire vérifier la base de données si l'un d'entre eux sont présents dans la base de données pour l'utilisateur connecté. En ce moment, il vérifie seulement un rôle.

Comment est-ce que je construis et tableau pour les rôles autorisés et ai alors la recherche vérifient si n'importe lequel d'entre eux est une correspondance?

<?php 
// allowed roles 
$allowedRoles = 'role1'; 

// needs to be like: 
$allowedRoles = array('role1','role2','role3','etc.'); 

//------------------------------------------------------------ 
// instantiate sessions 
//------------------------------------------------------------ 
if (!isset($_SESSION)) { 
    session_start(); 
} 

//------------------------------------------------------------ 
// define auth variables 
//------------------------------------------------------------ 
$first_pass = 0; // sessions 
$second_pass = 0; // password 
$third_pass = 0; // role 

//------------------------------------------------------------ 
// check if sessions exist and are valid 
//------------------------------------------------------------ 
if(!empty($_SESSION['UserName']) && !empty($_SESSION['Password']) && !empty($_SESSION['LoggedIn']) && $_SESSION['LoggedIn'] == 1) 
{ 
    // FIRST PASS OK! 
    $first_pass = 1; 
    echo 'PASSED: 1st '; 
} 

if($first_pass == 1) 
{ 
    //------------------------------------------------------------ 
    // include db connection 
    //------------------------------------------------------------ 
    require_once('../../connections/mysql.php'); 

    // set variables 
    $session_un = $_SESSION['UserName']; 
    $session_pw = $_SESSION['Password']; 

    // DB QUERY: check username SESSION credential against db 
    // ------------------------------------------------------------------ 
    $session_auth = mysqli_query($conn, "SELECT UserId, UserName, Password FROM users WHERE UserName = '$session_un' AND IsApproved = 1 AND IsLockedOut = 0 LIMIT 1") 
    or die($dataaccess_error); 
    // ------------------------------------------------------------------ 

    if(mysqli_num_rows($session_auth) == 1) 
    { 
     $row = mysqli_fetch_array($session_auth); 
     $auth_UserId = $row['UserId']; 
     $auth_Password = sha1(sha1($row['Password'])); 

     // if passwords match 
     if($auth_Password == $session_pw) 
     { 
      // SECOND PASS OK! 
      $second_pass = 1; 
      echo 'PASSED: 2nd '; 

      if($second_pass == 1) 
      { 
       // DB QUERY: check ROLE credentials in db 
       // ------------------------------------------------------------------ 
       $auth_roles = mysqli_query($conn, "SELECT UserId, RoleId, RoleName FROM users_in_roles WHERE UserId IN ($auth_UserId) AND RoleName IN ('$allowedRoles')") 
       or die($dataaccess_error); 
       // ------------------------------------------------------------------ 

       if(mysqli_num_rows($auth_roles) > 0) 
       { 
        // THIRD PASS OK! 
        $third_pass = 1; 
        echo 'PASSED: 3rd '; 
       } 
       else 
       { 
        // redirect back to login page 
        header('Location: ../../login.php'); 
       } 
      } 
     } 
    } 
} 

?> 

Merci!

Répondre

2

Vous y êtes presque. Vous avez juste besoin de convertir votre liste de rôles autorisés à partir d'un tableau dans une chaîne:

$allowedRoles = "'" . implode("', '", $allowedRoles) . "'"; 

$auth_roles = mysqli_query($conn, "SELECT UserId, RoleId, RoleName FROM users_in_roles WHERE UserId IN ($auth_UserId) AND RoleName IN ($allowedRoles)") 
+0

Vous devez envelopper votre 'implode' avec rtrim comme' rtrim (imploser (...), « ») '. Sinon, vous aurez des virgules et des erreurs MySQL. –

+0

@Chris 'implode' n'insère que le texte 'colle' entre * éléments, pas avant/après. La solution fonctionne comme posté. – meagar

+0

Merci beaucoup! C'est exactement ce que je voulais apprendre à faire. J'ai dû chercher ce qu'est l'implosion et je suis content de l'avoir fait. –