为了账号安全,请及时绑定邮箱和手机立即绑定

我可以在 symfony 中创建类似于 isGranted 的东西吗?

我可以在 symfony 中创建类似于 isGranted 的东西吗?

PHP
慕容森 2023-06-18 17:57:28
所以基本上我想创建类似@IsGranted. @IsGranted例如,我在我的应用程序上使用访问控制来防止简单用户访问管理页面。在我的实体上,我有一个名为is_Active如果为真 (1),则用户可以使用他的帐户如果它是 false (0) 那么他会被重定向到一个错误页面!在这种情况下,我不会在Roles用户现场进行测试,但我会在is_Active现场进行测试,这就是为什么我不能使用 @IsGranted.我创建了一个错误的树枝页面并将其放在模板文件夹中,我发现自己被迫在每个active.html.twig控制器函数 上添加这两行。if ($this->getUser()->getIsActive()==false) {     return $this->render('active.html.twig');}这是一个例子:/** * @IsGranted("ROLE_ADMIN") * @Route("/", name="user_index", methods={"GET"}) */public function index(UserRepository $userRepository): Response{    if ($this->getUser()->getIsActive()==false) {        return $this->render('active.html.twig');}                return $this->render('user/index.html.twig', [        'users' => $userRepository->findAll(),    ]);}在每个函数上添加这个 if 语句是非常繁重和糟糕的(我在应用程序上有 +30 个函数)也许我可以创建类似的东西@IsGranted并在每个函数的注释上使用它?
查看完整描述

2 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

您可以继续将 @IsGranted 与自定义选民一起使用。https://symfony.com/doc/current/security/voters.html#creating-the-custom-voter


像文档中那样创建新选民


public const ACTIVE = 'active';


protected function supports(string $attribute, $subject)

{

    return $attribute === self::ACTIVE;

}


protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token)

{

    $user = $token->getUser();


    if ($user instanceof User && !$user->isActive()) {

        throw new InactiveUserException();

    }


    return true;

}

然后你可以为客户创建一个监听器InactiveUserException并向客户展示你想要的东西。


在您的控制器中,您需要在路由方法或控制器之前放置@IsGranted("active")或@Security(expression="is_granted('active')")


查看完整回答
反对 回复 2023-06-18
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

我会为此使用身份验证,这样您就不必触摸您的控制器。您可以检查他们是否已登录并处于活动状态,然后他们可以查看内容,或者如果他们未通过身份验证,则您可以使用 active.html.twig 将他们定向到另一条路线。


您也可以只在某些路线或所有路线上设置此设置。


https://symfony.com/doc/current/security/guard_authentication.html


示例 Authenticator 并仅为您的管理路由设置它,然后您可以拥有一个普通的身份验证器,而无需在所有其他路由的 checkCredentials 上检查活动用户。


<?php


namespace App\Security;


use App\Entity\User;

use Symfony\Component\HttpFoundation\JsonResponse;

use Symfony\Component\HttpFoundation\Request;

use Symfony\Component\HttpFoundation\Response;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

use Symfony\Component\Security\Core\Exception\AuthenticationException;

use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;

use Symfony\Component\Security\Core\User\UserInterface;

use Symfony\Component\Security\Core\User\UserProviderInterface;

use Symfony\Component\Security\Guard\AbstractGuardAuthenticator;

use Twig\Environment;


class AdminAuthenticator extends AbstractGuardAuthenticator

{

    /** @var Environment */

    private $twig;


    public function __construct(Environment $twig)

    {

        $this->twig = $twig;

    }


    public function supports(Request $request): bool

    {

        $email = $request->request->get('email');

        $password = $request->request->get('password');


        return $email && $password;

    }


    public function getCredentials(Request $request)

    {

        $email = $request->request->get('email');

        $password = $request->request->get('password');


        return [

            'email' => $email,

            'password' => $password

        ];

    }


    public function getUser($credentials, UserProviderInterface $userProvider)

    {

        $email = $credentials['email'];

        return $userProvider->loadUserByUsername($email);

    }


    public function checkCredentials($credentials, UserInterface $user)

    {

        $password = $credentials['password'];

        if (!$this->passwordEncoder->isPasswordValid($user, $password)) {

            throw new CustomUserMessageAuthenticationException(

                'Sorry, you\'ve entered an invalid username or password.'

            );

        }

        

        if (!$user->isActive()) {

            throw new NotActiveUserException(

                'This account is not active'

            );

        }


        return true;

    }


    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)

    {

        if ($exception instanceof NotActiveUserException) {


            // You should redirect here but you get the idea!

            $this->twig->render('active.html.twig');

        }

        

        // Do something else for any other failed auth

    }


    public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)

    {

        return new JsonResponse('success', Response::HTTP_OK);

    }


    public function start(Request $request, AuthenticationException $authException = null)

    {

        return new JsonResponse('Not Authorized', Response::HTTP_UNAUTHORIZED);

    }


    public function supportsRememberMe()

    {

        return false;

    }

}

然后在你的 security.yaml


    firewalls:

        admin:

            pattern: ^/admin

            provider: user

            guard:

                authenticators:

                    - App\Security\AdminAuthenticator


查看完整回答
反对 回复 2023-06-18
  • 2 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号