つかびーの技術日記

(情報)工学修士, 元SIer SE, 現Web系 SEの技術blogです。Scala, Java, JS, TS, Python, Ruby, AWS, GCPあたりが好きです。

@PermitAllを勘違い(認証不要)して時間を無駄にした

   

WebアプリケーションまたはWebサービスを作る場合、認証をかけたいリソースと認証をかけたくないリソースを区別したい場合があると思います。当たり前ですが、ログインページとかは認証をかけたくないです。

JavaとJAX-RS(Jersey)でWebサービスを作成する場合、以下のようなクラスを作ります。

package com.tsukaby.jerseyauth;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("public")
public class PublicService {

  @GET
  @Path("info")
  @Produces(MediaType.APPLICATION_JSON)
  public Information getIt() {
    return new Information("Title", "Public Information.");
  }
}

このWebサービスに認証を導入する場合は、BASIC認証などを用いると思いますが、上記のinfoリソースには認証をかけないことを考えます。

このとき、@PermitAllアノテーションをgetIt()メソッドに付ければ解決すると思っていたのですが、どうやら違うようで・・・。web.xmlの設定次第ですが、認証は必要なようです。

PermitAllはあくまで認可という意味のようです。全てのユーザに上記リソースへの操作を認める、と。

permitって許可するという意味なので、てっきり認証すっ飛ばしてリソースへの操作を認めるのかと思いきや、違うんですね。ネーミングが悪いのか、自分の英語力が足りないのか・・・。

 - Java