問題タブ [symfony-security]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
symfony - Symfony2: 2 つのユーザー プロバイダーを使用して 2 つのファイアウォールで正常にログインできない
フロントエンドとバックエンドで別々のファイアウォールと認証システムを使用したい Web サイトをセットアップしています。だから私security.yml
は以下のように構成されています。初期の開発段階で in_memory ユーザー プロバイダーを使用しています。
バックエンド部分は関係ないので割愛します。省略された部分がコメントアウトされている場合、問題はまだそこにあります。
問題は、上記の構成ではフロントエンド認証が機能しないことです。これが私がしたことです:
- http://example.com/login にアクセスしてください
- 資格情報 (user:12345) を入力し、[ログイン] をクリックします。
- http://example.com/login_checkはユーザーを認証します
- 認証サービスは、ユーザーをhttp://example.com/にリダイレクトします。エラーはスローされません。実際、debug_redirects オプションをオンにすると、リダイレクト ページで「ユーザー」が認証されていることが明確に示されます。
予想される動作: セキュリティ トークンは、リダイレクトに従って「ユーザー」としてログインし、インデックス ページに戻ることを示す必要があります。
実際の動作: リダイレクトに従ってインデックス ページに戻った後も、セキュリティ トークンは「匿名」ログインを表示します。
しかし、ほぼ同じ設定 (パスとルート名は同じではありません) で、バックエンド部分は正しく動作します。
調査の結果、原因は現在のユーザー プロバイダーの記述方法にあることがわかりました。frontend_in_memoryセクションは、バックエンド認証に使用されるbackend_in_memoryの下に配置されていることに注意してください。そのため、フロントエンド ファイアウォールのfrontend_in_memoryプロバイダーを明示的に指定します。そして、それはうまくいきます-フロントエンドのログインページで「user:12345」でログインする必要があります。「admin」でログインしても機能しません。したがって、正しいユーザー プロバイダーを使用している必要があります。しかし、 backend_in_memoryである最初のユーザープロバイダーから「ユーザー」アカウントをまだ検索しているため、フレームワークがセキュリティトークンを正しく更新できないと思われます。実際、次の変更のいずれかを使用して、上記の構成を機能させることができます。
- backend_in_memoryプロバイダーのユーザー リストに「ユーザー」ログインを追加します(パスワードは同じである必要はありません)。
- frontend_in_memoryをbackend_in_memoryと交換して、frontend_in_memoryが最初のユーザー プロバイダーになるようにします。
もちろん、それらはこの問題を解決する正しい方法ではありません。バックエンドに「ユーザー」アカウントを追加しても意味がありません。2 つのユーザー プロバイダーの順序を入れ替えると、フロントエンドは修正されますが、バックエンドは壊れます。
何が問題なのか、これを修正する方法を知りたいです。ありがとうございました!
symfony - 管理セクションの FOSUserBundle アクセス制御により、匿名ユーザーが許可されます
FOSUserBundle を使用して、管理者ユーザーのみが管理者セクションにアクセスできるようにしようとしています。
ただし、認証なしで管理者 URL ( www.foo.local/app_dev.php/admin
) にアクセスすると、アクセスが許可されます。
Symfony のデバッグ ツールバーに表示されますLogged in as anon.
公式ドキュメントに従って FOSUserBundle を構成しました
security.yml 構成は次のとおりです。
管理セクションへのアクセスを許可するために を要求しない理由がわかりませんROLE_ADMIN
。何かアイデアはありますか?
security - symfony2 FOSUserBundle ユーザーからロールを切り離す
ユーザーを複数の会社にリンクできるアプリケーションがあります。会社との manyToMany 関係は、Associate と呼ばれる識別エンティティです。
この Associate エンティティに、私の FOSUserBundle User エンティティとまったく同じロール機能を付与したいと考えています。重要 : ユーザーが 1 つの会社の role_manager を持っている場合、そのユーザーが属する別の会社の特定の機能にアクセスする権限も付与されるべきではありません。
これを行うためのきれいな方法はありますか?たとえば、$this->getUser->getAssociate->hasRole('ROLE_MANAGER') が true かどうかを確認したいと思います。
自分のエンティティ Associate に役割配列を与えるとどうなりますか? 私はそれが十分に安全ではないことを読みましたか?なんで?とにかく私のユーザーが FOS セキュリティ ログイン チェックを通過しなければならない場合、そのセキュリティを破るために誰かが何ができるでしょうか?
投票者の使用が提案されている記事を見つけました。しかし、ルートをフィルタリングするのではなく、ユーザーと会社の間のリンクに対して条件を確認したいので、有権者が解決策である場合、どのように使用しますか?
編集:役割を含まない、または異なるロジックを使用したより良い解決策が存在する場合、私はそれについて学ぶことに興味があります!!
php - symfony2 call is_granted invoter: 無限ループを回避するには?
ユーザーで is_granted を呼び出す必要がある投票者を作成しました。
投票者に security.authorization_checker サービスを注入すると、次のエラーが発生します
CheckCircularReferencesPass.php 行 69 の ServiceCircularReferenceException: サービス「manager_voter」の循環参照が検出されました。パス:「manager_voter -> security.authorization_checker -> security.access.decision_manager -> manager_voter」。
コンテナ全体を注入する以外に方法はありませんか? これは正常ですか?
編集:
コントローラーから有権者を呼び出しています:
この投票者では、ユーザーの役割を確認する必要があります。
もちろん、これはループにつながります。そのループを取得しない方法は? ユーザーに対して $user->getRoles を呼び出しても、私の間違いでなければ、ロール階層は考慮されません。
php - Symfony - 投票者の依存関係の競合
過去 3 日間、壁に頭をぶつけているという問題があります (そして、google/stackoverflow の調査ではあまり結果が得られませんでした)。
私は現在、別の開発者 (元の開発者が去った) によって開発されたアプリケーションを保守しています。アプリケーションは Symfony 2.6 にあります。その中には、Voter の概念を通じてアクセスを処理するロジックがあります。アプリケーション ロジックは次のようになります。URL には顧客 (アプリケーション) 名が含まれます。たとえば、顧客を TEST と名付けましょう。URL は次のようになります: myapplication.com/Test この URL にアクセスすると、要求を取得して顧客をルーター コンテキストにアタッチする EventListner (onKernelRequest、31 に接続) があります。ここ:
これにより、基本的に、引数を渡すことでプロバイダー サービスをロードできます。
その理由は、アプリケーションには独自のデータベース (デフォルト) があり、各顧客には独自のデータベースがあるためです (サードパーティの ETL によって生成されるため、これらのデータベースのセグメントのみを制御できます)。
現在、サービスの投票者の定義は、これらのプロバイダーのいずれかに依存しています。基本的に、顧客のデータベースから可能な許可のリスト (マップ) を取得します (顧客ごとに異なります)。残念ながら、現時点では、すべてがクラッシュします。「... という名前のマッピング ファイルが見つかりません」というエラーが表示されます。彼は、クライアント マッピング フォルダーではなく、既定のマッピング ファイルからファイルを取得しようとしています。
appdebugProjectContainer を「ハッキング」し、print_r()|die を追加して requestStack を完全に表示すると、完全に空に見えます。(したがって、リクエストはまったく前処理されません)。わからないことがありますか?
symfony - Symfony2 カスタム Voter: Voter 内から getDoctrine にアクセスすることはできません
カスタム Voter を実装しようとしています。
コントローラーから、次のように呼び出します。
最初の行は Project オブジェクトを適切に取得します (ダンプで確認しました)。
問題は有権者の内部で発生します
次のエラーが表示されます
クラス「AppBundle\Security\Authorization\Voter\ProjectVoter」でメソッド「getDoctrine」を呼び出そうとしました。
コントローラーがコントローラーを拡張することを理解しています。そのため、そこで「getDoctrine」を使用できます。Voter 内から自分の DB にアクセスするにはどうすればよいですか?
php - 警告: get_class() は、パラメーター 1 がオブジェクトであると想定しており、文字列が指定されています
サイトへのユーザー アクセスを処理するために、symfony で投票を使用しています。ユーザーが認証されていない場合、次のエラーが表示されます。
投票者が呼び出されるページにユーザーがアクセスしている場合。問題を引き起こしている有権者のコードは次のとおりです。
オブジェクト = 'anon.' の場合。これは、symfony の Web サイトから取得した通常のコードです。もちろん、このコードを変更して、オブジェクトがオブジェクトであるかどうかを確認できますが、これが正常かどうか疑問に思っていましたか? 有権者が非オブジェクトで呼び出されないことを望んでいたでしょう。
編集: SuportsClass と SupportsAttribute もデフォルトのものです:
php - security.yml 内の現在の URL を取得する
私の要件では、ユーザーは URL が記載されたメールを受け取ります。ユーザーがクリックすると、認証プロセスを介してその URL に移動します。
したがって、クリックした URL にユーザーをリダイレクトするには、ここで説明した方法 (リダイレクト時にパラメーターを渡す) を使用しています。ここでは、リダイレクト URL を次のようなパラメーターとして渡す予定です。
login_path: %accounts_host%/signin?redirect=%need_current_url_here%
内security.yml
でキャプチャし$url=$_GET['redirect'];
、それに応じてリダイレクトを提供します。
私のクエリは、security.yml
にアタッチできるように、 内から現在の URL にアクセスするにはどうすればよいかということlogin_path
です。
私はこれにまったく慣れておらず、例/ドキュメントは非常に高く評価されています。:)
PS
認証は別のsymonfy2アプリケーション内で行われ、その時点でreferer
コマンドがnullになるため使用できません。そのため、リダイレクト URL をパラメーターとして渡そうとしています。:)