Secure モジュール
このシンプルな Secure モジュールは、アプリケーションの基本的な認証および認可管理をセットアップする手助けとなります。このモジュールは、 @With
アノテーションを使うことで容易にコントローラに追加することのできるインターセプタ一式を定義する、シンプルな controllers.Secure
コントローラを提供します。
モジュールのセットアップ
アプリケーションで Secure モジュールを利用可能にする
/conf/dependencies.yml
ファイルの require:
の後に次の行を追加することで、Secure モジュールを有効にします:
require:
- play -> secure
その後、 play dependencies
コマンドを実行してモジュールをアプリケーションに追加します。
デフォルトの Secure ルートの取り込み
conf/routes
ファイルに次の行を追加することで、モジュールのデフォルトのルートを取り込みます:
# Import Secure routes
* / module:secure
デフォルトのルートファイルの使用は必須ではないことに 注意 してください。独自のルートを定義することも、これら 2 つを混ぜ合わせることも可能です。
コントローラの保護
コントローラを保護するために必要なのは、 @With
で注釈することだけです。例えば、以下のようにします:
@With(Secure.class)
public class Application extends Controller {
public static void index() {
render();
}
}
このコントローラは自動的にデフォルトの認証ページで保護されます。
認証メカニズムのカスタマイズ
デフォルトでは、このログインページはどのような login/password も受け付けます。これをカスタマイズするには、アプリケーションが Security プロパイダを提供する必要があります。まずは controllers.Secure.Security
クラスを継承するクラスを、 controllers
パッケージに作成してください。その後、 authenticate(String username, String password)
メソッドをオーバーライドします。
package controllers;
public class Security extends Secure.Security {
static boolean authenticate(String username, String password) {
User user = User.find("byEmail", username).first();
return user != null && user.password.equals(password);
}
}
アプリケーションが認証イベント (onAuthenticated, onDisconnected) にどのように反応すべきかカスタマイズするために、他のメソッドも同様にオーバーライドできることを 確認 してください。
接続したユーザの検索
たった今、作成した Security ヘルパを、接続したユーザを検索するためにアプリケーションコードから再利用することができます。
@With(Secure.class)
public class Application extends Controller {
public static void index() {
String user = Security.connected();
render(user);
}
}
認証チェックの追加
コントローラアノテーション
Secure モジュールに、接続したユーザがこのアクションをコールするために必要な権限を持っているかチェックすることを伝えるために、 @Check
アノテーションをコントローラクラスまたはアクションメソッドのどちらにでも使用することができます。
例えば、あるアクションメソッド権限のあるユーザに制限するためには、次のようにします:
@With(Secure.class)
public class Application extends Controller {
…
@Check("isAdmin")
public static void delete(Long id) {
…
}
}
ひとつのコントローラにあるすべてのアクションメソッドを制限するためには、コントローラクラスに @Check
アノテーションを使用します:
@With(Secure.class)
@Check("administrator")
public class Application extends Controller {
…
public static void delete(Long id) {
…
}
public static void edit(Long id) {
…
}
}
デフォルトでは、secure モジュールは常に全てのチェックを承認します。作成した Security
クラスでひとつ以上のメソッドをオーバーライドして、カスタマイズしなければなりません。
package controllers;
public class Security extends Secure.Security {
…
static boolean check(String profile) {
User user = User.find("byEmail", connected()).first();
if ("administrator".equals(profile)) {
return user.admin;
}
else {
return false;
}
}
}
テンプレートタグ
テンプレート中で権限をチェックするために secure.check
を使うこともできます。これは、コントローラのアノテーションによって保護された操作に対するユーザインタフェースコントロールを、条件付きで表示する場合に便利です。例えば、次のようにします:
#{secure.check "administrator"}
<a href="@{delete(item.id)}">Delete</a>
#{/secure.check}
このタグは認証されたユーザにのみ、そのボディをレンダリングするので、‘Delete’ リンクはユーザが delete
コントローラアクションの実行を許可された場合にのみ表示されます。
設定
アプリケーションの application.conf に設定を追加することで、デフォルト値を上書きすることができます。
secure.rememberme.duration
secure モジュールの rememberme cookie の有効期限です。
デフォルト: 30d
secure.rememberme.duration=30d
コマンド
Secure モジュールはログインページをオーバーライドするために使用する play secure:override
を提供しているので、アプリケーションをカスタマイズすることができます。これは、モジュールからアプリケーションにコピーされた関連するファイルが替わりに使用されることで動作します。
play secure:override
は play secure:ov
と省略することができます。
CSS のオーバーライド
ログインページのルックアンドフィールを編集してカスタマイズできるように、CSS ファイルをアプリケーションにコピーするには、 play secure:override --css
コマンドを使用します。
ログインテンプレートのオーバーライド
デフォルトのログインページテンプレートをオーバーライドするように、ログインページのビューテンプレートをアプリケーションにコピーするには、 play secure:override --login
コマンドを使用します。
メインレイアウトのオーバーライド
ログインページが使用するレイアウトをオーバーライドするように、メインレイアウトをコピーするには、 play secure:override --layout
コマンドを使用します。