コンテナ認証からアプリのDB認証へ

コンテナ認証をやめて、DB認証に作り変えている最中である。
理由は、

  1. 誰にも望まれていないが公開を考えるとそのほうがよいだろうということ
  2. 実際PJなどではアプリでDB認証する場合がほとんどであるので実装を経験しておいたほうがいいかなということ


それぞれ意識するポイントはおそらく、

コンテナ認証

  • 設定はサーブレットコンテナ依存
  • DBにアクセスするjdbcドライバはサーブレットコンテナのクラスパスに必要
    • ちょっと手間ということ
  • 認証されていなかったら自動的にログイン画面に遷移してくれるのはありがたい
  • けど、その後、サーブレットコンテナで認証が終わったら、自動的にアクセスされたURLに飛んでいくので
    • インターセプタでPrincipal#getNameでログインIDを取得して、必要な情報(ユーザ情報)をDBより取得する必要がある。
    • アクセスされたURLはユーザ情報さえあれば閲覧可能にする必要がある。それが無理ならなんとかかんとかするロジックが必要(多分)

アプリによるDB認証

  • 認証ロジックは実装する必要がある。
  • 認証後のURL直アクセスされても、インターセプタで認証画面に飛ばす必要がある
    • ただしログイン前にアクセスする必要のある画面(ログイン画面など)のActionは適用外にしないといけない

で、そのインターセプタを作った。とりあえず何も考えずに。

    public Object invoke(MethodInvocation invocation) throws Throwable {

        Method method = invocation.getMethod();
        Class<?> declaringClass = method.getDeclaringClass();

        if (!declaringClass.equals(LoginAction.class)) {
            if (userDto.id == null) {
                logger.info("session がありません");
                return "/login/?redirect=true";
            }
        }
        return invocation.proceed();
    }

これで動いた。が、しかし、LoginActionをインターセプタ対象からはずすなんてのは設定でできるだろと思い直した。addIgnoreClassPatternなんて便利なものがあった。

http://s2container.seasar.org/2.4/ja/DIContainer.html#AspectAutoRegister

 <!-- セッションチェックを行うインターセプタ(LoginActionだけは対象外とする) -->
 <initMethod name="addCustomizer">
   <arg>
     <component class="org.seasar.framework.container.customizer.AspectCustomizer">
       <property name="useLookupAdapter">true</property>
       <property name="interceptorName">"sessionCheckInterceptor"</property>
	      <initMethod name="addIgnoreClassPattern">
	        <arg>"kizashi.scheduler.action"</arg>
	        <arg>"LoginAction"</arg>
	      </initMethod>
     </component>
   </arg>
 </initMethod>

かんちんプー。

あとはSeleniumのテストに手直しが必要か。