Безпека

← Безпека

Ashterix

feat(seo): og:image size for front matter images; short titles and explicit descriptions for From Magento to Symfony

uk/articles/magento-to-symfony/data/security.md +2 −1

Безпека

Компонент 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.