web-dev-qa-db-ja.com

Spring Oauth2ログインリダイレクトはどのように機能しますか?

Spring Boot Oauth2チュートリアルをいじくり回してきましたが、かなり重要な要素が機能していないようです。

https://spring.io/guides/tutorials/spring-boot-oauth2/

承認サーバーとして実行したい。理解できる限り指示に従いましたが、/ oauth/authorizeエンドポイントに移動すると、403Forbidden応答しか得られません。チュートリアルで設定されたHttpSecurity構成を考えると、これは実際に私には理にかなっています。

protected void configure(HttpSecurity http) throws Exception {
    http
      .antMatcher("/**")
      .authorizeRequests()
        .antMatchers("/", "/login**", "/webjars/**")
        .permitAll()
      .anyRequest()
        .authenticated()
        .and().logout().logoutSuccessUrl("/").permitAll()
        .and().csrf().csrfTokenRepository(csrfTokenRepository())
        .and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
        .addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class);
}

このチュートリアルのログインページは実際にはメインインデックスであり、Oauthシステムにログインフローをリダイレクトするように指示するチュートリアルには、間違いなく何も表示されません。

これを追加することで、一種の動作を実現できます。

        .and().formLogin().loginPage("/")

...しかし、先に進む前に、これがチュートリアルの問題なのか、それとも実装の問題なのか、それとも何か他のものなのかを本当に理解したかったのです。 Oauthセキュリティシステムが「ログイン」ページとは何かを決定するメカニズムは何ですか?

10
Ryan

解決策は、SecurityConfig.configure呼び出しに以下を追加することでした。

@Override
protected void configure(HttpSecurity http) throws Exception {
    AuthenticationEntryPoint aep = new AuthenticationEntryPoint() {

        @Override
        public void commence(HttpServletRequest request,
                HttpServletResponse response,
                AuthenticationException authException) throws IOException,
                ServletException {
            response.sendRedirect("/login");
        }
    };

    http.exceptionHandling()
            .authenticationEntryPoint(aep)

これは、認証フローを特定のURLにリダイレクトします(この場合、「/ login」に送信しますが、「/」または他の選択したものでも機能します)。この行を明示的に追加せずに、チュートリアルがどのようにリダイレクトを実行するのかわかりません。

9
Ryan

フォローしてください this 回答。 1。Apacheプロキシでヘッダーを設定する必要があります。

<VirtualHost *:443>
    ServerName www.myapp.org
    ProxyPass / http://127.0.0.1:8080/
    RequestHeader set X-Forwarded-Proto https
    RequestHeader set X-Forwarded-Port 443
    ProxyPreserveHost On
    ... (SSL directives omitted for readability)
</VirtualHost>

2。これらのヘッダーを使用するようにSpringBootアプリに指示する必要があります。したがって、application.properties(またはSpring Bootsがプロパティを理解するその他の場所)に次の行を配置します。

server.use-forward-headers=true
3
Kushal