2010-10-17 4 views
0

Я работаю над скриптом авторизации , который проверяет имя пользователя, пароль и уровень доступа (роли). Он отлично работает, пока проверяется только одна роль.PHP array vs mysql query

Я хотел бы узнать, как я могу поместить роли в массив и проверить базу данных, присутствует ли какая-либо из них в базе данных для зарегистрированного пользователя. Сейчас он проверяет только одну роль.

Вопрос: Как построить и массивы для разрешенных ролей, а затем проверить, проверено ли какое-либо из них?

<?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'); 
       } 
      } 
     } 
    } 
} 

?> 

Спасибо!

ответ

2

Вы почти у цели. Вам просто нужно, чтобы преобразовать список разрешенных ролей из массива в строку:

$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

Вам нужно обернуть 'implode' с RTRIM как' RTRIM (Implode (...), «») '. В противном случае у вас будут запятые и ошибки MySQL. –

+0

@Chris 'implode' только вставляет текст« клей »* между * элементами, а не до/после. Решение работает как отправлено. – meagar

+0

Большое спасибо! Это именно то, что я хотел научиться делать. Мне пришлось посмотреть, что такое взрыв, и я рад, что сделал. – 2010-10-17 02:23:41