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

Post on 08-Sep-2014

21 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

運用しやすい管理画面とは

Transcript

管理画面 WEBアプリケーション アクセスコントロール

@brtriver(株)VOYAGE GROUP, (株)Zucks

About Me

前田 雅央 @brtriverSymfony ユーザー会 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

ロールが階層になることも

adminA B C

a b cuser

α β γviewer

Symfony2 の chain で解決

ACLでの事故は怖い

営業 エンジニア

管理者(admin)だけ編集できるようにして

修正しました

お客さん(user)の画面でも編集できるんだけど…

ええぇぇ!!!1

Routing

権限チェック

Controller

権限チェック

View

権限チェック

Request Response

権限チェック

Request Response

Admin

User

複雑な 権限チェック パターン

Controller View を

Controller ViewRequest Response

Routing

権限チェック

Controller ViewRequest 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がシンプルであること

top related