Symfony 4.0
Quá trình này không thay đổi từ symfony 3 thành 4 nhưng đây là một ví dụ sử dụng AbstractController mới được đề xuất. Cả dịch vụ security.token_storage
và session
dịch vụ đều được đăng ký trong getSubscribedServices
phương thức chính vì vậy bạn không cần phải thêm chúng vào bộ điều khiển của mình.
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use YourNameSpace\UserBundle\Entity\User;
class LoginController extends AbstractController{
public function registerAction()
{
$user = //Handle getting or creating the user entity likely with a posted form
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->container->get('security.token_storage')->setToken($token);
$this->container->get('session')->set('_security_main', serialize($token));
// The user is now logged in, you can redirect or do whatever.
}
}
Symfony 2.6.x - Symfony 3.0.x
Vì symfony 2.6 security.context
không được dùng nữa security.token_storage
. Bộ điều khiển bây giờ có thể đơn giản là:
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use YourNameSpace\UserBundle\Entity\User;
class LoginController extends Controller{
public function registerAction()
{
$user = //Handle getting or creating the user entity likely with a posted form
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->get('security.token_storage')->setToken($token);
$this->get('session')->set('_security_main', serialize($token));
}
}
Mặc dù tính năng này không được dùng nữa, bạn vẫn có thể sử dụng security.context
vì nó đã được tạo ra để tương thích ngược. Chỉ cần sẵn sàng cập nhật nó cho Symfony 3
Bạn có thể đọc thêm về các thay đổi 2.6 đối với bảo mật tại đây: https://github.com/symfony/symfony/blob/2.6/UPGRADE-2.6.md
Symfony 2.3.x
Để thực hiện điều này trong symfony 2.3, bạn không thể chỉ đặt mã thông báo trong ngữ cảnh bảo mật nữa. Bạn cũng cần lưu mã thông báo vào phiên.
Giả sử một tệp bảo mật có tường lửa như:
// app/config/security.yml
security:
firewalls:
main:
//firewall settings here
Và một hành động điều khiển cũng tương tự:
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use YourNameSpace\UserBundle\Entity\User;
class LoginController extends Controller{
public function registerAction()
{
$user = //Handle getting or creating the user entity likely with a posted form
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->get('security.context')->setToken($token);
$this->get('session')->set('_security_main',serialize($token));
//Now you can redirect where ever you need and the user will be logged in
}
}
Để tạo mã thông báo, bạn sẽ muốn tạo UsernamePasswordToken
, Điều này chấp nhận 4 tham số: Thực thể người dùng, Thông tin đăng nhập người dùng, Tên tường lửa, Vai trò người dùng. Bạn không cần cung cấp thông tin xác thực của người dùng để mã thông báo hợp lệ.
Tôi không chắc chắn 100% rằng việc đặt mã thông báo vào security.context
là cần thiết nếu bạn định chuyển hướng ngay lập tức. Nhưng nó có vẻ không đau nên tôi đã bỏ nó.
Sau đó là phần quan trọng, thiết lập biến phiên. Quy ước đặt tên biến được _security_
theo sau bởi tên tường lửa của bạn, trong trường hợp này main
làm_security_main