0

私のSpring MVC Webアプリには、かなり単純化されたSpring Security構成があります。事前認証フィルターを介して認証されるリモート Web アプリケーションから REST 要求を受信して​​います。単純にリクエスト内のヘッダーを探し、存在する場合は、その文字列値 (ユーザー名) を認証オブジェクトとして返します。これは正常に機能し、リクエストが来ると、ユーザーは認証されます。

何らかの理由で、パターン ベースのセキュリティ antMatcher またはコントローラー メソッド アノテーション付きセキュリティを強制しようとすると、クライアントで CORS エラーが発生します。このクロスドメイン環境で実際のリクエストを実行できるようにするには、アクセスを完全に開いたままにしておく必要があります。

私の問題は、しばらくすると、セッションが期限切れになったように見えることです。ユーザーがコントローラーの 1 つをヒットし、プリンシパル オブジェクトからユーザー名を取得しようとすると、プリンシパルが null であるため、NullPointerException が発生します。有効期限が切れると、AnonymousAuthFilter が作動し、ユーザーが匿名として接続できるようになります。

私は完全にステートレスな認証セッションを望んでいないと仮定しています.Websocketのセッションも使用しているため、メッセージングテンプレートを使用して「convertAndSendToUser」を使用する場合、ユーザー名を提供する必要があり、Springはウェブソケットセッション。ただし、着信リクエストにプリンシパルが割り当てられていないかどうかをセキュリティチェーンに認識させ、PreAuthFilter を介してリクエストを強制的に戻し、セッションを再確立したいと考えています。

これは可能ですか?

以下は、セキュリティ構成ファイルの configure メソッドの概要です。

@Override
    protected void configure(HttpSecurity http) throws Exception {
        // Create authentication providers and authentication manager
        List<AuthenticationProvider> authenticationProviders = new ArrayList<>(1);
        AuthenticationProvider authProvider = preAuthenticatedAuthenticationProvider();
        authenticationProviders.add(authProvider);
        AuthenticationManager authenticationManager = authenticationManager(authenticationProviders);

        // Create the pre-authentication filter
        MyPreAuthFilter myPreAuthFilter = myPreAuthFilter(authenticationManager);
        myPreAuthFilter.setAuthenticationManager(authenticationManager);

        // configure http security
        http
                .csrf().disable()
                .headers().addHeaderWriter(new XFrameOptionsHeaderWriter(XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN))
                .and()
                .authenticationProvider(authProvider)
                .addFilter(myPreAuthFilter)
                .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                .antMatchers("/stomp/**").permitAll()
                .antMatchers("/**").permitAll();
    }

更新:だから私は http オブジェクトでこのメソッドについて学びました:

.anonymous().disable()

ただし、それを使用すると、すべての CORS リクエストが再び失敗します。問題は、特にプリフライト OPTIONS リクエストにあると思います。これは認証できません。匿名でアクセスできる必要があります。したがって、クロスドメイン認証から必要な動作を得るには、匿名フィルターを無効にする必要があると思いますが、そうすると、クロスドメイン要求を実行できるという重要なテナントの 1 つが壊れます。うーん。OPTIONS以外のすべてのリクエストで匿名を無効にする方法を知っている人はいますか?

4

1 に答える 1

2

Web アプリケーション初期化子 (または web.xml) のスプリング セキュリティ フィルター チェーンの前CORS フィルター を配置して、CORS の問題を解消します (Access-Control-Allow-Origin をリクエストのオリジンに一致するように設定して、REST リクエストのオリジンを許可します)。 .

次に、役割ベースの (ant マッチャーと JSR-250 アノテーションによる) 承認を使用できます。匿名ユーザーを無効にすることは、あなたが提供したユースケースには適していないようです。

于 2015-07-16T04:19:42.223 に答える