2014-07-07 19 views
6

Trong dự án Symfony 2.4, khách hàng của chúng tôi muốn buộc người dùng phải thay đổi mật khẩu của họ cứ sau N ngày. Chúng tôi thấy rằng có các cột "credentials_expired" và "credentials_expire_at" trong cơ sở dữ liệu và kiểm tra ném một AccountExpiredException trong lớp UserChecker dường như cho mục đích đó, nhưng tôi không thể tìm thấy bất kỳ tài liệu nào về cách bật hoặc định cấu hình đặc tính.Làm cách nào để sử dụng đặc tính đã hết hạn trong Symfony AdvancedUserInterface?

  • Làm cách nào để cột credential_expire_at được điền vào ngày N sau ngày nay trên mọi thay đổi mật khẩu?
  • Làm cách nào để người dùng vẫn có thể thay đổi mật khẩu nếu mật khẩu hết hạn?
  • Làm cách nào để cảnh báo cho người dùng về việc hết hạn tín hiệu một số ngày trước?
  • Có thể cấm sử dụng lại mật khẩu cuối cùng không?
+0

Câu hỏi này chắc chắn là quá rộng vì nó chứa 4 câu hỏi phụ. Bạn có thể chia chúng thành các câu hỏi đơn không? – nifr

+0

Bạn có thể lấy nhiều cảm hứng từ [FOSUserBundle] (https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/index.md). Họ giải quyết một vài vấn đề này. –

+0

lặp lại câu hỏi trong bộ theo dõi vấn đề symfony: https://github.com/symfony/symfony/issues/12177 –

Trả lời

1

Thực ra, đó là số CredentialsExpiredException bạn muốn nắm bắt. Nếu bạn đang sử dụng Symfony Security component, thì cách đơn giản nhất để xử lý này là để kiểm tra sự ngoại lệ trong loginAction của SecurityController của bạn:

use Symfony\Component\Security\Core\Exception\CredentialsExpiredException; 
use Symfony\Component\Security\Core\SecurityContextInterface; 

... 

$error = $this->get('session')->get(SecurityContextInterface::AUTHENTICATION_ERROR); 

// check if credentials have expired 
if ($error instanceof CredentialsExpiredException) { 
    // display the change password form 
    return new Response($this->renderView('AcmeDemoBundle:Security:changePassword.html.twig')); 
} 

Bạn sẽ rõ ràng là cần phải tạo ra một lộ trình cho việc thay đổi mật khẩu, mà bạn có thể đặt làm tác vụ biểu mẫu của mẫu changePassword của bạn. Yêu cầu thay đổi mật khẩu sau đó có thể được xử lý tương ứng trong số SecurityController của bạn.

Cốt lõi của logic nghiệp vụ của bạn có thể/nên tồn tại trong lớp dịch vụ UserManager (hoặc bất kỳ thứ gì bạn muốn gọi), bạn có thể khởi tạo và gọi khi cần từ SecurityController.

Hy vọng điều đó sẽ hữu ích.

LƯU Ý: Đối với hậu thế, đối tượng sử dụng hết hạn được lưu trữ trong CredentialsExpiredException ngoại lệ, vì vậy bạn có thể dễ dàng lấy nó nếu bạn cần phải hành động theo nó để xử lý mật khẩu hết hạn:

$error->getUser();

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