このシンプルな Secure モジュールは、アプリケーションの基本的な認証および認可管理をセットアップする手助けとなります。このモジュールは、 @With アノテーションを使うことで容易にコントローラに追加することのできるインターセプタ一式を定義する、シンプルな controllers.Secure コントローラを提供します。
/conf/dependencies.yml ファイルの require: の後に次の行を追加することで、Secure モジュールを有効にします:
require:
- play -> secure
その後、 play dependencies コマンドを実行してモジュールをアプリケーションに追加します。
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 コントローラアクションの実行を許可された場合にのみ表示されます。
Secure モジュールはログインページをオーバーライドするために使用する play secure:override を提供しているので、アプリケーションをカスタマイズすることができます。これは、モジュールからアプリケーションにコピーされた関連するファイルが替わりに使用されることで動作します。
play secure:override は play secure:ov と省略することができます。
ログインページのルックアンドフィールを編集してカスタマイズできるように、CSS ファイルをアプリケーションにコピーするには、 play secure:override --css コマンドを使用します。
デフォルトのログインページテンプレートをオーバーライドするように、ログインページのビューテンプレートをアプリケーションにコピーするには、 play secure:override --login コマンドを使用します。
ログインページが使用するレイアウトをオーバーライドするように、メインレイアウトをコピーするには、 play secure:override --layout コマンドを使用します。