Безпека

← Безпека

Ashterix

docs(articles): From Magento to Symfony, a requalification guide grouped into sections

uk/articles/magento-to-symfony/data/security.md новий файл +83 −0

1 + # Безпека
2 +
3 + Компонент Security відповідає на два питання. Автентифікація (хто ви): firewall, user provider, authenticator. Авторизація (що вам можна): ролі, `access_control` і voters. Класи користувачів пишете самі: `make:user` створить сутність `User` з `UserInterface`.
4 +
5 + **Symfony** · config/packages/security.yaml
6 +
7 + ```yaml
8 + security:
9 + password_hashers:
10 + Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: auto
11 + providers:
12 + users:
13 + entity: { class: App\Entity\User, property: email }
14 + role_hierarchy:
15 + ROLE_ADMIN: [ROLE_FAQ_EDITOR]
16 + firewalls:
17 + dev:
18 + pattern: ^/(_profiler|_wdt|assets)/
19 + security: false
20 + main:
21 + lazy: true
22 + provider: users
23 + form_login:
24 + login_path: app_login
25 + check_path: app_login
26 + enable_csrf: true
27 + logout:
28 + path: app_logout
29 + access_control:
30 + - { path: ^/admin, roles: ROLE_FAQ_EDITOR }
31 + - { path: ^/account, roles: ROLE_USER }
32 + ```
33 +
34 + **Magento** · acl.xml + ADMIN_RESOURCE
35 +
36 + ```xml
37 + <acl>
38 + <resources>
39 + <resource id="Magento_Backend::admin">
40 + <resource id="Vendor_Faq::faq" title="FAQ">
41 + <resource id="Vendor_Faq::question_edit"
42 + title="Edit questions"/>
43 + </resource>
44 + </resource>
45 + </resources>
46 + </acl>
47 + ```
48 + ```php
49 + class Edit extends Action
50 + {
51 + const ADMIN_RESOURCE = 'Vendor_Faq::question_edit';
52 + }
53 + ```
54 +
55 + **Symfony** · Voter + #[IsGranted]
56 +
57 + ```php
58 + final class QuestionVoter extends Voter
59 + {
60 + protected function supports(string $attribute, mixed $subject): bool
61 + {
62 + return $attribute === 'QUESTION_EDIT' && $subject instanceof Question;
63 + }
64 +
65 + protected function voteOnAttribute(
66 + string $attribute,
67 + mixed $subject,
68 + TokenInterface $token,
69 + ?Vote $vote = null,
70 + ): bool
71 + {
72 + $user = $token->getUser();
73 + return $user instanceof User
74 + && ($user->hasRole('ROLE_ADMIN') || $subject->getAuthor() === $user);
75 + }
76 + }
77 +
78 + #[Route('/admin/questions/{id}/edit', name: 'admin_question_edit')]
79 + #[IsGranted('QUESTION_EDIT', subject: 'question')]
80 + public function edit(Question $question, Request $request): Response
81 + ```
82 +
83 + Ролі вирішують загальний доступ, voters — доступ до конкретного об'єкта («автор може редагувати своє питання»). В ACL Magento такої гранулярності немає. Аргумент `?Vote $vote` з'явився в 7.3; у старіших версіях сигнатура без нього. Для API зазвичай беруть `access_token` authenticator або JWT-бандл замість integration tokens.