docs(articles): SEO titles, intros and a section preview image for From Magento to Symfony
uk/articles/magento-to-symfony/data/security.md
+4
−0
Безпека
Компонент Security відповідає на два питання. Автентифікація (хто ви): firewall, user provider, authenticator. Авторизація (що вам можна): ролі, access_control і voters. Класи користувачів пишете самі: make:user створить сутність User з UserInterface.
Symfony · config/packages/security.yaml
security:
password_hashers:
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: auto
providers:
users:
entity: { class: App\Entity\User, property: email }
role_hierarchy:
ROLE_ADMIN: [ROLE_FAQ_EDITOR]
firewalls:
dev:
pattern: ^/(_profiler|_wdt|assets)/
security: false
main:
lazy: true
provider: users
form_login:
login_path: app_login
check_path: app_login
enable_csrf: true
logout:
path: app_logout
access_control:
- { path: ^/admin, roles: ROLE_FAQ_EDITOR }
- { path: ^/account, roles: ROLE_USER }
Magento · acl.xml + ADMIN_RESOURCE
<acl>
<resources>
<resource id="Magento_Backend::admin">
<resource id="Vendor_Faq::faq" title="FAQ">
<resource id="Vendor_Faq::question_edit"
title="Edit questions"/>
</resource>
</resource>
</resources>
</acl>
class Edit extends Action
{
const ADMIN_RESOURCE = 'Vendor_Faq::question_edit';
}
Symfony · Voter + #[IsGranted]
final class QuestionVoter extends Voter
{
protected function supports(string $attribute, mixed $subject): bool
{
return $attribute === 'QUESTION_EDIT' && $subject instanceof Question;
}
protected function voteOnAttribute(
string $attribute,
mixed $subject,
TokenInterface $token,
?Vote $vote = null,
): bool
{
$user = $token->getUser();
return $user instanceof User
&& ($user->hasRole('ROLE_ADMIN') || $subject->getAuthor() === $user);
}
}
#[Route('/admin/questions/{id}/edit', name: 'admin_question_edit')]
#[IsGranted('QUESTION_EDIT', subject: 'question')]
public function edit(Question $question, Request $request): Response
Ролі вирішують загальний доступ, voters — доступ до конкретного об'єкта («автор може редагувати своє питання»). В ACL Magento такої гранулярності немає. Аргумент ?Vote $vote з'явився в 7.3; у старіших версіях сигнатура без нього. Для API зазвичай беруть access_token authenticator або JWT-бандл замість integration tokens.