2016-09-07 97 views
0

我有下面的代碼來檢查登錄:我的系統不限制登錄,如果管理員

class User extends Password { 
private $_db; 
function __construct($db) { 
    parent::__construct(); 
    $this->_db = $db; 
} 
private function get_user_hash($user) { 
    try { 
    $stmt = $this->_db->prepare('SELECT admin_id, user, pass FROM boss WHERE user = :user AND type = "admin"'); 
    $stmt->execute(array('user' => $user)); 

    return $stmt->fetch(); 

    } catch(PDOException $e) { 
     echo '<p class="bg-danger">'.$e->getMessage().'</p>'; 
    } 
} 
public function login($user,$password) { 
    $row = $this->get_user_hash($user); 
    if($this->password_verify($password,$row['pass']) == 1) { 
     $_SESSION['loggedin'] = true; 
     $_SESSION['user'] = $row['user']; 
     return true; 
    } 
} 
public function logout() { 
    session_destroy(); 
} 
public function is_logged_in() { 
    if(isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true) { 
    return true; 
    } 
} 
} 
$user = new User($db); 

一切工作正常,問題是,我有內每兩個目錄「admin」和「用戶」是「相同的文件」與每個文件夾中是設置中的不同查詢的唯一區別:

管理:SELECT admin_id, user, pass FROM Boss WHERE user = :user AND type = "admin"

用戶:SELECT admin_id, user, pass FROM users WHERE user =:user AND type = "user"

當更改/管理員/用戶我的驗證碼(上面)應區分是否管理員。因爲它沒有,它會通過會話並繼續訪問,因爲檢查是這麼認爲的。

在每一頁上的 「私人」 我把以下內容:

if ($user-> is_logged_in()) {header ('Location: user-area.php');} 

我該怎麼辦?

如果您需要更多的代碼來找到解決方案,只需知道它。

我認爲這個問題是在功能函數「is_logged_in」,因爲它必須修改配置文件管理,否則檢查,如果管理爲例(不喜歡做的事):

public function is_logged_in_admin() { 
    if(isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true && $row['type'] == "admin") { 
    return true; 
    } 
} 

,然後檢查:if($user->is_logged_in_admin()){header('Location: index.php?ruta=panel');}

這將是很好,或者什麼是正確的方式?

+0

基於用戶ID你有一種方法知道它是否應該是管理員? – slopeofhope

+0

@slopeofhope是的。表「老闆」有一行爲「類型」(type =「admin」) – GePraxa

+0

那麼爲什麼不能做一個函數來檢查用戶是否是admin,並設置如下標誌$ _SESSION ['admin'] = True或者錯誤 – slopeofhope

回答

1

UPDATE:您使其更難那麼它必須是,所有你需要做的就是複製你的oringal用戶類,並進行以下更改

<?php 
include('password.php'); 
class Admin extends Password{ 
    private $_db; 
    function __construct($db){ 
     parent::__construct(); 
     $this->_db = $db; 
    } 
    private function get_user_hash($username){ 
     try { 
      $stmt = $this->_db->prepare('SELECT password, username, adminID FROM admin WHERE username = :username AND active="Yes" '); 
      //copy user table, name admin, change memberID to adminID 
      $stmt->execute(array('username' => $username)); 
      return $stmt->fetch(); 
     } catch(PDOException $e) { 
      echo '<p class="bg-danger">'.$e->getMessage().'</p>'; 
     } 
    } 
    public function login($username,$password){ 
     $row = $this->get_user_hash($username); 
     if($this->password_verify($password,$row['password']) == 1){ 
      $_SESSION['loggedin'] = true; 
      $_SESSION['username'] = $row['username']; 
      $_SESSION['adminID'] = $row['adminID']; //change to adminID 
      return true; 
     } 
    } 
    public function logout(){ 
     session_destroy(); 
    } 
    public function is_logged_in(){ 
     if(isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true){ 
      return true; 
     } 
    } 
} 
?> 

然後創建管理員一個完全獨立的登錄/註銷頁面只要。如果您需要檢查管理,其根本isset($_SESSION['adminID']),如果你需要檢查用戶的​​,如果你需要,看看他們是否已經登錄無論管理員或成員的isset($_SESSION['loggedin'])

這樣的99%的代碼可以轉換爲管理員端,只需根據會話中的ID來更改表格即可。

$table = 'user'; 

if(isset($_SESSION['memberID'])){ 
    $table = 'admin'; 
} 

作爲具有單獨登錄的附加好處,您可以輕鬆地爲不使用密碼的管理員創建用戶登錄功能。如果你使用相同的會話數據,這是不可能的。

+0

好的我正在測試和評論一次。 – GePraxa

+0

除非這只是管理員,那麼你可以忽略這一點......大聲笑 – ArtisticPhoenix

+0

不能得到它的工作,但可能會上升到GitHub不認爲你有時間檢查:( – GePraxa