BackendBundle
APIFrontendBundle
用とAngularJS「クライアント」用の2つのバンドルに分割されたSymfony2アプリケーションがあります。すべてがファイアウォールの下で機能します。
BackendBundle
エンティティを持ち、API ルートを処理します。FrontendBundle
Angular ビュー、ルーティングなどがあり、ワイルドカードを使用したコントローラーは 1 つだけです。
class AngularController extends Controller {
/**
* @Route("/{route}", name="angular_index_all_unmatched_routes", requirements={"route" = ".*"})
* @Template("FrontendBundle::index.html.twig")
*/
public function angularIndexAction($route) {
return ['route' => $route];
}
}
FrontendBundle
ルーティングは の最後のリソースとして定義されapp/config/routing.yml
、他のルートが一致しなかった場合にのみ呼び出されます。そのおかげで、Angular HTML5 モードのルートが直接アクセスされた場合 (たとえば、コピー アンド ペースト) に処理でき、問題なく動作します。
私がやりたいことはAngularController::angularIndexAction()
、匿名ユーザーがすべての一致しないルート (によって処理される) にアクセスできるように、ファイアウォールおよび/またはアクセス制御を定義することです。
なんで?一部の API ルートを (フロントエンド プロキシ経由で) 開き、ユーザー以外がアクセスできるようにしたい (たとえば、ユーザーへのメッセージと共にメールで送信された確認 URL)。
匿名の「Angular」ルートごとにアクセス制御リストをハードコーディングしたくありません。API ルートに対してのみ実行したいと考えています。最後に、これらの一致しないルートは Angular のインデックスを開き、ユーザーがログインしているかどうか (完全なレイアウトまたは簡略化されたレイアウトを表示するため) を認識し、Angular ルートを処理し、リクエストが失敗した場合は何らかの「アクセスが拒否されました」というメッセージを表示する必要があります (Symfony リスナーがある場合)そのためのAngularの$provide
インターセプター)。
助言がありますか?
編集:@Security
注釈はAngularController::angularIndexAction()
機能しません。ファイアウォールのエントリ ポイントにリダイレクトされます。
Edit2:ここにの断片がありますsecurity.yml
firewalls:
unsecured:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
anonymous: true
secured:
pattern: '^.*$'
form_login:
login_path: /our-provider/login
check_path: /our-provider/callback/
anonymous: true
entry_point: our_provider.entry_point
access_control:
- { path: '^/our-provider/(login(/[a-zA-Z]+)?|logout|redirect|callback)', roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: '^/', roles: ROLE_USER }
{ path: '^/', roles: ROLE_USER }
ユーザーがログインしていない場合、すべてのルートがログインページにリダイレクトされることはわかっています。それは明らかだと思い、言及しませんでした。私が欲しいのは、各フロントエンドの「プロキシルート」を明示的に定義せずに、一致したルートを強制ROLE_USER
し、一致しないものを許可することです。IS_AUTHENTICATED_ANONYMOUSLY
私の場合、404 Symfony ページはありません。すべてがangular_index_all_unmatched_routes
ルートに送られ、そこで Angular ルーティング定義が処理するものがあるかどうかを決定するためです。