2011-10-12 28 views
7

Tôi làm cách nào để đăng ký với CakePHP?Tôi làm cách nào để xác nhận đăng ký thành viên?

Sau khi đăng ký, nó sẽ gửi email để xác nhận.

Nếu tôi nhấp vào liên kết để xác nhận thì tài khoản sẽ được xác nhận.

Tôi làm cách nào để thực hiện việc này?

Có chức năng nào với Auth để thực hiện điều đó không?

Hoặc tôi có phải gửi thư theo cách thủ công để xác nhận đăng ký không?

Nếu tôi phải gửi email theo cách thủ công để xác nhận đăng ký, thì làm cách nào để tạo mã thông báo đăng ký và cách đặt thời gian làm mã thông báo hợp lệ?

Có ai có thể hiển thị ví dụ về điều này không?

+0

Google nói: http://www.jonnyreeves.co.uk/2008/06/cakephp-activating-user-account-via-email/ – Josh

Trả lời

4

Kiểm tra nguồn của trình cắm của Người dùng phát triển bánh, trong đó có sẵn cho CakepPHP 1.3 và 2.0. https://github.com/cakedc/users Nó đã làm mọi thứ - theo cách thích hợp của MVC và CakePHP - mà bạn yêu cầu. Chỉ cần sử dụng plugin hoặc lấy một số mã.

+0

Tôi không chắc chắn làm thế nào để sử dụng plugin đó, tôi đã có một users_controller với thêm, chỉnh sửa, xóa, đăng nhập, hành động đăng xuất. Ngoài ra còn có một mô hình người dùng. Sau đó, nếu tôi chạy lệnh này, bánh di chuyển tất cả người dùng -plugin, điều gì sẽ xảy ra? – shibly

+0

Làm theo hướng dẫn trong tệp readme.md. Bạn có thể sử dụng lược đồ bánh để nhập giản đồ cơ sở dữ liệu hoặc sử dụng di chuyển bánh yêu cầu plugin di chuyển. Nếu bạn đã có một cái gì đó bắt đầu lại và sử dụng các plugin, nó được kiểm tra đầy đủ (chạy các bài kiểm tra), và mở rộng nó. Điều này cũng được giải thích trong readme.md – burzum

+0

Plugin đó có hoạt động với CakePHP-2.0 không? – shibly

2

Bạn có thể dễ dàng tạo mã băm giống như mã thông báo trong PHP và xác thực thời lượng của nó bằng Dấu thời gian. Đối với email, chỉ cần sử dụng thành phần Email như thế này. Nếu bạn muốn sử dụng Thành phần Auth, hãy đảm bảo rằng biểu mẫu của bạn cung cấp cho bạn mã băm chính xác cho mật khẩu.

function register() { 
    $error = false; 
    $error_captcha = null; 
    if(isset($this->data)){ 
     App::import('Component','Generate'); 
     App::import('Component', 'Converter'); 
     App::import('Component','Email'); 
     if(empty($this->data['User']['password'])||strlen($this->data['User']['password'])<5){ 
      $this->User->invalidate("password"); 
      $error = TRUE; 
     } 
     if($this->data['User']['password']<>$this->data['Temp']['password']){ 
      $this->User->invalidate("seotitle"); 
      $error = TRUE; 
     }  
     $captcha_respuesta = recaptcha_check_answer ($this->captcha_privatekey, 
     $_SERVER["REMOTE_ADDR"], 
     $_POST["recaptcha_challenge_field"], 
     $_POST["recaptcha_response_field"]); 
     if ($captcha_respuesta->is_valid && !$error) { 
     $this->data['User']['coderegistration'] = $this->generate->getUserCode(); 
     $this->data['User']['displayname'] = $this->data['User']['firstname'] . " " . $this->data['User']['lastname']; 
     $this->data['User']['seotitle'] = $this->converter->seotitle($this->data['User']['username']); 
     $this->data['User']['password'] = md5($this->data['User']['username'].$this->data['User']['password']); 
     $this->User->id = NULL; 
     if($this->User->save($this->data)){ 
      /* 
      ========================= 
      send email notification 
      ========================= 
      */ 
      $email = $this->data['User']['email'];    
      $content = sprintf('<a href="%s/%s">here</div>', $this->url, $this->data['User']['coderegistration']); 
      $this->email->to = $email; 
      $this->email->subject = 'you have been registered, please confirm'; 
      $this->email->replyTo = '[email protected]'; 
      $this->email->from = "name <[email protected]>";     
    $this->email->template = 'notification'; 
      $this->email->sendAs = 'html'; 
     $this->set('value', $content); 
     if($this->email->send()){ 
       // OK     
     }else{ 
      trigger_error("error Mail"); 
     } 
     } 




     }else{ 
      $error_captcha = $captcha_respuesta->error; 
      $this->set('error_email',true); 
     } 



    } 
    $this->setTitlePage(); 
    $this->layout = "home"; 
    $this->set('backurl', '/'); 
    $this->set('posturl',''); 
    $this->set('captcha_publickey',$this->captcha_publickey); 

    } 
+0

Bạn có thể giải thích mã của mình không? – shibly

+0

Nó sẽ gửi một email sau khi đăng ký với Mã được tạo. Bạn chỉ có thể thêm một trường vào Bảng Người dùng, mã, emailauthentificated và được tạo.Khi người dùng truy cập vào xác nhận liên kết, cakephp nhận mã và kiểm tra xem người dùng có tồn tại hay không, nếu dấu thời gian được tạo không quá cũ và chỉ cần đặt trường emailauthentificated thành True. – papachan

3

bảng người dùng:

CREATE TABLE IF NOT EXISTS `users` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `username` varchar(255) COLLATE utf8_persian_ci NOT NULL, 
    `password` varchar(255) COLLATE utf8_persian_ci NOT NULL, 
    `email` varchar(100) COLLATE utf8_persian_ci NOT NULL, 
    `created` datetime NOT NULL, 
    `status` tinyint(1) NOT NULL, 
    `activation_code` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `email` (`email`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=4 ; 

khi người dùng đăng ký, u có thể thiết lập một chuỗi duy nhất (ví dụ: md5 (time()) hoặc bất cứ điều gì ...) trong lĩnh vực activation_code. nay gửi email như url này cho người sử dụng:

http://test/controller/action/activation_code 

bây giờ bạn phải kiểm tra trong hành động của bạn mà activation_code này là trong bảng người dùng hay không.

và nếu đó là trạng thái = vô hiệu hóa hoặc không ....

2

để gửi email tải thành phần email cũng. Chức năng đăng ký đã cho là tốt và bạn nên đi với điều đó.

khái niệm cơ bản là thêm người dùng, sau đó tạo mã thông báo (Với dấu thời gian ro bất kỳ) và lưu vào cơ sở dữ liệu, sau đó gửi email có liên kết đến mã thông báo đó.

Sau đó, khi người dùng nhấp vào liên kết đến mã thông báo bạn đặt người dùng = hoạt động và họ hiện đã đăng ký và có thể đăng nhập.

Một mẹo hay cho Auth của bạn là thêm "phạm vi" (hãy kiểm tra tài liệu CakePHP cho 1.3) để xác thực. Làm cho phạm vi này là condtion active = 1. Vì vậy, theo cách đó, chúng sẽ cần phải được xác nhận từ liên kết email, và không bao giờ có thể đăng nhập cho đến khi điều này được thực hiện. Dễ dàng!

+0

Giả sử một người đã yêu cầu đăng ký bằng "tên người dùng", vì vậy tên người dùng và mã xác thực relavent được lưu vào bảng cơ sở dữ liệu. Bây giờ nếu ai đó muốn đăng ký với cùng tên người dùng điều gì sẽ xảy ra? – shibly

+0

thì người dùng đã tồn tại với tên người dùng đó, vì vậy bạn nên chọn tính năng này khi xác thực khi lưu người dùng từ biểu mẫu đăng ký. Có một isUnique() xác nhận kiểm tra trong CakePHP. Bạn có thể sử dụng nó trên trường tên người dùng của bạn và báo cáo lỗi cho người dùng rằng tên người dùng mà họ muốn đã biến mất! –

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