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セキュリティシステムが「ログイン」ページとは何かを決定するメカニズムは何ですか?
解決策は、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」に送信しますが、「/」または他の選択したものでも機能します)。この行を明示的に追加せずに、チュートリアルがどのようにリダイレクトを実行するのかわかりません。
フォローしてください 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