Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.



Published on


Published in: Technology, Design


  1. 1. 管理画面 WEBアプリケーション アクセスコントロール @brtriver (株)VOYAGE GROUP, (株)Zucks
  2. 2. About Me 前田 雅央 @brtriver Symfony ユーザー会 Silex 日本語ドキュメント
  3. 3.
  4. 4. 管理画面作ったことありますか?
  5. 5. 運用しやすい管理画面とは?
  6. 6. permanent link な URL 運用しやすい管理画面
  7. 7. permanent link が無いと… 営業 エンジニア どのページですか? ../user/articles/list お客さんは誰…? お客さんから表示されるはずのデータが見えないという 問い合わせが..
  8. 8. ユーザーIDがURLから判別不能 BAD ログイン後のURLが1つだけ 裏でajaxが画面遷移せずがんばりすぎ 無駄にPOSTで画面遷移 確認しようにもパラメータが不明 permanent link が無いと…
  9. 9. 営業 エンジニア お客さんから表示されるはずのデータが見えないという 問い合わせが.. URLください ../user/brtriver/articles/list 確認します permanent link があると…
  10. 10. URLを貰えば同じ画面がみれる Better アクセスログからも調査しやすい permanent link があると…
  11. 11. ACL … Access Control List 運用しやすい管理画面 できるだけシンプルなACL
  12. 12. ロールごとに 機能 制限 user 管理画面 一覧 編集 admin
  13. 13. 表示の制限もある
  14. 14. ロールごとに機能 + 表示 制限 user admin 一覧画面 ・userの場合はナビを変えたい ・userは自身のデータのみ閲覧可 ・編集先リンクはadminのみ表示 ・更新日時はadminのみ表示
  15. 15. Controller で権限ごとの処理…
  16. 16. Viewで権限チェック …
  17. 17. 現場はもっと複雑だった
  18. 18. supervisor ロールが階層になることも admin A B C a b c user α β γ viewer
  19. 19. Symfony2 の chain で解決
  20. 20. ACLでの事故は怖い 営業 エンジニア 管理者(admin)だけ編集できるようにして 修正しました お客さん(user)の画面でも編集できるんだけど… ええぇぇ!!!1
  21. 21. Routing 権限チェック Controller 権限チェック View 権限チェック Request Response 権限チェック Request Response Admin User 複雑な 権限チェック パターン
  22. 22. Controller View を Controller View Request Response Routing 権限チェック Controller View Request Response Admin User 権限チェック から開放
  23. 23. Routing に規約(prefix)を追加 • ROLE_USER は /user/で始まるパス • ROLE_USER は {user_id} をURLに含むこと 規約
  24. 24. Symfony には 高機能な ACL/ACE がある
  25. 25. Alternatives to ACLs Using ACL's isn't trivial, and for simpler use cases, it may be overkill. If your permission logic could be described by just writing some code (e.g. to check if a Blog is owned by the current User), then consider using voters. A voter is passed the object being voted on, which you can use to make complex decisions and effectively implement your own ACL. Enforcing authorization (e.g. the isGranted part) will look similar to what you see in this entry, but your voter class will handle the logic behind the scenes, instead of the ACL system. Symfony には 高機能な ACL/ACE がある … が
  26. 26. Symfony 的には Custom Voter を作る
  27. 27. やりたいのは ルーティング時にチェックするだけ…
  28. 28. シンプルに Routing の規約をチェックする Listenerを作るという方法でも可能
  29. 29. Routing の規約をチェックするListener
  30. 30. Controller, Viewは同じような処理でもロールごとに分離 Admin login.html.twig list.html.twig show.html.twig SecurityController ArticleController (Bundle/Resources/views/Admin/) (Bundle/Controller/Admin/) User login.html.twig list.html.twig SecurityController (Bundle/Resources/views/User/) (Bundle/Controller/User/) ArticleController
  31. 31. 権限を意識せずに修正が可能 Admin login.html.twig list.html.twig show.html.twig (Bundle/Resources/views/Admin/) User login.html.twig list.html.twig (Bundle/Resources/views/User/) Admin だけ表示する内容を変更しよう 修正
  32. 32. まとめ Good • ユーザーが見ている画面と全く同じ画面で確認できる • 機能単位で作業分担していてもロールの実装を気にしなくて良い • 仕様変更、追加で権限周りのミスが無い • 権限周りはEventListenerの単体テストをしっかり書けば安心 BAD • 冗長的なコード • 全ロールに対する修正作業だと修正箇所(ファイル)が多い • security.yml が難しすぎ
  33. 33. まとめ 運用しやすい安全な管理画面は ACLがシンプルであること