The net is vast
プログラミングや、コンピュータなどの備忘録です。 主にRuby, Java, Linux, 等を扱います。アルゴリズムも扱いたいな。
23:08

[Play2.0][Java] アクションの実行にログインを要求する方法

Category: , By jx
さて、PlayFramework2.0を勉強し始めました。今、Scalaを勉強しつつPlay2.0をJavaで利用しようとしています。そこで色々勉強していますが、今回はアクションの実行にログインを要求する方法を書いてみます。

play.mvc.Security.Authenticatedアノテーション

ログインを要求するためにはplay.mvc.Security.Authenticatedアノテーションをメソッドに追加します。こうするとログインしているかどうかを確認する事が出来ます。ログインしているかどうかは、play.mvc.Security.Authenticatorでチェックされます。ソースコードを見てみると分かるのですが、sessionにusernameという値が含まれているかどうかをチェックしています。
    /** 
     * Handles authentication.
     */
    public static class Authenticator extends Results {
    
        /** 
         * Retrieves the username from the HTTP context; the default is to read from the session cookie.
         *
         * @return null if the user is not authenticated.
         */
        public String getUsername(Context ctx) {
            return ctx.session().get("username");
        }   
    
        /** 
         * Generates an alternative result if the user is not authenticated; the default a simple '401 Not Authorized' page.
         */
        public Result onUnauthorized(Context ctx) {
            return unauthorized(views.html.defaultpages.unauthorized.render());
        }   
    
    }

ログインの判定をカスタマイズする

play.mvc.Security.Authenticatedアノテーションにはvalueのデフォルト値としてSecurity.Authenticatorが設定されていますので、ここの値を変更する事で挙動を変更する事が出来ます。下のようなクラスを作成して、play.mvc.Security.Authenticatedの引数として指定すれば、このクラスが認証のチェッククラスとして動作します。
public class Auth extends Security.Authenticator {
 @Override
 public String getUsername(Context context) {
  String user = context.session().get("userName");
  return "admin".equals(user) ? user : null;
 }

 @Override
 public Result onUnauthorized(Context arg0) {
  return redirect(routes.Application.loginForm());
 } 
}
  @Authenticated(Auth.class)
  public static Result index() {
    return ok(index.render("Your new application is ready."));
  }