Symfony 4.0
กระบวนการนี้ไม่ได้เปลี่ยนจาก symfony 3 เป็น 4 แต่นี่คือตัวอย่างการใช้ AbstractController ที่แนะนำใหม่ ทั้งบริการsecurity.token_storage
และsession
บริการได้รับการลงทะเบียนในgetSubscribedServices
วิธีการหลักดังนั้นคุณจึงไม่ต้องเพิ่มสิ่งเหล่านั้นในตัวควบคุมของคุณ
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
เนื่องจาก symfony 2.6 security.context
เลิกใช้งานแล้วในความโปรดปรานของsecurity.token_storage
. ตอนนี้คอนโทรลเลอร์สามารถเป็น:
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));
}
}
แม้ว่าจะเลิกใช้งานแล้ว แต่คุณยังสามารถใช้งานได้security.context
เนื่องจากได้รับการปรับปรุงให้เข้ากันได้แบบย้อนหลัง เพียงแค่พร้อมที่จะอัปเดตสำหรับ Symfony 3
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลง 2.6 เพื่อความปลอดภัยได้ที่นี่: https://github.com/symfony/symfony/blob/2.6/UPGRADE-2.6.md
Symfony 2.3.x
ในการทำสิ่งนี้ให้สำเร็จใน symfony 2.3 คุณไม่สามารถตั้งค่าโทเค็นในบริบทความปลอดภัยได้อีกต่อไป คุณต้องบันทึกโทเค็นลงในเซสชันด้วย
สมมติว่าไฟล์รักษาความปลอดภัยที่มีไฟร์วอลล์เช่น:
// app/config/security.yml
security:
firewalls:
main:
//firewall settings here
และการกระทำของคอนโทรลเลอร์ก็คล้ายกันเช่นกัน:
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
}
}
สำหรับการสร้างโทเค็นคุณจะต้องสร้างสิ่งUsernamePasswordToken
นี้ยอมรับพารามิเตอร์ 4 ตัว ได้แก่ เอนทิตีผู้ใช้ข้อมูลรับรองผู้ใช้ชื่อไฟร์วอลล์บทบาทผู้ใช้ คุณไม่จำเป็นต้องระบุข้อมูลรับรองผู้ใช้เพื่อให้โทเค็นถูกต้อง
ฉันไม่แน่ใจ 100% ว่าการตั้งค่าโทเค็นsecurity.context
เป็นสิ่งที่จำเป็นหากคุณกำลังจะเปลี่ยนเส้นทางทันที แต่ดูเหมือนจะไม่เจ็บเลยฉันจึงทิ้งมันไป
จากนั้นส่วนที่สำคัญการตั้งค่าตัวแปรเซสชัน การประชุมการตั้งชื่อตัวแปรจะ_security_
ตามด้วยชื่อไฟร์วอลล์ของคุณในกรณีนี้main
ทำ_security_main