SlideShare a Scribd company logo
管理画面 WEBアプリケーション
アクセスコントロール
@brtriver
(株)VOYAGE GROUP, (株)Zucks
About Me
前田 雅央 @brtriver
Symfony ユーザー会
Silex 日本語ドキュメント
https://speakerdeck.com/bash0c7/phpconference2013presentation-number-phpcon2013
管理画面作ったことありますか?
運用しやすい管理画面とは?
permanent link な URL
運用しやすい管理画面
permanent link が無いと…
営業 エンジニア
どのページですか?
../user/articles/list
お客さんは誰…?
お客さんから表示されるはずのデータが見えないという
問い合わせが..
ユーザーIDがURLから判別不能
BAD
ログイン後のURLが1つだけ
裏でajaxが画面遷移せずがんばりすぎ
無駄にPOSTで画面遷移
確認しようにもパラメータが不明
permanent link が無いと…
営業 エンジニア
お客さんから表示されるはずのデータが見えないという
問い合わせが..
URLください
../user/brtriver/articles/list
確認します
permanent link があると…
URLを貰えば同じ画面がみれる
Better
アクセスログからも調査しやすい
permanent link があると…
ACL … Access Control List
運用しやすい管理画面
できるだけシンプルなACL
ロールごとに 機能 制限
user
管理画面
一覧
編集
admin
表示の制限もある
ロールごとに機能 + 表示 制限
user
admin
一覧画面
・userの場合はナビを変えたい
・userは自身のデータのみ閲覧可
・編集先リンクはadminのみ表示
・更新日時はadminのみ表示
Controller で権限ごとの処理…
Viewで権限チェック …
現場はもっと複雑だった
supervisor
ロールが階層になることも
admin
A B C
a b c
user
α β γ
viewer
Symfony2 の chain で解決
ACLでの事故は怖い
営業 エンジニア
管理者(admin)だけ編集できるようにして
修正しました
お客さん(user)の画面でも編集できるんだけど…
ええぇぇ!!!1
Routing
権限チェック
Controller
権限チェック
View
権限チェック
Request Response
権限チェック
Request Response
Admin
User
複雑な 権限チェック パターン
Controller View を
Controller View
Request Response
Routing
権限チェック
Controller View
Request Response
Admin
User
権限チェック から開放
Routing に規約(prefix)を追加
• ROLE_USER は /user/で始まるパス
• ROLE_USER は {user_id} をURLに含むこと
規約
Symfony には 高機能な ACL/ACE がある
http://symfony.com/doc/current/cookbook/security/acl.html
http://symfony.com/doc/current/cookbook/security/acl.html
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 がある … が
Symfony 的には Custom Voter を作る
http://symfony.com/doc/current/cookbook/security/voters.html
やりたいのは
ルーティング時にチェックするだけ…
シンプルに
Routing の規約をチェックする
Listenerを作るという方法でも可能
Routing の規約をチェックするListener
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
権限を意識せずに修正が可能
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 だけ表示する内容を変更しよう
修正
まとめ
Good
• ユーザーが見ている画面と全く同じ画面で確認できる
• 機能単位で作業分担していてもロールの実装を気にしなくて良い
• 仕様変更、追加で権限周りのミスが無い
• 権限周りはEventListenerの単体テストをしっかり書けば安心
BAD
• 冗長的なコード
• 全ロールに対する修正作業だと修正箇所(ファイル)が多い
• security.yml が難しすぎ
まとめ
運用しやすい安全な管理画面は
ACLがシンプルであること

More Related Content

管理画面のアクセスコントロール