Symfony Security 2026: Voter, Firewall va Cau Hoi Phong Van Ky Thuat

Phan tich toan dien kien truc bao mat Symfony 7.4 LTS: firewall, voter, Access Token Handler, IsGranted attribute, chien luoc quyet dinh va cau hoi phong van ky thuat cho lap trinh vien PHP.

Symfony Security Voters Firewalls

Thanh phan Security cua Symfony hoat dong dua tren hai co che cot loi: firewall dam nhiem xac thuc (ban la ai?) va voter dam nhiem phan quyen (ban duoc phep lam gi?). Hieu ro cach hai thanh phan nay tuong tac voi nhau la dieu kien tien quyet de xay dung ung dung Symfony an toan, dong thoi giup ung vien tu tin tra loi cac cau hoi phong van ky thuat lien quan den bao mat.

Symfony 7.4 LTS Security Stack

Symfony 7.4 (phien ban LTS hien tai, duoc ho tro den thang 11 nam 2029) da gioi thieu tinh nang giai thich quyet dinh cua voter, cac ham phan quyen moi trong Twig (access_decision() va access_decision_for_user()), va ky so thong diep cho Messenger handler. Tat ca vi du trong bai viet nay ap dung cho Symfony 7.4 tro len.

Firewall trong Symfony kiem soat xac thuc nhu the nao

Firewall la tuyen phong thu dau tien trong kien truc bao mat Symfony. Moi firewall duoc khai bao trong file security.yaml va dinh nghia pham vi bao ve cho mot nhom URL cu the, kem theo cac quy tac xac thuc rieng. Dieu quan trong can luu y la thu tu khai bao cac firewall mang tinh quyet dinh: Symfony duyet lan luot tung firewall tu tren xuong va ap dung firewall dau tien co pattern khop voi URL cua request.

yaml
# config/packages/security.yaml
security:
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt))/
            security: false

        api:
            pattern: ^/api/
            stateless: true
            custom_authenticators:
                - App\Security\ApiTokenHandler

        main:
            lazy: true
            provider: app_user_provider
            form_login:
                login_path: app_login
                check_path: app_login
            logout:
                path: app_logout

    access_control:
        - { path: ^/api/public, roles: PUBLIC_ACCESS }
        - { path: ^/api/, roles: ROLE_API_USER }
        - { path: ^/admin, roles: ROLE_ADMIN }
        - { path: ^/dashboard, roles: ROLE_USER }

Cau hinh tren dinh nghia ba firewall song song. Firewall dev vo hieu hoa hoan toan bao mat cho cac route cua Profiler va Web Debug Toolbar, loai bo moi can tro trong moi truong phat trien. Firewall api bao ve cac endpoint API bang xac thuc stateless dua tren token tuy chinh. Firewall main xu ly xac thuc truyen thong bang bieu mau dang nhap (form login) ket hop session cho giao dien web.

Phan access_control thiet lap cac quy tac truy cap toan cuc, duoc danh gia sau khi xac thuc hoan tat. Thu tu cac quy tac cung rat quan trong: quy tac dau tien khop se duoc ap dung. Quy tac PUBLIC_ACCESS tren /api/public cho phep truy cap khong can xac thuc, ke ca khi firewall api dang hoat dong. Day la mot diem tinh te thuong xuat hien trong cac cau hoi phong van.

Stateless va Stateful: Hai mo hinh xac thuc

Viec lua chon giua xac thuc stateless va stateful anh huong truc tiep den kien truc bao mat cua ung dung. Trong mo hinh stateful (firewall main), Symfony luu tru token xac thuc trong session PHP. Moi request tiep theo se tai lai ngu canh bao mat tu session ma khong can xac thuc lai. Co lazy: true toi uu qua trinh nay bang cach chi tai session khi ung dung thuc su can kiem tra quyen truy cap.

Trong mo hinh stateless (firewall api), moi request phai tu mang theo thong tin xac thuc cua rieng minh -- token Bearer, khoa API, chu ky JWT. Khong co session nao duoc tao phia server. Mo hinh nay phu hop tu nhien voi kien truc phan tan, microservices va cac ung dung di dong, nhung doi hoi moi request phai tu cung cap day du thong tin xac thuc.

Viec lua chon giua hai mo hinh nay khong phai la van de so thich ca nhan ma la rang buoc kien truc. Ung dung monolithic voi giao dien web nen su dung stateful de don gian hoa viec quan ly. API phuc vu nhieu loai client khac nhau can stateless de dam bao kha nang mo rong ngang.

Xay dung Access Token Handler tuy chinh

Symfony 6.2 da gioi thieu he thong Access Token Handler, thong nhat viec quan ly token xac thuc thong qua mot interface ro rang. Co che nay thay the cac Guard Authenticator cu, mang lai su tich hop truc tiep hon voi thanh phan Security.

src/Security/ApiTokenHandler.phpphp
namespace App\Security;

use App\Repository\ApiTokenRepository;
use Symfony\Component\Security\Core\Exception\BadCredentialsException;
use Symfony\Component\Security\Http\AccessToken\AccessTokenHandlerInterface;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;

final readonly class ApiTokenHandler implements AccessTokenHandlerInterface
{
    public function __construct(
        private ApiTokenRepository $repository,
    ) {}

    public function getUserBadgeFrom(#[\SensitiveParameter] string $accessToken): UserBadge
    {
        $token = $this->repository->findOneByValue($accessToken);

        if ($token === null || !$token->isValid()) {
            throw new BadCredentialsException('Invalid or expired token.');
        }

        return new UserBadge($token->getUser()->getUserIdentifier());
    }
}

Interface AccessTokenHandlerInterface chi yeu cau mot phuong thuc duy nhat: getUserBadgeFrom. Phuong thuc nay nhan token tho duoc trich xuat tu request (mac dinh la header Authorization: Bearer xxx) va phai tra ve mot UserBadge chua dinh danh cua nguoi dung tuong ung. Attribute #[\SensitiveParameter] danh dau token la thong tin nhay cam, ngan chan no xuat hien trong stack trace va log -- mot thuc hanh bao mat tot duoc gioi thieu tu PHP 8.2.

Pattern nay duoc thiet ke co y don gian: viec xac minh token (ton tai, het han, thu hoi) thuoc ve repository hoac mot service chuyen biet. Handler chi co nhiem vu chuyen doi token thanh danh tinh nguoi dung. Su phan tach trach nhiem nay giup viec viet unit test tro nen de dang va tuan thu nguyen tac don trach nhiem (Single Responsibility Principle).

Voter trong Symfony: Logic phan quyen chi tiet

Voter la co che phan quyen trung tam trong Symfony. Khac voi cac role tinh duoc dinh nghia trong access_control, voter cho phep logic quyet dinh dong dua tren ngu canh: nguoi dung hien tai, doi tuong muc tieu va hanh dong duoc yeu cau. Moi voter tra loi mot cau hoi cu the: "Nguoi dung nay co duoc phep thuc hien hanh dong nay tren doi tuong nay khong?"

src/Security/Voter/PostVoter.phpphp
namespace App\Security\Voter;

use App\Entity\Post;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Vote;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;

final class PostVoter extends Voter
{
    public const EDIT = 'POST_EDIT';
    public const DELETE = 'POST_DELETE';
    public const PUBLISH = 'POST_PUBLISH';

    protected function supports(string $attribute, mixed $subject): bool
    {
        return in_array($attribute, [self::EDIT, self::DELETE, self::PUBLISH])
            && $subject instanceof Post;
    }

    protected function voteOnAttribute(
        string $attribute,
        mixed $subject,
        TokenInterface $token,
        ?Vote $vote = null,
    ): bool {
        $user = $token->getUser();
        if (!$user instanceof UserInterface) {
            $vote?->addReason('User is not authenticated.');
            return false;
        }

        /** @var Post $post */
        $post = $subject;

        return match ($attribute) {
            self::EDIT => $this->canEdit($post, $user, $vote),
            self::DELETE => $this->canDelete($post, $user, $vote),
            self::PUBLISH => $this->canPublish($post, $user, $vote),
            default => false,
        };
    }

    private function canEdit(Post $post, UserInterface $user, ?Vote $vote): bool
    {
        if ($post->getAuthor() === $user) {
            $vote?->addReason('User is the author of the post.');
            return true;
        }

        $vote?->addReason('User is not the author.');
        return false;
    }

    private function canDelete(Post $post, UserInterface $user, ?Vote $vote): bool
    {
        if (in_array('ROLE_ADMIN', $user->getRoles())) {
            $vote?->addReason('User has ROLE_ADMIN.');
            return true;
        }

        if ($post->getAuthor() === $user && !$post->isPublished()) {
            $vote?->addReason('Author can delete unpublished posts.');
            return true;
        }

        $vote?->addReason('Only admins or authors of unpublished posts can delete.');
        return false;
    }

    private function canPublish(Post $post, UserInterface $user, ?Vote $vote): bool
    {
        if (in_array('ROLE_EDITOR', $user->getRoles())) {
            $vote?->addReason('User has ROLE_EDITOR.');
            return true;
        }

        $vote?->addReason('Only editors can publish posts.');
        return false;
    }
}

Mot so diem dang chu y trong voter nay. Tham so Vote (duoc gioi thieu tu Symfony 7.1) cho phep dinh kem ly do giai thich vao moi quyet dinh, ho tro viec debug trong moi truong phat trien va audit trong moi truong production. Phuong thuc supports loc cac loi goi: voter chi hoat dong khi attribute la POST_EDIT, POST_DELETE hoac POST_PUBLISH va subject la mot instance cua Post.

Bieu thuc match trong voteOnAttribute uy quyen logic cho cac phuong thuc private chuyen biet, moi phuong thuc dong goi quy tac nghiep vu cua mot hanh dong. Cau truc nay giup voter de doc va de mo rong: them mot hanh dong moi chi can khai bao hang so, them mot case trong match va viet mot phuong thuc private.

Logic cua canDelete minh hoa mot pattern pho bien: ket hop kiem tra role va kiem tra quyen so huu. Quan tri vien co the xoa bat ky bai viet nao, nhung tac gia chi co the xoa bai viet cua minh khi bai viet chua duoc xuat ban. Loai quy tac theo ngu canh nay khong the dien dat chi bang role trong access_control.

Sẵn sàng chinh phục phỏng vấn Symfony?

Luyện tập với mô phỏng tương tác, flashcards và bài kiểm tra kỹ thuật.

Su dung Attribute IsGranted trong Controller

Attribute #[IsGranted] ap dung kiem soat truy cap truc tiep tai cap controller hoac phuong thuc, thuc hien cung chuc nang nhu cac annotation bao mat nhung voi cu phap PHP goc. Symfony danh gia bieu thuc truoc khi thuc thi phuong thuc va tra ve response 403 neu kiem tra that bai.

src/Controller/PostController.phpphp
namespace App\Controller;

use App\Entity\Post;
use App\Security\Voter\PostVoter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;

#[Route('/post')]
final class PostController extends AbstractController
{
    #[Route('/{id}/edit', methods: ['GET', 'POST'])]
    #[IsGranted(PostVoter::EDIT, subject: 'post', message: 'You cannot edit this post.')]
    public function edit(Post $post): Response
    {
        // User is guaranteed to have edit permission at this point
        return $this->render('post/edit.html.twig', [
            'post' => $post,
        ]);
    }

    #[Route('/{id}/publish', methods: ['POST'])]
    #[IsGranted(PostVoter::PUBLISH, subject: 'post')]
    public function publish(Post $post): Response
    {
        // Only editors reach this code
        $post->setPublished(true);
        // ...
        return $this->redirectToRoute('post_show', ['id' => $post->getId()]);
    }
}

Tham so subject: 'post' lien ket attribute voi tham so cua phuong thuc cung ten. Symfony tu dong phan giai entity thong qua ParamConverter va truyen no vao voter lam subject cua phep kiem tra. Tham so message tuy chinh thong bao loi 403, huu ich cho viec debug va ghi nhat ky kiem tra.

Phong cach khai bao nay mang lai loi the lon ve kha nang doc hieu: cac quy tac truy cap hien thi ngay tai cung vi tri voi chu ky phuong thuc, khong can phai doc than phuong thuc de biet quyen truy cap nao duoc yeu cau. Trong phong van ky thuat, kha nang giai thich day du luong xu ly -- tu attribute den voter thong qua AccessDecisionManager -- the hien su hieu biet sau sac ve thanh phan Security.

Chien luoc quyet dinh va su phoi hop giua cac Voter

Khi nhieu voter cung bieu quyet cho mot phep kiem tra truy cap, AccessDecisionManager ap dung mot chien luoc quyet dinh de tong hop cac phieu bau. Symfony cung cap ba chien luoc, co the cau hinh trong security.yaml.

| Chien luoc | Hanh vi | Truong hop su dung | |---|---|---| | affirmative (mac dinh) | Cap quyen khi it nhat mot voter dong y | Phu hop da so ung dung | | unanimous | Cap quyen khi tat ca voter deu dong y | He thong yeu cau bao mat cao | | consensus | Cap quyen khi da so voter dong y | Hiem khi su dung trong thuc te |

yaml
# config/packages/security.yaml
security:
    access_decision_manager:
        strategy: unanimous
        allow_if_all_abstain: false

Chien luoc affirmative (mac dinh) cap quyen truy cap ngay khi chi mot voter bo phieu thuan. Chien luoc unanimous yeu cau tat ca cac voter khong bo phieu trang deu phai bo phieu thuan. Chien luoc consensus cap quyen khi da so voter bo phieu thuan. Tham so allow_if_all_abstain xac dinh hanh vi khi tat ca voter deu bo phieu trang (khong voter nao ho tro attribute duoc yeu cau).

Trong thuc te, chien luoc mac dinh affirmative phu hop voi da so ung dung. Chien luoc unanimous duoc ap dung trong cac ngu canh bao mat nghiem ngat: ung dung tai chinh, du lieu y te, he thong trong yeu. No dam bao rang khong voter nao phan doi quyen truy cap, tao them mot lop phong thu sau. Mot voter kiem tra IP, mot voter kiem tra role va mot voter kiem tra quyen so huu deu phai chap thuan thi quyen truy cap moi duoc cap.

Debug Voter trong Twig voi Symfony 7.4

Symfony 7.4 nang cap kha nang debug he thong bao mat bang cach hien thi ly do quyet dinh truy cap truc tiep trong cac template Twig. Tham so Vote duoc them vao voter phat huy tac dung tai day: cac ly do duoc khai bao qua $vote->addReason() xuat hien trong Profiler va co the hien thi co dieu kien trong template.

twig
{# templates/post/show.html.twig #}
{% if is_granted('POST_EDIT', post) %}
    <a href="{{ path('post_edit', {id: post.id}) }}">Edit</a>
{% endif %}

{% if is_granted('POST_DELETE', post) %}
    <form method="post" action="{{ path('post_delete', {id: post.id}) }}">
        <button type="submit">Delete</button>
    </form>
{% endif %}

{% if app.debug %}
    {# Symfony 7.4: access decision debugging in Twig #}
    {% set decision = is_granted_debug('POST_EDIT', post) %}
    <details>
        <summary>Access Decision Debug</summary>
        <ul>
            {% for voter_detail in decision.voterDetails %}
                <li>
                    {{ voter_detail.class }}:
                    {{ voter_detail.result > 0 ? 'GRANTED' : (voter_detail.result < 0 ? 'DENIED' : 'ABSTAIN') }}
                    {% for reason in voter_detail.reasons %}
                        <br>&rarr; {{ reason }}
                    {% endfor %}
                </li>
            {% endfor %}
        </ul>
    </details>
{% endif %}

Ham is_granted() van la diem vao chuan cho cac phep kiem tra truy cap trong Twig. Viec su dung no trong dieu kien hien thi dam bao rang cac thanh phan giao dien (nut bam, lien ket) chi hien thi cho nhung nguoi dung co quyen. Khoi debug duoc dieu kien hoa boi app.debug cho phep kiem tra chi tiet cac phieu bau trong moi truong phat trien ma khong lo thong tin nay bi lo ra trong production.

Co che debug nay giai quyet mot van de thuong gap trong cac du an Symfony: xac dinh tai sao mot nguoi dung bi tu choi quyen truy cap. Truoc Symfony 7.4, viec dieu tra nay doi hoi phai kiem tra thu cong trong Profiler hoac them log tam thoi vao cac voter.

Cau hoi phong van ky thuat pho bien ve Symfony Security

Bao mat Symfony la mot chu de trong tam trong cac buoi phong van ky thuat danh cho lap trinh vien backend PHP. Duoi day la nam cau hoi thuong gap cung voi huong dan tra loi.

Su khac biet giua authentication va authorization trong Symfony la gi?

Authentication (xac thuc) tra loi cau hoi "Ban la ai?" -- no xac dinh danh tinh nguoi dung thong qua thong tin dang nhap (ten nguoi dung/mat khau, token API, chung chi). Authorization (phan quyen) tra loi cau hoi "Ban co quyen gi?" -- no kiem tra quyen cua nguoi dung da duoc xac thuc thong qua role, voter va cac bieu thuc bao mat. Trong Symfony, firewall dam nhiem xac thuc trong khi AccessDecisionManager va voter dam nhiem phan quyen.

Voter hoat dong nhu the nao va khi nao nen dung voter thay vi access_control?

Voter implement VoterInterface va tra ve mot trong ba gia tri: ACCESS_GRANTED, ACCESS_DENIED hoac ACCESS_ABSTAIN. Voter duoc uu tien khi quyet dinh truy cap phu thuoc vao ngu canh: doi tuong muc tieu (Post, Order), trang thai cua doi tuong (da xuat ban, da luu tru), hoac moi quan he giua nguoi dung va doi tuong (tac gia, quan ly). Cac quy tac access_control trong security.yaml chi gioi han o viec kiem tra role tinh va pattern URL.

Vai tro cua tham so Vote duoc gioi thieu tu Symfony 7.1 la gi?

Tham so Vote cho phep cac voter dinh kem ly do bang van ban vao quyet dinh cua minh. Cac ly do nay hien thi trong Symfony Profiler va co the duoc khai thac trong cac template Twig de debug. Trong moi truong production, chung phuc vu cho nhat ky kiem tra (audit log). Tham so nay la tuy chon va co the null (?Vote $vote = null) de duy tri kha nang tuong thich nguoc voi cac voter hien co.

Lam the nao de bao mat mot API stateless trong Symfony?

Firewall can duoc cau hinh voi stateless: true de vo hieu hoa quan ly session. Xac thuc dua tren AccessTokenHandler de trich xuat va xac minh token tu moi request. Token phai co thoi han su dung gioi han, duoc luu tru an toan phia client, va co the thu hoi phia server. Co #[\SensitiveParameter] tren tham so token ngan chan no bi lo trong log va stack trace.

Lam the nao de kiem thu voter mot cach toan dien?

Voter duoc kiem thu nhu cac class PHP thong thuong voi PHPUnit. Moi test tao mot instance cua voter, xay dung mot UsernamePasswordToken mo phong nguoi dung voi cac role cu the, tao doi tuong subject voi trang thai mong muon, va kiem tra rang vote() tra ve gia tri dung (ACCESS_GRANTED, ACCESS_DENIED hoac ACCESS_ABSTAIN). Pham vi kiem thu phai bao gom tat ca cac attribute duoc ho tro, cac truong hop bien (nguoi dung chua xac thuc, attribute khong duoc ho tro) va cac to hop role.

tests/Security/Voter/PostVoterTest.phpphp
namespace App\Tests\Security\Voter;

use App\Entity\Post;
use App\Entity\User;
use App\Security\Voter\PostVoter;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;

final class PostVoterTest extends TestCase
{
    private PostVoter $voter;

    protected function setUp(): void
    {
        $this->voter = new PostVoter();
    }

    public function testAuthorCanEditOwnPost(): void
    {
        $user = new User();
        $post = (new Post())->setAuthor($user);
        $token = new UsernamePasswordToken($user, 'main', ['ROLE_USER']);

        $this->assertSame(
            VoterInterface::ACCESS_GRANTED,
            $this->voter->vote($token, $post, [PostVoter::EDIT]),
        );
    }

    public function testNonAuthorCannotEditPost(): void
    {
        $author = new User();
        $otherUser = new User();
        $post = (new Post())->setAuthor($author);
        $token = new UsernamePasswordToken($otherUser, 'main', ['ROLE_USER']);

        $this->assertSame(
            VoterInterface::ACCESS_DENIED,
            $this->voter->vote($token, $post, [PostVoter::EDIT]),
        );
    }

    public function testAdminCanDeleteAnyPost(): void
    {
        $admin = new User();
        $post = (new Post())->setAuthor(new User());
        $token = new UsernamePasswordToken($admin, 'main', ['ROLE_ADMIN']);

        $this->assertSame(
            VoterInterface::ACCESS_GRANTED,
            $this->voter->vote($token, $post, [PostVoter::DELETE]),
        );
    }

    public function testAuthorCanDeleteUnpublishedPost(): void
    {
        $user = new User();
        $post = (new Post())->setAuthor($user)->setPublished(false);
        $token = new UsernamePasswordToken($user, 'main', ['ROLE_USER']);

        $this->assertSame(
            VoterInterface::ACCESS_GRANTED,
            $this->voter->vote($token, $post, [PostVoter::DELETE]),
        );
    }

    public function testAuthorCannotDeletePublishedPost(): void
    {
        $user = new User();
        $post = (new Post())->setAuthor($user)->setPublished(true);
        $token = new UsernamePasswordToken($user, 'main', ['ROLE_USER']);

        $this->assertSame(
            VoterInterface::ACCESS_DENIED,
            $this->voter->vote($token, $post, [PostVoter::DELETE]),
        );
    }

    public function testOnlyEditorCanPublish(): void
    {
        $user = new User();
        $post = (new Post())->setAuthor($user);
        $token = new UsernamePasswordToken($user, 'main', ['ROLE_EDITOR']);

        $this->assertSame(
            VoterInterface::ACCESS_GRANTED,
            $this->voter->vote($token, $post, [PostVoter::PUBLISH]),
        );
    }

    public function testVoterAbstainsOnUnsupportedAttribute(): void
    {
        $user = new User();
        $post = new Post();
        $token = new UsernamePasswordToken($user, 'main', ['ROLE_USER']);

        $this->assertSame(
            VoterInterface::ACCESS_ABSTAIN,
            $this->voter->vote($token, $post, ['UNSUPPORTED']),
        );
    }
}

Moi test co lap mot quy tac nghiep vu cu the. Test testAuthorCannotDeletePublishedPost kiem tra rang buoc rang tac gia mat quyen xoa sau khi bai viet duoc xuat ban -- mot quy tac de bi bo sot neu thieu test. Test abstain tren attribute khong duoc ho tro xac minh rang voter khong can tro quyet dinh cua cac voter khac.

Voter la cac class thuan tuy khong phu thuoc vao framework (khong co service duoc inject trong vi du nay), cho phep viet unit test don gian voi PHPUnit. Doi voi cac voter phuc tap hon can su dung service (kiem tra subscription, gioi han quota), viec mock dependency thong qua createMock() la phuong phap chuan.

Khong dung security: false cho route production

Co security: false vo hieu hoa hoan toan thanh phan Security cho cac route tuong ung: khong token, khong user, khong voter. Tuy chon nay khong bao gio duoc su dung tren cac route production tiep xuc voi nguoi dung. De cho phep truy cap khong can xac thuc tren mot so route API, hay su dung PUBLIC_ACCESS trong access_control trong khi van giu firewall hoat dong.

Tang cuong bao mat Symfony ngoai cau hinh mac dinh

Ngoai voter va firewall, viec tang cuong bao mat Symfony doi hoi nhieu co che bo sung. UserCheckerInterface cho phep them cac phep kiem tra trong qua trinh xac thuc, truoc va sau khi xac minh thong tin dang nhap.

src/Security/UserEnabledChecker.phpphp
namespace App\Security;

use App\Entity\User;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAccountStatusException;
use Symfony\Component\Security\Core\User\UserCheckerInterface;
use Symfony\Component\Security\Core\User\UserInterface;

final class UserEnabledChecker implements UserCheckerInterface
{
    public function checkPreAuth(UserInterface $user): void
    {
        if (!$user instanceof User) {
            return;
        }

        if ($user->isBanned()) {
            throw new CustomUserMessageAccountStatusException(
                'Your account has been banned. Contact support.'
            );
        }
    }

    public function checkPostAuth(UserInterface $user): void
    {
        if (!$user instanceof User) {
            return;
        }

        if (!$user->isVerified()) {
            throw new CustomUserMessageAccountStatusException(
                'Please verify your email address before logging in.'
            );
        }
    }
}

UserChecker phan tach cac phep kiem tra thanh hai giai doan: checkPreAuth chay truoc khi xac minh mat khau (truong hop tai khoan bi cam, khong can kiem tra thong tin dang nhap), checkPostAuth chay sau khi xac thuc thanh cong (truong hop email chua duoc xac minh, mat khau dung nhung tai khoan chua hoat dong). Su phan tach nay toi uu luong xac thuc va cung cap thong bao loi cu the cho tung tinh huong.

Cac thuc hanh tot de tang cuong bao mat bao gom:

  • Gioi han tan suat (Rate limiting): thanh phan RateLimiter tich hop trong Symfony cho phep gioi han so lan dang nhap that bai theo IP hoac dinh danh nguoi dung, bao ve khoi tan cong brute force
  • Bao ve CSRF: kich hoat bao ve CSRF tren tat ca bieu mau, bao gom bieu mau dang nhap, thong qua tham so enable_csrf cua firewall
  • Hash mat khau: su dung hasher auto de tu dong chon thuat toan an toan nhat co san (bcrypt hoac Argon2id tuy theo cau hinh PHP)
  • Xoay vong secret: tan dung Vault cua Symfony cho cac thong tin nhay cam, voi xoay vong khoa ma hoa tu dong
  • Header bao mat: cau hinh cac header HTTP Content-Security-Policy, X-Frame-Options, Strict-Transport-Security thong qua event listener tren kernel.response
Su kien bao mat trong Symfony

Symfony phat di cac su kien tai moi buoc cua qua trinh bao mat: AuthenticationSuccessEvent, LoginSuccessEvent, LogoutEvent, SwitchUserEvent, va AccessDeniedEvent. Cac su kien nay cho phep them logging, thong bao hoac kiem tra bo sung ma khong can sua doi cac authenticator hay voter hien co. Trong moi truong production, viec lang nghe AccessDeniedEvent cung cap du lieu cho he thong giam sat va phat hien cac lan truy cap trai phep.

Sẵn sàng chinh phục phỏng vấn Symfony?

Luyện tập với mô phỏng tương tác, flashcards và bài kiểm tra kỹ thuật.

Ket luan

Thanh phan Security cua Symfony cung cap mot kien truc vua chat che vua de mo rong, co kha nang xu ly cac kich ban tu xac thuc bang bieu mau truyen thong den he thong phan quyen da tieu chi trong moi truong phan tan. Su thanh thao ve linh vuc nay la mot dau hieu khong the ban cai cua trinh do senior trong cac buoi phong van ky thuat.

Nhung diem chinh can ghi nho:

  • Firewall: thu tu khai bao quyet dinh viec khop; chi su dung security: false cho cac route phat trien, khong bao gio cho production
  • Stateless va stateful: lua chon phu thuoc vao kien truc (monolith hay microservices) chu khong phai so thich ky thuat
  • Access Token Handler: interface AccessTokenHandlerInterface thong nhat quan ly token voi duy nhat mot phuong thuc, giup viec test va bao tri de dang
  • Voter: uu tien voter cho moi logic phan quyen theo ngu canh; cau truc moi voter voi cac phuong thuc private theo hanh dong
  • Tham so Vote: tan dung addReason() de debug va kiem tra quyet dinh truy cap
  • IsGranted: ap dung kiem soat truy cap khai bao tai cap controller de toi da kha nang doc hieu
  • Chien luoc quyet dinh: chon unanimous cho cac ngu canh nhay cam doi hoi phong thu sau
  • Kiem thu: bao phu moi to hop nguoi dung/hanh dong/doi tuong trong unit test cua voter
  • Tang cuong bao mat: ket hop UserChecker, rate limiting, CSRF, header bao mat va xoay vong secret de phong thu nhieu lop

Bắt đầu luyện tập!

Kiểm tra kiến thức với mô phỏng phỏng vấn và bài kiểm tra kỹ thuật.

Thẻ

#symfony
#security
#php
#voters
#firewalls
#authentication
#interview

Chia sẻ

Bài viết liên quan