私は、初めて Symfony2 を使用して、Doctrine2 に支援された小さなプロジェクトに取り組んでいます。現在、symfony2 のセキュリティ コンポーネント、正確にはドキュメントに記載されている認証メカニズムに苦労しています。
フォームベースの認証を使用したいのですが、ドキュメントに記載されているすべてのことを行いました:
次のような security.yml 構成ファイルがあります。
security.config:
firewalls:
admin:
pattern: /admin/.*
form-login: true
logout: true
login_path: /login
check_path: /validateLogin
always_use_default_target_path: false
target_path_parameter: target
check_page:
pattern: /validateLogin
form-login: true
login_path: /login
check_path: /validateLogin
always_use_default_target_path: false
target_path_parameter: target
public:
pattern: /.*
security: false
providers:
admin:
password_encoder: md5
entity:
class: AdminBundle:User
property: username
access_control:
- { path: /admin/.*, role: ROLE_ADMIN }
- { path: /validateLogin, role: IS_AUTHENTICATED_ANONYMOUSLY }
role_hierarchy:
ROLE_ADMIN: ROLE_USER
devcommentsで同様のスレッドを読んだ後、 check_page は「セキュアレス」領域から除外されます。
私のルーティング構成には、認証用の 2 つのルールが含まれています。
_security_login:
pattern: /login
defaults:
_controller: PublicBundle:Auth:index
_security_check:
pattern: /validateLogin
ユーザーを表すために使用しているエンティティ クラスは Doctrine2 エンティティであり、AccountInterface を実装しています。
<?php
namespace Application\AdminBundle\Entity;
use Symfony\Component\Security\User\AccountInterface;
/**
* @orm:Entity
*/
class User implements AccountInterface
{
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @orm:Column(type="string", length="255")
*/
protected $username;
/**
* @orm:Column(type="string", length="40")
*/
protected $password;
public function getId()
{
return $this->id;
}
public function setId($id)
{
$this->id = $id;
}
public function getUsername()
{
return $this->username;
}
public function setUsername($username)
{
$this->username = $username;
}
public function getPassword()
{
return $this->password;
}
public function setPassword($password)
{
$this->password = $password;
}
/**
* Implementing the AccountInterface interface
*/
public function __toString()
{
return $this->getUsername();
}
public function getRoles()
{
return array('ROLE_ADMIN');
}
public function eraseCredentials()
{
}
public function getSalt()
{
return $this->getId();
}
}
クラス AuthController では、symfony2 ドキュメントのサンプル コードを使用しています。
public function indexAction()
{
if ($this->get('request')->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
$error = $this->get('request')->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
} else {
$error = $this->get('request')->getSession()->get(SecurityContext::AUTHENTICATION_ERROR);
}
return
$this->render(
'PublicBundle:Auth:index.twig',
array(
'last_username' => $this->get('request')->getSession()->get(SecurityContext::LAST_USERNAME),
'error' => $error));
}
ここで問題が発生します: http://symfony2.localhost/app_dev.php/admin/test からhttp ://symfony2.localhost/app_dev.php/loginへのリダイレクトルールは機能しますが、ユーザー名/パスワードを入力してログインフォームを送信した後、エラー メッセージなしでログイン URL に再度リダイレクトされます。
これはおそらく非常に基本的な問題であることはわかっていますが、symfony2 に関するドキュメントはまだあまりないため、このような質問をするのに適した場所だと思います。一般に、symfony2 プロジェクト内には魔法のように (もちろん DI に裏打ちされた) 動作しているように見えるいくつかのポイントがあり、学習プロセスを少し難しくしています。認証がどのように機能するかについての私の考えは、validateLogin アクションをキャッチし、User エンティティのエンティティ リポジトリを探し、findOneBy('username' => $username) を呼び出し、パスワードを比較する魔法の Controller があるということです...これは右?
ヒントを事前にありがとう、私はこの問題をさらに数時間グーグルで調べています... :)
ポール