web-dev-qa-db-ja.com

廃止されたSymfony 2 SecurityContextクラス

Symfonyデモでapp/exampleにアクセスしようとすると、次のエラーが表示されます

エラー:Symfony\Component\Security\Core\SecurityContextクラスはバージョン2.6以降廃止され、3.0で削除されます。代わりにSymfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageまたはSymfony\Component\Security\Core\Authorization\AuthorizationCheckerを使用してください。

ただし、サーバーは200ステータスコードで正しい答えを返しています。

Googleでそれについては何も見つかりませんでした。誰もこのエラーに遭遇したことがありますか/または修正方法を知っていますか?

26
Harijoe

説明

Symfony 2.6以降、SecurityContextTokenStorageAuthorizationCheckerに分割されました(参照: Symfonyブログ-「Symfony 2.6の新機能:セキュリティコンポーネントの改善」 )。

これの主な理由は、SecurityContextを自分のサービスに注入するときに頻繁に発生する循環参照を防ぐためです。

ソリューション

変更自体は100%下位互換性があり(リンクされたブログ投稿に記載されているように)、SecurityContextへのアクセス方法を書き換えるだけです。

// Symfony 2.5
$user = $this->get('security.context')->getToken()->getUser();
// Symfony 2.6
$user = $this->get('security.token_storage')->getToken()->getUser();

// Symfony 2.5
if (false === $this->get('security.context')->isGranted('ROLE_ADMIN')) { ... }
// Symfony 2.6
if (false === $this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) { ... }

ソースコード(ベンダーディレクトリを含む)でsecurity.contextまたはSecurityContextをテキスト検索することで、犯人を簡単に見つけることができます。

しかし、Vanilla Symfony 2.6を使用していると述べたように、廃止予定のメソッドをすぐに使用するようです。だからあなたは単にこれを使うかもしれません...

回避策

SymfonyはE_USER_DEPRECATEDエラーをトリガーすることで廃止されるため、Symfonyを起動するときにそれらを無効にすることができますAppKernel

// app/AppKernel.php
class AppKernel extends Kernel
{
    public function __construct($environment, $debug) {
        // Keep error reporting like it was and disable only deprecation warnings.
        error_reporting(error_reporting() & (-1 ^ E_DEPRECATED));
        // ...
    }
}

Symfonyの変更ログには、Symfonyの将来のバージョンをサポートするためにコードを変更する必要がある方法に関する非常に詳細な情報が提供される傾向があるため、非推奨の警告が個人的に好きです。

47
flu

これは適切なエラーではなく、単なる警告です。

非推奨のクラスは、将来のリリース(この場合はSymfonyの)で削除される予定のクラスです。

使用をやめることをお勧めします。また、同じタスクを実行するために完全に引き継ぐ新しい(および代替)クラスTokenStorageおよびAuthorizationCheckerを示します。

1
Jean

その警告を見るのはとても面倒です。同時に、警告をオフにしたくない。ですから、コードを変更して取り除くための例を挙げると便利かもしれません。 HWIOAuthBundleOAuthUtilsクラスを変更する方法は次のとおりです。まず、/vendor/hwi/oauth-bundle/HWI/Bundle/OAuthBundle/Resources/config/oauth.htmlを以下から変更しました:

<service id="hwi_oauth.security.oauth_utils" class="%hwi_oauth.security.oauth_utils.class%">
    <argument type="service" id="security.http_utils" />
    <argument type="service" id="security.context" />
    <argument>%hwi_oauth.connect%</argument>
</service>

これに:

<service id="hwi_oauth.security.oauth_utils" class="%hwi_oauth.security.oauth_utils.class%">
    <argument type="service" id="security.http_utils" />
    <argument type="service" id="security.authorization_checker" />
    <argument>%hwi_oauth.connect%</argument>
</service>

次に、/vendor/hwi/oauth-bundle/HWI/Bundle/OAuthBundle/Security/OAuthUtilsクラスでこれを変更する必要があります。

 use Symfony\Component\Security\Core\SecurityContextInterface; 
 ... 
 
 /**
 * @var SecurityContextInterface 
 */
 private $ securityContext; 
 
 /**
 * @param HttpUtils $ httpUtils 
 * @param SecurityContextInterface $ securityContext 
 * @param boolean $ connect 
 */
 public function __construct(HttpUtils $ httpUtils、SecurityContextInterface $ securityContext、$ connect)
 {
 $ this-> httpUtils = $ httpUtils; 
 $ this-> securityContext = $ securityContext; 
 $ this-> connect = $ connect; 
} 

これに:

 use Symfony\Component\Security\Core\Authorization\AuthorizationChecker; 
 ... 
 
 /**
 * @var AuthorizationChecker 
 */
 private $ authorizationChecker; 
 
 /**
 * @param HttpUtils $ httpUtils 
 * @param AuthorizationChecker $ authorizationChecker 
 * @param boolean $ connect 
 */
 public function __construct(HttpUtils $ httpUtils、AuthorizationChecker $ authorizationChecker、$ connect)
 {
 $ this -> httpUtils = $ httpUtils; 
 $ this-> authorizationChecker = $ authorizationChecker; 
 $ this-> connect = $ connect; 
} 

次に、securityContextが使用されている場所に変更を加えました。 authorizationCheckerに置き換えました。

 public function getAuthorizationUrl(Request $ request、$ name、$ redirectUrl = null、array $ extraParameters = array())
 {
 $ resourceOwner = $ this-> getResourceOwner($ name); 
 if(null === $ redirectUrl){
 if(!$ this-> connect ||!$ this-> authorizationChecker-> isGranted( 'IS_AUTHENTICATED_REMEMBERED')){
 $ redirectUrl = $ this-> httpUtils-> generateUri($ request、$ this-> ownerMap-> getResourceOwnerCheckPath($ name)); 
} else {
 $ redirectUrl = $ this-> getServiceAuthUrl($ request、$ resourceOwner); 
} 
} 
 
 return $ resourceOwner-> getAuthorizationUrl($ redirectUrl、$ extraParameters); 
} 

SecurityContextをAuthorizationCheckerに置き換える理由は、この場合はisGrantedメソッドのみが使用されるためです。場合に応じて、TokenStorageに置き換えるか、AuthorizationCheckerとTokenStorageの両方を使用できます。

0
Gulzada Serzhan