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でそれについては何も見つかりませんでした。誰もこのエラーに遭遇したことがありますか/または修正方法を知っていますか?
説明
Symfony 2.6以降、SecurityContext
はTokenStorage
とAuthorizationChecker
に分割されました(参照: 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の将来のバージョンをサポートするためにコードを変更する必要がある方法に関する非常に詳細な情報が提供される傾向があるため、非推奨の警告が個人的に好きです。
これは適切なエラーではなく、単なる警告です。
非推奨のクラスは、将来のリリース(この場合はSymfonyの)で削除される予定のクラスです。
使用をやめることをお勧めします。また、同じタスクを実行するために完全に引き継ぐ新しい(および代替)クラスTokenStorage
およびAuthorizationChecker
を示します。
その警告を見るのはとても面倒です。同時に、警告をオフにしたくない。ですから、コードを変更して取り除くための例を挙げると便利かもしれません。 HWIOAuthBundle
のOAuthUtils
クラスを変更する方法は次のとおりです。まず、/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の両方を使用できます。