2010-05-06 7 views
5

Đây là kịch bản:Một số cách để xác định người dùng đã đăng nhập trên web là gì?

Có 5 trang web (tên miền khác nhau) cần chia sẻ phiên. Tôi đang sử dụng một chút mã trên mỗi trang web trả về một hình ảnh "blank.gif" và đồng thời đặt phiên (đồng bộ hóa nó lên đến phiên hiện tại). Mỗi trang web gọi một phiên-img từ mỗi trang web khác. Ngoài ra, tất cả các trang web đều có quyền truy cập vào cùng một cơ sở dữ liệu (nơi phiên được lưu trữ). Điều này hoạt động tốt trên FF và Chrome, nhưng không hoạt động trên IE (hoặc Safari PC) ...

Tôi cần phải đưa ra một phương pháp thay thế để giữ cho phiên hoạt động? Ứng dụng này là một CMS tùy chỉnh nhỏ, vì vậy thực sự chỉ có 2-3 người sẽ sử dụng nó.

tôi có lẽ có thể xác định thông tin đăng nhập người dùng bằng IP và sau đó tiếp tục kiểm tra các IP accross tất cả các trang web ...

Có một cái gì đó như hạt nhiều hơn như một uuid máy tính mà tôi có thể kiểm tra?

+5

Nếu đó là cùng một phiên, tại sao bạn không chỉ chuyển ID phiên như một tham số GET khi người dùng di chuyển từ trang này sang trang khác? – Daff

+0

không, không có gì giống như "máy tính uuid". –

+0

Daff, bệnh cho rằng một thử, tôi thực sự chỉ cần có một tham số trong URL khi người dùng quản trị được đăng nhập ... – farinspace

Trả lời

1

Nếu đó là cùng một phiên, tại sao bạn không bạn chỉ cần chuyển các ID phiên như một tham số GET khi người dùng di chuyển từ trang này sang trang khác? - @Daff

@Daff, nếu bạn thêm câu trả lời của bạn ở đây, tôi sẽ sửa đổi và chọn nó như là câu trả lời

-2

Bạn có thể ghi đè trình xử lý phiên để làm cho nó lưu dữ liệu phiên trong cơ sở dữ liệu được chia sẻ bởi các trang web khác nhau của bạn. Sau đó, bạn phải đặt cookie phiên có cùng ID phiên trên mỗi máy chủ. Bạn sẽ phải sử dụng session_set_save_handler và làm một cái gì đó như thế:

/** 
* @desc function used to open sessions 
* @param string session path 
* @param string session id 
* @return bool 
*/ 
function xx_session_open($path, $id){ 
    return true; 
} 

/** 
* @desc used when closing a session 
* @return bool 
*/ 
function xx_session_close(){ 
    return true; 
} 

/** 
* @desc saves session data 
* @param string session id 
* @param string session data 
* @uses xx_crypt 
* @return bool 
* @global object PDO instance 
*/ 

function xx_session_write($id, $data){ 
    global $db; 
    $crypted = xx_crypt($data); 
    // Saves data into db 
    $sql = 'REPLACE INTO sessions (`ID`, `data`, `lastUsed`, `IV`) VALUES(:id, :data, NOW(), :iv)'; 
    $sth = $db->prepare($sql); 
    $sth->execute(array(':id'=>$id, ':data'=>$crypted[0], ':iv'=>$crypted[1])); 
    return true; 
} 

/** 
* @desc gets session data 
* @param string session ID 
* @return string 
* @global object PDO instance 
* @uses xx_decrypt 
*/ 
function xx_session_read($id){ 
    global $db; 
    $sql = 'SELECT `data`, `IV` FROM sessions WHERE `ID`=:id'; 
    $sth = $db->prepare($sql); 
    $sth->execute(array(':id'=>$id)); 
    list($crypted, $iv) = $sth->fetch(); 
    $data = xx_decrypt($crypted, $iv); 
    return $data; 
} 

/** 
* @desc destroys a session 
* @param string session ID 
* @return bool 
* @global object PDO instance 
*/ 
function xx_session_destroy($id){ 
    global $db; 
    $sql = 'DELETE FROM sessions WHERE `ID`=:id'; 
    $sth = $db->prepare($sql); 
    $sth->execute(array(':id'=>$id)); 
    return true; 
} 

/** 
* @desc delete old sessions 
* @param int session lifetime (in seconds) 
* @return bool 
* @global object PDO instance 
*/ 
function xx_session_gc($lifetime){ 
    global $db; 
    $sql = 'DELETE FROM sessions WHERE `lastUsed` < :limit'; 
    $sth = $db->prepare($sql); 
    $sth->execute(array(':limit'=>date('Y-m-d H:i:s',time() - $lifetime))); 
    return true; 
} 

// Set session handler 
session_set_save_handler("xx_session_open", "xx_session_close", "xx_session_read", "xx_session_write", "xx_session_destroy", "xx_session_gc"); 

Nếu tất cả các bạn muốn là một Single Sign On cơ chế, bạn có thể kiểm tra Kerberos giao thức được làm cho điều đó.

+0

đây là khá nhiều những gì im đã làm ... vấn đề im có là đi qua phiên để các tên miền mới, tôi đã cố gắng vượt qua một hình ảnh ẩn cho tất cả các trang web khác nhau, nhưng không làm việc trong IE8 được chính xác – farinspace

+0

Sau đó, các cách dễ nhất để làm điều đó là những gì bạn đã làm với hình ảnh của mình: mỗi lần bạn tạo id phiên, bạn phải tạo một trang web gọi tập lệnh tên miền khác với id phiên làm tham số để cho các tập lệnh đó tạo cookie phiên của họ đúng id. – Arkh

2

Mọi thứ có thể thực hiện điều này có thể mà không có sự hợp tác của người dùng sẽ là một lỗi liên quan đến quyền riêng tư và ẩn danh của người dùng mà cuối cùng sẽ được khắc phục. Các trang web không được coi là để có thể tìm hiểu những trang web khác mà người dùng đã và những gì anh ta đã làm ở đó.

+1

Nói điều đó với facebook !!! – Pierreten

+0

Thực tế, hãy nói với bất cứ ai sử dụng google analytics hoặc adsense hoặc bất kỳ plugin nhúng nào khác. – Arkh