2012-12-08 57 views
0

我有一個用PHP和MySQL設置的網站的用戶登錄系統。我的問題是我是否可以修改我現在擁有的,創建一個「權限」系統。換句話說,只顯示用戶和管理員的不同控件。在我的mysql表中,我有'id','username','password'列,以及'a','b'的ENUM'permissions'。 'a'是默認的(不是管理員)。下面我會告訴你我試過的東西。PHP&MySQL用戶登錄和權限系統

這個文件是「checklogin.php」在這個文件我檢查(爲節省空間的緣故,我將不添加所有的代碼)

//First I include variables to connect to the database & connect 
//Then I define username and password as $_POST from a form on an earlier page 
$user=a; 
$admin=b; 
$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword' and permissions='$user'"; 
$sqladmin="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword' and permissions='$admin'"; 
$result=mysql_query($sql); 
$resultadmin=mysql_query($sqladmin); 

$count=mysql_num_rows($result); 
$countadmin=mysql_num_rows($resultadmin); 

// If result matched $myusername and $mypassword, table row must be 1 row 
if($count==1){ 
// Register $myusername, $mypassword and redirect to file "login_success.php" 
session_register("myusername"); 
session_register("mypassword"); 
session_register("user"); 
header("location:login_success.php"); 
} 
else { 
    if($countadmin==1){ 
    session_register("myusername"); 
    session_register("mypassword"); 
    session_register("admin"); 
    header("location:login_success.php"); 
    } 
    else { 
    if($count==0) { 
     if($countadmin==0) { 
     echo "Wrong Username or Password"; 
     } 
    } 
    } 
} 

所以表中有多少行匹配用戶輸入以及它是否是管理員,如果有,那麼我使用用戶名,密碼和權限註冊一個會話。

接下來,我有一個文件「login_success.php

<?php 
session_start(); 
if(!session_is_registered(myusername)){ 
header("location:main_login.php"); 
} 
else { 
} 
?> 
<html> 
<body> 
Login Successful 

<?php 
if(session_is_registered(admin)){ 
echo "Welcome Admin!"; 
} 
else { 
echo "Not admin..."; 
} 
?> 

如果會話註冊上面簡單的代碼檢查,如果沒有,向您發送回登錄表單。下面是一段代碼,用於檢查用戶是否爲管理員。 這項工作的登錄部分我只是無法解決權限問題。

最後,我想我的問題是爲什麼這不起作用?這在邏輯上似乎是正確的。對不起,這篇冗長的文章。謝謝你的幫助。

回答

1

我會建議你的邏輯如下:如果用戶在他的一列中有「a」,那麼你就以不同的方式對待他。這意味着每個用戶仍然只有一行。一個唯一的會議。相同的數據結果。同一屆會議。但是基於列「權限」的價值是什麼,你在你的應用程序中打開了更多的「門」。你所要做的一切就是檢查他的會話的「許可」是否設置爲「a」或任何標識他爲管理員的身份。

希望這會有所幫助。 準則

+0

感謝您的意見。根據你的意思,我對他有不同的看法,我有點困惑。如果我查詢SELECT * FROM $ tbl WHERE用戶名='$用戶名'和密碼='$ mypassword'和權限='然後如果權限='b'那麼他不會出現 –

+1

每個用戶必須只有一個在你的表中記錄(行)。所以你做SELECT * FROM $ tbl WHERE username ='$ username'和password ='$ mypassword',這條記錄出來了。你認證他。接下來你會看到列權限中的值是什麼,並且基於你做了「if」語句來授予他行政權限。 – MAXIM

+0

謝謝你,這有一點幫助。我可以使用mysql_fetch_field讀取列中的值嗎? –

2

首先,您正在使用已棄用的session_register,session_is_registered。 Php手冊建議使用$_SESSIONsession_is_registered預計字符串,但你不通過字符串 - 它應該像session_is_registered("admin"),不session_is_registered(admin)

另外,我覺得你可以提高整個程序:從數據庫SELECT * FROM $tbl_name WHERE username='$myusername'

  1. 讀(假設$名爲myUsername妥善逃脫);
  2. 如果記錄不存在,則用戶名無效
  3. 檢查密碼(或從安全角度來看好得多的哈希表)是否與存儲值匹配。如果不是,您可能需要增加「failed_login_attempts」字段
  4. 然後檢查權限。我猜客戶可能有超過1個角色。
+0

對,在很多地方缺少引號...這是非常糟糕的編碼風格和'PHP'允許它的語法上的恥辱 –

+0

是的,這是一種從頭開始代碼......當我做沒有引號的session_is_registered(admin)是不是檢查以前宣佈的$管理員?我相信我能夠檢查權限,但是如何將這些權限信息存儲在多個頁面中?註冊會話?謝謝! –

+1

@ Denim Vallorosi:通常你會註冊會話,並在那裏存儲一些關於用戶的信息,所以你不必每次都查詢db。我更喜歡定義一個類,其中包含每個頁面上幾乎都需要的基本用戶數據字段(如用戶名,可能是電子郵件,頭像,角色等),以及該類在會話中的存儲和實例。許多其他人使用數組而不是類。 – a1ex07

2

首先,你是懶惰加上引號,例如在下面幾行:

$user=a; 
$admin=b; 
if(!session_is_registered(myusername)){ 

但我不知道這是個問題。

其次,您需要在使用會話之前致電session_start()

爲什麼你不做以下查詢?

SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword' 

然後,您可以讀取返回的權限,而不必重複您的複雜雙重查詢設置。 當然,你必須確保沒有重複的用戶名,但情況總是如此。

+0

我想我可以這樣做,但那也不是問題。我認爲我的問題在於註冊會話。有沒有辦法註冊權限,以便我可以在另一個頁面中讀取它?感謝您的回覆 –

+0

是的,你忘了使用'session_start()'。我之前沒有注意到這一點。另外,正如a1ex07所說,你應該使用'$ _SESSION'數組而不是'session_register()' – Pharaoh

+0

我用session_start(),我只是沒有在代碼中顯示它。抱歉。但我想我錯過了這個:權限如何被讀取?再次感謝! –