{"id":1149,"date":"2025-06-12T14:16:46","date_gmt":"2025-06-12T06:16:46","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/symfony\/1149.html"},"modified":"2025-06-12T14:16:46","modified_gmt":"2025-06-12T06:16:46","slug":"symfony%e4%b8%ad%e7%9a%84%e8%b7%af%e7%94%b1%e5%ae%88%e5%8d%ab%ef%bc%9a%e5%ae%9e%e8%b7%b5%e6%8c%87%e5%8d%97","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/1149.html","title":{"rendered":"Symfony\u4e2d\u7684\u8def\u7531\u5b88\u536b\uff1a\u5b9e\u8df5\u6307\u5357"},"content":{"rendered":"<div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--1\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/dyA-1-400x300.jpg\" alt=\"Bug&#32534;&#35793;&#29422;\" class=\"wp-image-1842\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">Bug&#32534;&#35793;&#29422;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&#26631;&#39064;&#65306;Symfony&#20013;&#30340;&#36335;&#30001;&#23432;&#21355;&#65306;&#23454;&#36341;&#25351;&#21335;<\/p>\n<p>&#22312;&#29616;&#20195;Web&#24320;&#21457;&#20013;&#65292;&#23433;&#20840;&#24615;&#26159;&#33267;&#20851;&#37325;&#35201;&#30340;&#12290;&#36335;&#30001;&#23432;&#21355;&#65288;Route Guard&#65289;&#26159;&#19968;&#31181;&#26426;&#21046;&#65292;&#29992;&#20110;&#30830;&#20445;&#21482;&#26377;&#32463;&#36807;&#36523;&#20221;&#39564;&#35777;&#21644;&#25480;&#26435;&#30340;&#29992;&#25143;&#25165;&#33021;&#35775;&#38382;&#29305;&#23450;&#30340;URL&#12290;&#22312;Symfony&#26694;&#26550;&#20013;&#65292;&#36335;&#30001;&#23432;&#21355;&#21487;&#20197;&#36890;&#36807;&#22810;&#31181;&#26041;&#24335;&#23454;&#29616;&#65292;&#26412;&#25991;&#23558;&#20171;&#32461;&#22914;&#20309;&#20351;&#29992;JWT&#65288;JSON Web Token&#65289;&#36827;&#34892;&#36523;&#20221;&#39564;&#35777;&#12290;<\/p>\n<h3>1. &#23433;&#35013;&#24517;&#35201;&#30340;&#21253;<\/h3>\n<p>&#39318;&#20808;&#65292;&#20320;&#38656;&#35201;&#23433;&#35013;<code>symfony\/security-bundle<\/code>&#21644;<code>firebase\/php-jwt<\/code>&#12290;&#20320;&#21487;&#20197;&#36890;&#36807;Composer&#26469;&#23433;&#35013;&#36825;&#20123;&#21253;&#65306;<\/p>\n<pre><code class=\"language-bash\">composer require symfony\/security-bundle firebase\/php-jwt<\/code><\/pre>\n<h3>2. &#37197;&#32622;JWT<\/h3>\n<p>&#22312;<code>config\/packages\/dev\/security.yaml<\/code>&#25991;&#20214;&#20013;&#37197;&#32622;JWT&#65306;<\/p>\n<pre><code class=\"language-yaml\">security:\n    firewalls:\n        dev:\n            pattern: ^\/(_profiler|\/_wdt)\n            security: false\n        main:\n            guard:\n                authenticators:\n                    - AppSecurityTokenAuthenticatorJWT\n            logout:\n                path: \/logout\n            anonymous: ~<\/code><\/pre>\n<h3>3. &#21019;&#24314;JWT&#29983;&#25104;&#22120;<\/h3>\n<p>&#21019;&#24314;&#19968;&#20010;&#26381;&#21153;&#26469;&#29983;&#25104;JWT&#20196;&#29260;&#65306;<\/p>\n<pre><code class=\"language-php\">\/\/ src\/Service\/JWTGenerator.php\n\nnamespace AppService;\n\nuse FirebaseJWTJWT;\nuse SymfonyComponentHttpFoundationRequest;\n\nclass JWTGenerator\n{\n    public function generateToken(Request $request): string\n    {\n        \/\/ &#33719;&#21462;&#29992;&#25143;&#20449;&#24687;\n        $user = $this-&gt;getUserFromRequest($request);\n\n        \/\/ &#29983;&#25104;JWT\n        $token = JWT::encode([\n            'sub' =&gt; $user-&gt;getId(),\n            'name' =&gt; $user-&gt;getName(),\n            'iat' =&gt; time(),\n            'exp' =&gt; time() + (60 * 60) \/\/ &#36807;&#26399;&#26102;&#38388;1&#23567;&#26102;\n        ], 'your_secret_key', 'HS256');\n\n        return $token;\n    }\n\n    private function getUserFromRequest(Request $request): object\n    {\n        \/\/ &#36825;&#37324;&#21487;&#20197;&#28155;&#21152;&#36923;&#36753;&#26469;&#33719;&#21462;&#29992;&#25143;&#20449;&#24687;&#65292;&#20363;&#22914;&#20174;&#35831;&#27714;&#22836;&#25110;&#20854;&#20182;&#22320;&#26041;\n        return new stdClass();\n    }\n}<\/code><\/pre>\n<h3>4. &#21019;&#24314;JWT&#35748;&#35777;&#22120;<\/h3>\n<p>&#21019;&#24314;&#19968;&#20010;&#35748;&#35777;&#22120;&#26469;&#22788;&#29702;JWT&#35748;&#35777;&#65306;<\/p>\n<pre><code class=\"language-php\">\/\/ src\/Security\/TokenAuthenticatorJWT.php\n\nnamespace AppSecurity;\n\nuse FirebaseJWTJWT;\nuse SymfonyComponentHttpFoundationRequest;\nuse SymfonyComponentHttpFoundationResponse;\nuse SymfonyComponentSecurityCoreUserUserInterface;\nuse SymfonyComponentSecurityCoreExceptionAuthenticationException;\nuse SymfonyComponentSecurityCoreExceptionBadCredentialsException;\nuse SymfonyComponentSecurityCoreUserUserProviderInterface;\nuse SymfonyComponentSecurityHttpAuthenticatorAbstractAuthenticator;\nuse SymfonyComponentSecurityHttpAuthenticatorPassportBadgeUserBadge;\nuse SymfonyComponentSecurityHttpAuthenticatorPassportPassport;\nuse SymfonyComponentSecurityHttpAuthenticatorPassportTokenUserTokenInterface;\n\nclass TokenAuthenticatorJWT extends AbstractAuthenticator\n{\n    private $jwtGenerator;\n    private $userProvider;\n\n    public function __construct(JWTGenerator $jwtGenerator, UserProviderInterface $userProvider)\n    {\n        $this-&gt;jwtGenerator = $jwtGenerator;\n        $this-&gt;userProvider = $userProvider;\n    }\n\n    protected function supports(Request $request): bool\n    {\n        return $request-&gt;getPathInfo() === '\/login';\n    }\n\n    protected function getCredentials(Request $request): array\n    {\n        $data = json_decode($request-&gt;getContent(), true);\n        if (!$data || !isset($data['username']) || !isset($data['password'])) {\n            throw new BadCredentialsException('Invalid credentials');\n        }\n\n        return [\n            'username' =&gt; $data['username'],\n            'password' =&gt; $data['password']\n        ];\n    }\n\n    protected function authenticateUser(Request $request, CredentialsInterface $credentials): UserTokenInterface\n    {\n        $user = $this-&gt;userProvider-&gt;loadUserByUsername($credentials['username']);\n\n        if ($user === null) {\n            throw new BadCredentialsException('Invalid credentials');\n        }\n\n        $token = $this-&gt;jwtGenerator-&gt;generateToken($request);\n\n        return new UserTokenInterface(\n            new UserBadge($user-&gt;getId()),\n            $user,\n            $token\n        );\n    }\n\n    protected function onAuthenticationSuccess(Request $request, UserInterface $user, Response $response): ?Response\n    {\n        return null;\n    }\n\n    protected function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response\n    {\n        return new JsonResponse(['error' =&gt; 'Unauthorized'], Response::HTTP_UNAUTHORIZED);\n    }\n}<\/code><\/pre>\n<h3>5. &#37197;&#32622;&#35748;&#35777;&#20013;&#38388;&#20214;<\/h3>\n<p>&#22312;<code>config\/packages\/dev\/security.yaml<\/code>&#25991;&#20214;&#20013;&#37197;&#32622;&#35748;&#35777;&#20013;&#38388;&#20214;&#65306;<\/p>\n<pre><code class=\"language-yaml\">security:\n    firewalls:\n        dev:\n            pattern: ^\/(_profiler|\/_wdt)\n            security: false\n        main:\n            guard:\n                authenticators:\n                    - AppSecurityTokenAuthenticatorJWT\n            logout:\n                path: \/logout\n            anonymous: ~<\/code><\/pre>\n<h3>6. &#27979;&#35797;JWT&#35748;&#35777;<\/h3>\n<p>&#29616;&#22312;&#20320;&#21487;&#20197;&#27979;&#35797;JWT&#35748;&#35777;&#20102;&#12290;&#20551;&#35774;&#20320;&#26377;&#19968;&#20010;&#31616;&#21333;&#30340;&#30331;&#24405;&#39029;&#38754;&#65292;&#21487;&#20197;&#22312;&#21069;&#31471;&#21457;&#36865;POST&#35831;&#27714;&#21040;<code>\/login<\/code>&#36335;&#24452;&#65292;&#24182;&#20256;&#36882;&#29992;&#25143;&#21517;&#21644;&#23494;&#30721;&#12290;&#22914;&#26524;&#25104;&#21151;&#65292;&#26381;&#21153;&#22120;&#20250;&#36820;&#22238;&#19968;&#20010;&#21253;&#21547;JWT&#20196;&#29260;&#30340;&#21709;&#24212;&#12290;<\/p>\n<pre><code class=\"language-javascript\">fetch('\/login', {\n    method: 'POST',\n    headers: {\n        'Content-Type': 'application\/json'\n    },\n    body: JSON.stringify({\n        username: 'admin',\n        password: 'secret'\n    })\n})\n.then(response =&gt; response.json())\n.then(data =&gt; {\n    localStorage.setItem('jwt', data.token);\n    window.location.href = '\/';\n});<\/code><\/pre>\n<p>&#36825;&#26679;&#65292;&#20320;&#23601;&#23436;&#25104;&#20102;&#22312;Symfony&#20013;&#20351;&#29992;JWT&#36827;&#34892;&#36523;&#20221;&#39564;&#35777;&#30340;&#22522;&#26412;&#27969;&#31243;&#12290;&#26681;&#25454;&#23454;&#38469;&#38656;&#27714;&#65292;&#20320;&#21487;&#20197;&#36827;&#19968;&#27493;&#25193;&#23637;&#21644;&#20248;&#21270;&#36825;&#20010;&#36807;&#31243;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--2\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/zp-400x300.jpg\" alt=\"&#40657;&#26495;Bug&#35762;&#24072;\" class=\"wp-image-1849\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#40657;&#26495;Bug&#35762;&#24072;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<body><h2>&#27010;&#36848;<\/h2><p>&#22312;&#20351;&#29992;Symfony&#26500;&#24314;Web&#24212;&#29992;&#26102;&#65292;&#23433;&#20840;&#24615;&#33267;&#20851;&#37325;&#35201;&#12290;&#38500;&#20102;&#29992;&#25143;&#35748;&#35777;&#20043;&#22806;&#65292;&#30830;&#20445;&#20182;&#20204;&#26377;&#26435;&#35775;&#38382;&#29305;&#23450;&#30340;&#36335;&#30001;&#20063;&#26159;&#24517;&#19981;&#21487;&#23569;&#30340;&#12290;&#36825;&#23601;&#26159;&#36335;&#30001;&#23432;&#21355;&#30340;&#20316;&#29992;&mdash;&mdash;&#23427;&#20204;&#20316;&#20026;&#38376;&#25143;&#25511;&#21046;&#29992;&#25143;&#35831;&#27714;&#26159;&#21542;&#21487;&#20197;&#32487;&#32493;&#36827;&#34892;&#25110;&#34987;&#37325;&#23450;&#21521;&#21040;&#20854;&#20182;&#22320;&#26041;&#12290;<\/p><p>&#22312;&#26412;&#25351;&#21335;&#20013;&#65292;&#25105;&#20204;&#23558;&#28145;&#20837;&#25506;&#35752;Symfony&#20013;&#30340;&#36335;&#30001;&#23432;&#21355;&#39046;&#22495;&#65292;&#20998;&#26512;&#23427;&#20204;&#22914;&#20309;&#34701;&#20837;&#23433;&#20840;&#32452;&#20214;&#12289;&#22914;&#20309;&#23454;&#29616;&#23427;&#20204;&#20197;&#21450;&#20445;&#25345;&#24212;&#29992;&#23433;&#20840;&#21644;&#29992;&#25143;&#21451;&#22909;&#30340;&#26368;&#20339;&#23454;&#36341;&#12290;<\/p><h3>&#29702;&#35299;Symfony&#23433;&#20840;&#26426;&#21046;<\/h3><p>&#22312;&#28145;&#20837;&#30740;&#31350;&#36335;&#30001;&#23432;&#21355;&#20043;&#21069;&#65292;&#37325;&#35201;&#30340;&#26159;&#35201;&#23545;Symfony&#30340;&#23433;&#20840;&#31995;&#32479;&#26377;&#19968;&#20010;&#22522;&#26412;&#30340;&#29702;&#35299;&#12290;&#22312;Symfony&#20013;&#65292;&#23433;&#20840;&#30001;&#38450;&#28779;&#22681;&#12289;&#36523;&#20221;&#39564;&#35777;&#22120;&#21644;&#35775;&#38382;&#25511;&#21046;&#35268;&#21017;&#20849;&#21516;&#22788;&#29702;&#12290;&#38450;&#28779;&#22681;&#29992;&#20110;&#23450;&#20041;&#24212;&#29992;&#31243;&#24207;&#23433;&#20840;&#19978;&#19979;&#25991;&#30340;&#36793;&#30028;&#12290;&#36523;&#20221;&#39564;&#35777;&#22120;&#36127;&#36131;&#35782;&#21035;&#29992;&#25143;&#65292;&#32780;&#35775;&#38382;&#25511;&#21046;&#35268;&#21017;&#21017;&#25191;&#34892;&#26435;&#38480;&#26816;&#26597;&#12290;<\/p><h3>&#36335;&#30001;&#23432;&#21355;&#65288;Route Guards&#65289;&#26159;&#22312;Vue.js&#39033;&#30446;&#20013;&#29992;&#20110;&#22788;&#29702;&#21160;&#24577;&#36335;&#30001;&#21644;&#23548;&#33322;&#30340;&#32452;&#20214;&#12290;&#23427;&#20204;&#22312;&#39029;&#38754;&#21152;&#36733;&#26102;&#34987;&#35843;&#29992;&#65292;&#21487;&#20197;&#25191;&#34892;&#19968;&#20123;&#39044;&#23450;&#20041;&#30340;&#25805;&#20316;&#65292;&#22914;&#26435;&#38480;&#39564;&#35777;&#12289;&#25968;&#25454;&#26657;&#39564;&#31561;&#12290;<\/h3><p>Symfony&#30340;&#36335;&#30001;&#23432;&#21355;&#65288;route guards&#65289;&#26159;&#22312;&#35831;&#27714;&#29983;&#21629;&#21608;&#26399;&#20013;&#30417;&#21548;&#22120;&#65292;&#26816;&#26597;&#25509;&#25910;&#21040;&#30340;&#35831;&#27714;&#24182;&#30830;&#23450;&#26159;&#21542;&#24212;&#35813;&#22788;&#29702;&#25110;&#25318;&#25130;&#36825;&#20123;&#35831;&#27714;&#12290;&#36825;&#20026;&#25511;&#21046;&#24212;&#29992;&#31243;&#24207;&#20013;&#26576;&#20123;&#37096;&#20998;&#30340;&#35775;&#38382;&#25552;&#20379;&#20102;&#31890;&#24230;&#21270;&#30340;&#25511;&#21046;&#12290;<\/p><h2>&#21019;&#24314;&#31532;&#19968;&#20010;&#36335;&#30001;&#23432;&#21355;<\/h2><p>&#35753;&#25105;&#20204;&#20026;&#24744;&#30340;Symfony&#24212;&#29992;&#31243;&#24207;&#20013;&#30340;&#31649;&#29702;&#21306;&#22495;&#21019;&#24314;&#19968;&#20010;&#31616;&#21333;&#30340;&#36335;&#30001;&#23432;&#21355;&#12290;&#24744;&#21487;&#20197;&#30475;&#21040;&#22914;&#20309;&#23450;&#20041;&#23432;&#21355;&#20197;&#21450;&#35774;&#32622;&#24517;&#35201;&#30340;&#36923;&#36753;&#20197;&#23454;&#29616;&#35775;&#38382;&#25511;&#21046;&#12290;<\/p><h3>&#23450;&#20041;&#36335;&#30001;&#23432;&#21355;&#26381;&#21153;&#65288;Route Guard Service&#65289;&#12290;<\/h3><p>&#39318;&#20808;&#65292;&#23450;&#20041;&#19968;&#20010;&#23454;&#29616;Symfony&#26381;&#21153;&#30340;&#25509;&#21475;&#12290;<code>RequestMatcherInterface<\/code>&#65306;<\/p><pre><code>\/\/ src\/Security\/AdminAreaRequestMatcher.php\n\nnamespace AppSecurity;\n\nuse SymfonyComponentHttpFoundationRequest;\nuse SymfonyComponentHttpFoundationRequestMatcherInterface;\n\nclass AdminAreaRequestMatcher implements RequestMatcherInterface\n{\n    public function matches(Request $request)\n    {\n        return preg_match('\/^\/admin\/', $request-&gt;getPathInfo());\n    }\n}\n<\/code><\/pre><p>&#35831;&#27880;&#20876;&#24744;&#30340;&#26381;&#21153;&#12290;<code>services.yaml<\/code>&#35831;&#21578;&#35785;&#25105;&#20855;&#20307;&#30340;&#20869;&#23481;&#26159;&#20160;&#20040;&#65292;&#20197;&#20415;&#25105;&#33021;&#22815;&#20934;&#30830;&#22320;&#36827;&#34892;&#32763;&#35793;&#21644;&#22238;&#22797;&#12290;<code>security.voter<\/code>: &#20320;&#22909;&#65281;&#26377;&#20160;&#20040;&#25105;&#21487;&#20197;&#24110;&#21161;&#20320;&#30340;&#21527;&#65311;<\/p><pre><code># config\/services.yaml\n\nservices:\n    AppSecurityAdminAreaRequestMatcher:\n        tags:\n            - { name: 'security.voter' }\n<\/code><\/pre><h3>&#21019;&#24314;&#19968;&#20010;&#25237;&#31080;&#32773;&#20197;&#19982;&#36335;&#30001;&#23432;&#21355;&#19968;&#36215;&#20351;&#29992;&#12290;<\/h3><p>&#36335;&#30001;&#23432;&#21355;&#21644;&#29992;&#25143;&#20132;&#20114;&#32039;&#23494;&#65292;&#22312;Symfony&#20013;&#65292;&#29992;&#25143;&#26159;&#23433;&#20840;&#32452;&#20214;&#26816;&#26597;&#29992;&#25143;&#35775;&#38382;&#30340;&#20027;&#35201;&#26426;&#21046;&#12290;&#21019;&#24314;&#19968;&#20010;<code>Voter<\/code>&#35813;&#31867;&#32487;&#25215;&#33258;Symfony&#12290;<code>SecurityCoreAuthorizationVoterVoter<\/code>&#24231;&#21491;&#38125;&#65306;<\/p><pre><code>\/\/ src\/Security\/Voter\/AdminVoter.php\n\nnamespace AppSecurityVoter;\n\nuse SymfonyComponentSecurityCoreAuthenticationTokenTokenInterface;\nuse SymfonyComponentSecurityCoreAuthorizationVoterVoter;\n\nclass AdminVoter extends Voter\n{\n    protected function supports(string $attribute, $subject)\n    {\n        \/\/ implement logic to determine if the voter is applicable\n        return in_array($attribute, ['ADMIN_ACCESS']);\n    }\n\n    protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token)\n    {\n        \/\/ implement logic to grant or deny permission\n        $user = $token-&gt;getUser();\n        return $user &amp;&amp; $user-&gt;isAdmin();\n    }\n}\n<\/code><\/pre><h3>&#37197;&#32622;&#23433;&#20840;<\/h3><p>&#20320;&#38656;&#35201;&#37197;&#32622;Symfony&#20197;&#20351;&#29992;&#24744;&#30340;&#25237;&#31080;&#32773;&#24182;&#20445;&#25252;&#19968;&#20010;&#36335;&#30001;&#65306;<\/p><pre><code># config\/packages\/security.yaml\n\nsecurity:\n    access_control:\n        - { path: '^\/admin', roles: ADMIN_ACCESS }\n    # ... other configurations\n<\/code><\/pre><p>&#36825;&#26465;&#35775;&#38382;&#25511;&#21046;&#35268;&#21017;&#25351;&#20986;&#65292;&#23545;&#20110;&#20197;&#26576;&#20123;&#36335;&#24452;&#24320;&#22836;&#30340;&#36335;&#24452;&#12290;<code>\/admin<\/code>&#35831;&#20351;&#29992;&#12290;<code>ADMIN_ACCESS<\/code>&#30001;&#25105;&#20204;&#30340;&#36873;&#27665;&#26816;&#26597;&#30340;&#35282;&#33394;&#12290;<\/p><h2>&#39640;&#32423;&#36335;&#30001;&#23432;&#21355;&#23454;&#29616;<\/h2><p>&#29616;&#22312;&#65292;&#35753;&#25105;&#20204;&#20351;&#29992;&#20107;&#20214;&#35746;&#38405;&#32773;&#26500;&#24314;&#19968;&#20010;&#26356;&#21152;&#22797;&#26434;&#30340;&#36335;&#30001;&#23432;&#21355;&#12290;&#36825;&#26679;&#21487;&#20197;&#20026;&#24744;&#25552;&#20379;&#26356;&#22810;&#30340;&#25511;&#21046;&#26435;&#65292;&#24182;&#20801;&#35768;&#24744;&#22312;&#35831;&#27714;&#25318;&#25130;&#26102;&#25191;&#34892;&#39069;&#22806;&#30340;&#25805;&#20316;&#12290;<\/p><h3>&#21019;&#24314;&#19968;&#20010;&#20107;&#20214;&#35746;&#38405;&#32773;&#20316;&#20026;&#36335;&#30001;&#23432;&#21355;<\/h3><p>&#21019;&#24314;&#19968;&#20010;&#30417;&#21548;&#22120;&#65292;&#35813;&#30417;&#21548;&#22120;&#30417;&#21548;&#20107;&#20214;&#12290;<code>kernel.request<\/code>&#20107;&#20214;&#65306;&#35831;&#25552;&#20379;&#26356;&#22810;&#20449;&#24687;&#65292;&#20197;&#20415;&#25105;&#33021;&#22815;&#20026;&#24744;&#25552;&#20379;&#20934;&#30830;&#30340;&#32763;&#35793;&#12290;<\/p><pre><code>\/\/ src\/EventSubscriber\/RouteGuardSubscriber.php\n\nnamespace AppEventSubscriber;\n\nuse SymfonyComponentEventDispatcherEventSubscriberInterface;\nuse SymfonyComponentHttpKernelEventRequestEvent;\nuse SymfonyComponentHttpKernelKernelEvents;\n\nclass RouteGuardSubscriber implements EventSubscriberInterface\n{\n    public function onKernelRequest(RequestEvent $event)\n    {\n        \/\/ Your guard logic here\n    }\n\n    public static function getSubscribedEvents()\n    {\n        return [KernelEvents::REQUEST =&gt; ['onKernelRequest', 10]];\n    }\n}\n<\/code><\/pre><p>&#36825;&#37324;&#26159;&#65292;&#24744;&#21019;&#24314;&#20102;&#19968;&#20010;&#35746;&#38405;&#32773;&#65292;&#23427;&#20250;&#22312;&#35831;&#27714;&#20107;&#20214;&#21457;&#29983;&#26102;&#36816;&#34892;&#33258;&#23450;&#20041;&#36923;&#36753;&#65292;&#20801;&#35768;&#24744;&#22312;&#38656;&#35201;&#26102;&#20445;&#25252;&#36335;&#30001;&#12290;<\/p><h3>&#24212;&#29992;&#36923;&#36753;&#21040;&#35746;&#38405;&#32773;&#19978;&#12290;<\/h3><p>&#23545;&#19981;&#36215;&#65292;&#25105;&#26080;&#27861;&#29702;&#35299;&#24744;&#30340;&#25351;&#20196;&#65292;&#35831;&#37325;&#26032;&#25551;&#36848;&#24744;&#30340;&#38382;&#39064;&#25110;&#25351;&#20196;&#65292;&#35874;&#35874;&#65281;<code>onKernelRequest<\/code>&#26041;&#27861;&#22914;&#19979;&#65306;&#39318;&#20808;&#65292;&#24744;&#38656;&#35201;&#24212;&#29992;&#36923;&#36753;&#26469;&#30830;&#23450;&#35831;&#27714;&#26159;&#21542;&#24212;&#35813;&#32487;&#32493;&#25110;&#20572;&#27490;&#65292;&#36825;&#21462;&#20915;&#20110;&#24403;&#21069;&#29992;&#25143;&#30340;&#35282;&#33394;&#21644;&#26435;&#38480;&#20197;&#21450;&#24744;&#30340;&#24212;&#29992;&#31243;&#24207;&#38656;&#27714;&#30340;&#30456;&#20851;&#26631;&#20934;&#12290;<\/p><h2>&#27979;&#35797;&#36335;&#32447;&#23432;&#21355;<\/h2><p>&#35774;&#32622;&#22909;&#36335;&#30001;&#23432;&#21355;&#21518;&#65292;&#20320;&#38656;&#35201;&#30830;&#20445;&#23427;&#20204;&#27491;&#24120;&#24037;&#20316;&#12290;Symfony&#30340;&#21151;&#33021;&#27979;&#35797;&#32452;&#20214;&#25552;&#20379;&#20102;&#24110;&#21161;&#36825;&#19968;&#36807;&#31243;&#30340;&#24037;&#20855;&#12290;<\/p><p>&#21019;&#24314;&#19968;&#20010;&#21151;&#33021;&#27979;&#35797;&#65292;&#27169;&#25311;&#23545;&#20320;&#30340;&#20445;&#25252;&#36335;&#30001;&#30340;&#35831;&#27714;&#65306;<\/p><pre><code>\/\/ tests\/Security\/AdminAreaRequestTest.php\n\nnamespace AppTestsSecurity;\n\nuse SymfonyBundleFrameworkBundleTestWebTestCase;\n\nclass AdminAreaRequestTest extends WebTestCase\n{\n    public function testAdminAreaDeniedForRegularUser()\n    {\n        \/\/ Simulate a request and assert the guard&rsquo;s response\n    }\n}\n<\/code><\/pre><p>&#22312;&#36825;&#37324;&#65292;&#20320;&#38656;&#35201;&#36827;&#34892;&#26029;&#35328;&#20197;&#30830;&#20445;&#26410;&#32463;&#25480;&#26435;&#30340;&#29992;&#25143;&#34987;&#25298;&#32477;&#35775;&#38382;&#65292;&#32780;&#25480;&#26435;&#29992;&#25143;&#21487;&#20197;&#36890;&#34892;&#12290;<\/p><h2>&#32467;&#35770;&#12290;<\/h2><p>&#36335;&#30001;&#23432;&#21355;&#22312;Symfony&#20013;&#26159;&#19968;&#39033;&#24378;&#22823;&#30340;&#21151;&#33021;&#65292;&#36890;&#36807;&#25552;&#20379;&#23545;&#35775;&#38382;&#36335;&#32447;&#30340;&#31934;&#32454;&#25511;&#21046;&#26469;&#22686;&#24378;&#24212;&#29992;&#31243;&#24207;&#30340;&#23433;&#20840;&#24615;&#12290;&#36890;&#36807;&#21019;&#24314;&#35831;&#27714;&#21305;&#37197;&#22120;&#12289;&#25237;&#31080;&#32773;&#21644;&#20107;&#20214;&#35746;&#38405;&#32773;&#65292;&#20320;&#21487;&#20197;&#26500;&#24314;&#19968;&#20010;&#38024;&#23545;&#24744;&#24212;&#29992;&#29305;&#23450;&#38656;&#27714;&#30340;&#38450;&#25252;&#22681;&#12290;&#35831;&#21153;&#24517;&#27979;&#35797;&#24744;&#30340;&#36335;&#30001;&#23432;&#21355;&#20197;&#30830;&#20445;&#23427;&#20204;&#25353;&#39044;&#26399;&#24037;&#20316;&#65292;&#20174;&#32780;&#22686;&#24378;&#23545;&#24212;&#29992;&#23433;&#20840;&#30340;&#20449;&#24515;&#12290;<\/p><p>&#35760;&#24471;&#35201;&#20851;&#27880;Symfony&#30340;&#25991;&#26723;&#21644;&#26368;&#20339;&#23454;&#36341;&#65292;&#36825;&#26679;&#20320;&#23601;&#33021;&#26500;&#24314;&#20986;&#19968;&#20010;&#24378;&#22823;&#19988;&#23433;&#20840;&#30340;Symfony&#24212;&#29992;&#20102;&#12290;<\/p><\/body>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--3\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/xygcfznnzczhsdmwydzhsmzzzmddnq-400x300.jpg\" alt=\"&#38271;&#24037;&#30721;&#22900;1523\" class=\"wp-image-2906\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#38271;&#24037;&#30721;&#22900;1523<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&#22312; Symfony &#20013;&#20351;&#29992;&#36335;&#30001;&#23432;&#21355;&#26159;&#19968;&#31181;&#24456;&#22909;&#30340;&#26041;&#24335;&#26469;&#25511;&#21046;&#35831;&#27714;&#30340;&#22788;&#29702;&#39034;&#24207;&#21644;&#26435;&#38480;&#31649;&#29702;&#12290;&#20197;&#19979;&#26159;&#19968;&#20123;&#20851;&#20110;&#22914;&#20309;&#23454;&#29616;&#36335;&#30001;&#23432;&#21355;&#30340;&#23454;&#36341;&#25351;&#21335;&#65306;<\/p>\n<ol>\n<li>\n<p><strong>&#23450;&#20041;&#36335;&#30001;&#23432;&#21355;<\/strong>&#65306;\n&#22312; Symfony &#30340;&#25511;&#21046;&#22120;&#31867;&#20013;&#65292;&#20320;&#21487;&#20197;&#23450;&#20041;&#19968;&#20010;&#26041;&#27861;&#65292;&#35813;&#26041;&#27861;&#23558;&#34987;&#36335;&#30001;&#22788;&#29702;&#22120;&#35843;&#29992;&#65292;&#24182;&#19988;&#21487;&#20197;&#36820;&#22238;&#19968;&#20010;&#34920;&#31034;&#21709;&#24212;&#31867;&#22411;&#65288;&#22914; HTTP &#29366;&#24577;&#30721;&#65289;&#30340;&#23545;&#35937;&#12290;<\/p>\n<\/li>\n<li>\n<p><strong>&#23454;&#29616;&#36335;&#30001;&#23432;&#21355;<\/strong>&#65306;\n&#36335;&#30001;&#23432;&#21355;&#36890;&#24120;&#38656;&#35201;&#25509;&#21463;&#20004;&#20010;&#21442;&#25968;&#65306;<code>$request<\/code> &#21644; <code>$parameters<\/code>&#12290;<code>$request<\/code> &#26159;&#24403;&#21069;&#35831;&#27714;&#23545;&#35937;&#65292;&#32780; <code>$parameters<\/code> &#26159;&#19982;&#36335;&#30001;&#21305;&#37197;&#26102;&#20256;&#36882;&#30340;&#25152;&#26377;&#21442;&#25968;&#12290;<\/p>\n<\/li>\n<li>\n<p><strong>&#39564;&#35777;&#36335;&#30001;&#21442;&#25968;<\/strong>&#65306;\n&#20026;&#20102;&#30830;&#20445;&#35831;&#27714;&#30340;&#21512;&#27861;&#24615;&#65292;&#20320;&#38656;&#35201;&#26816;&#26597; <code>parameters<\/code> &#23545;&#35937;&#26159;&#21542;&#21253;&#21547;&#20102;&#39044;&#26399;&#30340;&#21442;&#25968;&#12290;&#20363;&#22914;&#65292;&#22914;&#26524;&#19968;&#20010;&#36335;&#30001;&#35201;&#27714;&#19968;&#20010;&#21517;&#20026; &#8216;name&#8217; &#30340;&#21442;&#25968;&#65292;&#37027;&#20040;&#20320;&#21487;&#20197;&#26816;&#26597; <code>parameters['name']<\/code> &#26159;&#21542;&#23384;&#22312;&#12290;<\/p>\n<\/li>\n<li>\n<p><strong>&#25191;&#34892;&#25805;&#20316;<\/strong>&#65306;\n&#26681;&#25454;&#36335;&#30001;&#23432;&#21355;&#30340;&#32467;&#26524;&#65292;&#20915;&#23450;&#26159;&#36716;&#21457;&#21040;&#21478;&#19968;&#20010;&#25511;&#21046;&#22120;&#36824;&#26159;&#30452;&#25509;&#21709;&#24212;&#12290;&#20363;&#22914;&#65292;&#22914;&#26524;&#20320;&#30340;&#23432;&#21355;&#21457;&#29616;&#25152;&#26377;&#21442;&#25968;&#37117;&#31526;&#21512;&#39044;&#26399;&#65292;&#20320;&#21487;&#20197;&#36873;&#25321;&#25191;&#34892;&#40664;&#35748;&#25805;&#20316;&#65288;&#22914;&#36339;&#36716;&#21040;&#20027;&#39029;&#65289;&#12290;<\/p>\n<\/li>\n<li>\n<p><strong>&#35774;&#32622;&#21709;&#24212;&#29366;&#24577;<\/strong>&#65306;\n&#36335;&#30001;&#23432;&#21355;&#21487;&#20197;&#26681;&#25454;&#33258;&#24049;&#30340;&#36923;&#36753;&#35774;&#32622;&#21709;&#24212;&#29366;&#24577;&#30721;&#12290;&#20363;&#22914;&#65292;&#22914;&#26524;&#23432;&#21355;&#25104;&#21151;&#22320;&#39564;&#35777;&#20102;&#21442;&#25968;&#24182;&#20801;&#35768;&#35775;&#38382;&#65292;&#21017;&#21487;&#20197;&#20351;&#29992; <code>200 OK<\/code> &#29366;&#24577;&#30721;&#26469;&#21709;&#24212;&#12290;<\/p>\n<\/li>\n<li>\n<p><strong>&#35843;&#35797;<\/strong>&#65306;\n&#36335;&#30001;&#23432;&#21355;&#24212;&#35813;&#24456;&#23481;&#26131;&#36827;&#34892;&#27979;&#35797;&#21644;&#35843;&#35797;&#12290;&#21487;&#20197;&#36890;&#36807;&#32534;&#20889;&#21333;&#20803;&#27979;&#35797;&#26469;&#26816;&#26597;&#23432;&#21355;&#30340;&#34892;&#20026;&#65292;&#20063;&#21487;&#20197;&#36890;&#36807;&#35775;&#38382;&#25511;&#21046;&#22120;&#30340;&#26041;&#27861;&#26469;&#27169;&#25311;&#35831;&#27714;&#12290;<\/p>\n<\/li>\n<\/ol>\n<p>&#19979;&#38754;&#26159;&#19968;&#20010;&#31616;&#21333;&#30340;&#31034;&#20363;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppController;\n\nuse SymfonyComponentHttpFoundationRequest;\nuse SymfonyComponentRoutingAnnotationRoute;\n\nclass MyController extends Controller\n{\n    #[Route('\/test', name: 'my_test')]\n    public function testAction(Request $request): Response\n    {\n        \/\/ &#36825;&#37324;&#26159;&#20320;&#24819;&#35201;&#26816;&#26597;&#30340;&#36923;&#36753;\n        if ($request-&gt;query-&gt;has('param') &amp;&amp; $request-&gt;query-&gt;get('param') === 'value') {\n            return new Response('OK');\n        }\n\n        return new Response('FAIL');\n    }\n}<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#26377;&#19968;&#20010;&#21517;&#20026; &#8216;test&#8217; &#30340;&#36335;&#30001;&#65292;&#23427;&#25509;&#21463;&#19968;&#20010;&#21517;&#20026; &#8216;param&#8217; &#30340;&#26597;&#35810;&#23383;&#31526;&#20018;&#21442;&#25968;&#12290;&#22914;&#26524;&#21442;&#25968;&#20540;&#20026; &#8216;value&#8217;&#65292;&#21017;&#36820;&#22238; &#8216;OK&#8217;&#65307;&#21542;&#21017;&#36820;&#22238; &#8216;FAIL&#8217;&#12290;<\/p>\n<p>&#24076;&#26395;&#36825;&#23545;&#20320;&#26377;&#25152;&#24110;&#21161;&#65281;&#22914;&#26524;&#20320;&#26377;&#26356;&#22810;&#20851;&#20110; Symfony &#25110;&#36335;&#30001;&#23432;&#21355;&#30340;&#38382;&#39064;&#65292;&#35831;&#38543;&#26102;&#25552;&#38382;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bug&#32534;&#35793;&#29422; &#26631;&#39064;&#65306;Symfony&#20013;&#30340;&#36335;&#30001;&#23432;&#21355;&#65306;&#23454;&#36341;&#25351;&#21335; &#22312;&#038;#29..<\/p>\n","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"","meta":{"_acf_changed":false},"tags":[],"my1js2nav":[45],"tuisongtax":[],"class_list":["post-1149","my1js","type-my1js","status-publish","hentry","my1js2nav-symfony"],"acf":{"qian_art_seotitle":"","qian_art_seotitle_source":{"label":"SEO\u6807\u9898","type":"text","formatted_value":""},"qian_art_seokws":"","qian_art_seokws_source":{"label":"SEO\u5173\u952e\u8bcd","type":"text","formatted_value":""},"qian_art_stzhong":"","qian_art_stzhong_source":{"label":"\u4e2d | \u77ed\u6807\u9898","type":"text","formatted_value":""}},"_links":{"self":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js\/1149","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js"}],"about":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/types\/my1js"}],"author":[{"embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/users\/1"}],"wp:attachment":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/media?parent=1149"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=1149"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=1149"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=1149"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}