The net is vast
プログラミングや、コンピュータなどの備忘録です。 主にRuby, Java, Linux, 等を扱います。アルゴリズムも扱いたいな。
ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示
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."));
  }
 
22:20

java.util.UUIDの落とし穴

Category: By jx
JavaでUUIDを生成するためにはjava.util.UUIDを使用する事ができる。簡単に使うためには以下のようにすれば良い。
String uuid = UUID.randomUUID().toString();
だけれども、これで生成されるものをよく知らないと行けないので、その前にUUIDについて調べてみました。

UUIDについて

UUID と Perl について - daily dayflowerによると、UUIDには5つあります。引用です。
VersionDescription
1時刻とノードをベースに一意値を算出
2POSIX UID を埋め込んだ DCE Security バージョン*2
3ある名前空間に属するユニークな値から MD5 により一意値を算出
4完全ランダム
5ある名前空間に属するユニークな値から SHA-1 により一意値を算出
このうち、複数のマシンで実行したときに最もユニークになる確率が高いものはバージョン1です。おそらく時代的にもそういった用途が多いのではないかと思います。

java.util.UUIDの生成するUUID

これがくせ者なのですが、上記のコードで生成するUUIDのバージョンは実は1ではなくて4なのです。つまり、異なるマシンで実行すると重複する可能性がバージョン1よりも高い事になります。といっても、重複する可能性は相当低いのでしょうが、、、、じゃあ、どのようにしてバージョン1のUUIDを生成したら良いのかを調べてみました。

どうやら、JDKのJavaでversion 1は作れないようです(via Java UUID generators compared)。代わりにUUID – generate UUIDs (or GUIDs) in Javaをつかうというのも手ですね。もし、ほかに何か手があるようでしたら教えてください。