Secure モジュール
このシンプルな Secure モジュールは、アプリケーションの基本的な認証および認可管理をセットアップする手助けとなります。このモジュールは、 @With アノテーションを使うことで容易にコントローラに追加することのできるインターセプタ一式を定義する、シンプルな controllers.Secure コントローラを提供します。
アプリケーションで Secure モジュールを利用可能にする
/conf/application.conf ファイルに次の行を追加することで、Secure モジュールを有効にします:
# The secure module
module.secure=${play.path}/modules/secure
デフォルトの 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) {
...
}
}
デフォルトでは、secure モジュールは常に全てのチェックを承認します。作成した Security クラスでひとつ以上のメソッドをオーバーライドして、カスタマイズしなければなりません。
package controllers;
public class Security extends Secure.Security {
...
static boolean check(String profile) {
User user = User.find("byEmail", connected()).first();
if ("isAdmin".equals(profile)) {
return user.admin;
}
else {
return false;
}
}
}