Documentation

You are viewing the documentation for Play 1. The documentation for Play 2 is here.

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:overrideplay secure:ov と省略することができます。

CSS のオーバーライド

ログインページのルックアンドフィールを編集してカスタマイズできるように、CSS ファイルをアプリケーションにコピーするには、 play secure:override --css コマンドを使用します。

ログインテンプレートのオーバーライド

デフォルトのログインページテンプレートをオーバーライドするように、ログインページのビューテンプレートをアプリケーションにコピーするには、 play secure:override --login コマンドを使用します。

メインレイアウトのオーバーライド

ログインページが使用するレイアウトをオーバーライドするように、メインレイアウトをコピーするには、 play secure:override --layout コマンドを使用します。