web-dev-qa-db-ja.com

JAX-RS:保護方法RESTエンドポイント?

使ってます JBoss ASおよびJAX-RSRESTエンドポイントを作成します。

私のクラスが次のようになっているとしましょう

@Path("/users")
public class UserResource {


  @GET
  public Response getAccount() {
    return "hello";
  }
}

現在、getAccountは現在認証されていません

希望
-コードをgetAccountにヒットしたときにユーザーが認証されるように、認証を追加したい
-可能であれば、XML構成ではなくアノテーションによって認証を駆動したい
-データベースの比較を行い、ユーザーが有効かどうかを確認したい

問題
-一度も実行したことがないため、実装方法がわかりません
-私はたくさんググって、ジャージーの例を見つけました

[〜#〜]更新[〜#〜]
-リクエストごとに認証資格情報を送信し、notセッションを作成したい

簡単な例を1つ紹介してください。そこから拡張していきます。

15
daydreamer

これを次のコードで解決しました。

トークンメカニズムは、更新すると更新されます

私が持っているインターセプターを変更することでこれを解決しました、以下はコードです

注釈

@Inherited
@InterceptorBinding
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface SecurityChecked {

}

リソースクラス

public class SecureResource {

    @GET
    @SecurityChecked
    public Response getUser() {
        return Response.ok("authenticated successfully!").build();
    }
}

インターセプタークラス

@Interceptor
@Provider
@ServerInterceptor
@SecurityChecked
public class SecurityCheckInterceptor implements PreProcessInterceptor, AcceptedByMethod {
    private static final Logger LOGGER = LoggerFactory.getLogger(SecurityCheckInterceptor.class);

    @Nullable
    @Override
    public ServerResponse preProcess(final HttpRequest request, final ResourceMethod method) throws Failure, WebApplicationException {
        final List<String> authToken = request.getHttpHeaders().getRequestHeader("X-AUTH");

        if (authToken == null || !isValidToken(authToken.get(0))) {
            final ServerResponse serverResponse = new ServerResponse();
            serverResponse.setStatus(Response.Status.UNAUTHORIZED.getStatusCode());
            return serverResponse;
        }

        return null;
    }

    private static boolean isValidToken(@Nonnull final String authToken) {
        LOGGER.info("validating token: " + authToken);
        return true;
    }

    @SuppressWarnings("rawtypes")
    @Override
    public boolean accept(final Class declaring, final Method method) {
        // return declaring.isAnnotationPresent(SecurityChecked.class); // if annotation on class
        return method.isAnnotationPresent(SecurityChecked.class);
    }
}

次に、JBossにリソースクラスをデプロイし、コマンドラインで次のコマンドを発行して、統合テストを実行します

curl --header 'X-AUTH: 1a629d035831feadOOO4uFReLyEW8aTmrCS' http://localhost:8080/market-1.0-SNAPSHOT/rest/login
curl --header 'InvalidHeader: InvalidHeaderValue' http://localhost:8080/market-1.0-SNAPSHOT/rest/login
11
daydreamer

必要なのは、JAX RSエンドポイントの前にあるステートレススプリングセキュリティ構成です。あなたが解決しようとしている正確な問題に対処しましたが、共有する独自のコードがありません。

ここにあなたが求めている正確なことをしたプロジェクトがあります、ある賢い人があなたのためにそれをすべてやった;)

https://github.com/philipsorst/angular-rest-springsecurity

魔法とは?

  1. 認証を行う保護されていないURLが1つあり、ユーザーの役割も設定されています。
  2. 次に、ある種のトークンを返し、それを以降のすべての呼び出しで予期されるキャッシュのどこかに入れます。
  3. 他の保護されたリソースに対する新しいリクエスト時に、トークンがキャッシュ/セッションストアに存在するかどうかを確認します(有効なトークンを追跡するための何らかのメカニズムが必要です)
  4. トークンが再送信されて有効な場合は、Spring Securityでプログラムによるログインを実行して、Springが提供するすべてのセキュリティ機能(注釈、JSTLタグなど)を確実に使用できるようにします。
  5. トークンの検証に合格すると、コントローラ(別名JAX RSリソース)にログインしているユーザーの詳細が表示され、セキュリティをさらに処理できます。
  6. トークンが有効でないか存在しない場合、適切な応答を返す障害エンドポイントによってトラップされます(401)

次のリンクを参照して、ステートレススプリングセキュリティの構成方法を理解してください..、https://github.com/philipsorst/angular-rest- springsecurity/blob/master/src/main/resources/context.xml

ユーザーが初めて検証され、トークンが生成される方法を確認します。https://github.com/philipsorst/angular -rest-springsecurity/blob/master/src/main/Java/net/dontdrinkandroot/example/angularrestspringsecurity/rest/resources/UserResource.Java

これは、トークンチェック後にすべてのリクエストでプログラムによるログインが実行されるクラスです。https://github.com/philipsorst/angular -rest-springsecurity/blob/master/src/main/Java/net/dontdrinkandroot/example/angularrestspringsecurity/rest/AuthenticationTokenProcessingFilter.Java

15
Rakesh Waghela