亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我可以在 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 關注
  • 143 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號