2012-06-27 50 views
5

Tôi đã bắt đầu cải thiện kỹ năng OOP của mình, bằng cách giải quyết một số vấn đề khá dễ dàng hơn, khi xây dựng một trang web. Vì vậy, nó bắt đầu với một hệ thống đăng nhập, tôi đã theo một hướng dẫn trên youtube, điều đó đã giúp tôi tạo một lớp Đăng nhập, nhưng khi nó tiếp tục, nó đã gây ra nhiều nghi ngờ (btw. Mã này là 100 dòng vì vậy tôi sẽ chuyển nó). Vì vậy, trong lớp Đăng nhập này, có phương thức xác minh, v.v. nhưng đến điểm xác minh phiên, với trước khi tham số trong cấu trúc, nó không thể được sử dụng (ít nhất trong phạm vi lớp này):Thiết kế lớp học của hệ thống đăng nhập hướng đối tượng trong php

$this->_username = ($this->_login)? $this->filter($_POST['username']) : $_SESSION['username']; 
    $this->_password = ($this->_login)? $this->filter($_POST['password']) : ''; 
    $this->_passmd5 = ($this->_login)? md5($this->_password) : $_SESSION['password']; 

Vì vậy, trong trường hợp đó tôi không thể sử dụng phương thức verifySession(), khi không có biến phiên nào được đặt (để phân biệt người dùng đã đăng nhập nào sẽ thấy trên trang chính chẳng hạn). Vì vậy, câu hỏi của tôi là - đó là thiết kế đúng, và làm thế nào tôi nên xây dựng phần còn lại của hệ thống đăng nhập: đăng nhập xác minh trên mỗi trang và đăng xuất - nên mỗi người trong số họ được trong lớp riêng biệt (và những gì về phương pháp, mà lặp lại trong lớp học cụ thể, nên tôi luôn luôn kế thừa chúng). Tôi nhận ra rằng có những cách tiếp cận khác nhau để OOP, nhưng có bất kỳ cụ thể, rằng tôi nên làm theo như một người mới bắt đầu (mà sẽ giúp tôi hiểu oop tốt nhất của nó).

+0

Tôi hoàn toàn không hiểu những gì bạn yêu cầu ở đây (bạn có thể làm rõ điều đó không?), Nhưng nói chung: thường là một ý tưởng hay để làm theo các khái niệm và mô hình (thế giới thực) ban đầu với các lớp học của bạn. Một "Đăng nhập" không phải là một điều, nhưng một phiên và một người dùng được. – Niko

+0

Tôi đang tìm kiếm một mẫu ,, để xây dựng một hệ thống đăng nhập hướng đối tượng (đăng nhập, đăng xuất, veryfing nếu người dùng đăng nhập trên mỗi trang), và tôi không chắc liệu tất cả những thứ này có ở bên trong hay không đơn lớp – Malyo

Trả lời

3

"tôi đã làm theo hướng dẫn trên youtube" là vấn đề đầu tiên. Chỉ ba dòng mã bạn dán cho thấy video bạn xem được tạo bởi một nhà phát triển PHP nghiệp dư.

"Vì vậy, câu hỏi của tôi là - là thiết kế chính xác, và làm thế nào tôi nên xây dựng phần còn lại của hệ thống đăng nhập"

Vì chỉ có ba dòng được đăng, tôi không biết nếu thiết kế là đúng hay không. Tôi muốn cược rằng không phải là mặc dù.

Nguyên tắc chung khi sử dụng đối tượng là khi mã rõ ràng đủ cao để yêu cầu nhiều hơn hai hàm, sẽ được sử dụng ở nhiều vị trí trong ứng dụng và sẽ có tiềm năng đáng kể cho việc đặt tên xung đột nếu mã không được đóng gói trong một đối tượng hoặc không gian tên. Điều này không đáp ứng các tiêu chí đó - màn hình đăng nhập và đăng ký là một trang cho mỗi trang (tối đa) và do đó mã đó sẽ được sử dụng một lần. Không có lý do gì để đóng gói logic đó. Niko đã đề cập đến các lớp Session và User, đó là các mẫu phổ biến và các kiểu được chấp nhận để đóng gói.

Để xây dựng hệ thống đăng nhập, chúng trở nên phức tạp nhanh chóng và gần như là một chuyên môn trong những ngày này.Tôi khuyên bạn nên đọc bài viết SO wiki sau:

The definitive guide to form-based website authentication

Nếu bạn muốn có một hệ thống đóng gói sẵn mà sau bài viết wiki ở trên, bạn có thể xem xét:

http://barebonescms.com/documentation/sso/

Client SSO doesn' t trình bày các lớp vào ứng dụng - chỉ là một tập hợp các hàm như SSO_LoggedIn(), SSO_Login(), SSO_Logout(), vv. Làm OOP chỉ để làm OOP khi một cái gì đó đơn giản hơn là đủ để viết sai phần mềm. Đôi khi chức năng tốt hơn. Đôi khi inlining mã là tốt hơn. Nó thực sự phụ thuộc và phải mất nhiều năm kinh nghiệm để có cái nhìn sâu sắc về những gì sẽ là cách tiếp cận tốt nhất.

+0

cảm ơn điều đó thực sự hữu ích và xin lỗi vì câu hỏi không đủ chính xác, nó sẽ đòi hỏi nhiều mã để làm cho nó đủ chính xác. – Malyo

4

Tôi không chắc chắn bạn thực sự muốn một lớp "đăng nhập". Bạn có thể làm như thế này somehting

class User 
{ 
    private $username; 
    private $password; 

    public function __construct($username) 
    { 
    //load this user object here 
    } 

    private function hashPassword($password) 
    { 
     ///Dont do this has the hash, but im just keeping it simple 
     return md5($password . 'a}{[email protected]#' . $this->username); 

    } 

    public function authenticate ($password) 
    { 
     return $this->hashPassword($password) == $this->password; 
    } 

} 

login.php

$user = new User($_POST['username']); 
if($user->authenticate($_POST['password'])) 
{ 
//do session initilization here (can be a class, or whatever) 
Session::createUserSession($user) 
} 
else 
echo 'bad login'; 

logout.php

Session::destroyUserSession(); 

Thiết kế này có lẽ không phải là cách tốt nhất, nhưng có thể cung cấp cho bạn một ý tưởng.

+0

Ye đó là lý do tại sao tôi đang đấu tranh, có rất nhiều cách để giải quyết điều này, nhưng tôi không thể quyết định cách nào để đi. – Malyo

0

$_SESSION['password']

Nó không bao giờ nên cần thiết để lưu trữ mật khẩu (plain text?) Trong một phiên. Bạn nên kiểm tra xem người dùng có được phép đăng nhập không và nếu anh ta có và cung cấp mật khẩu chính xác, bạn không lưu trữ nhiều hơn trong phiên hơn là "đã đăng nhập". Để thuận tiện, bạn có thể lưu trữ tên người dùng của id người dùng.

Nhưng một mật khẩu là không cần thiết sau khi bạn so sánh nó với một trong các cơ sở dữ liệu.

Các vấn đề liên quan