https://spring.io/guides/tutorials/spring-boot-oauth2/で提供されるガイドに従って、ややシンプルなOAuth2で保護されたWebアプリケーションを実装しています
ログインが成功した後、いくつかの任意のCookieを設定して、フロントエンドブラウザーアプリケーションの処理を簡略化する必要があります。
現在、OAuth2を使用してGoogleアカウントでユーザーを認証する作業設定があります。
私HttpSecurity
oauth2Login().successHandler()
は自分のWebSecurityConfigurerAdapter
configure()
機能で使用するつもりでしたが、ClientRegistrationRepository
提供されておらず、自動配線することができないようです。
そのガイドに示されている実装にログイン成功ロジックを追加する方法について文書化されている標準的なアプローチを見つけることができなかったようです。
これは私のメインアプリケーションクラスです。OAuth2クライアントはapplication.ymlファイルで構成されます。
@SpringBootApplication
@EnableOAuth2Client
public class RestApplication extends WebSecurityConfigurerAdapter {
@Autowired
LogoutSuccessHandler logoutHandler;
@Autowired
OAuth2ClientContext oauth2ClientContext;
public static void main(String[] args) {
SpringApplication.run(RestApplication.class, args);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.antMatcher("/**").authorizeRequests()
.antMatchers("/", "/login**", "/error**", "/webapp/**").permitAll()
.anyRequest().authenticated()
.and().addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class)
.logout().logoutSuccessUrl("/").invalidateHttpSession(true).clearAuthentication(true).deleteCookies("JSESSIONID").logoutSuccessHandler(logoutHandler)
// @formatter:on
}
private Filter ssoFilter() {
OAuth2ClientAuthenticationProcessingFilter authFilter = new OAuth2ClientAuthenticationProcessingFilter(
"/login");
OAuth2RestTemplate oAuthTemplate = new OAuth2RestTemplate(oAuth2ResourceDetails(), oauth2ClientContext);
UserInfoTokenServices tokenServices = new UserInfoTokenServices(oAuth2Resource().getUserInfoUri(),
oAuth2ResourceDetails().getClientId());
authFilter.setRestTemplate(oAuthTemplate);
tokenServices.setRestTemplate(oAuthTemplate);
authFilter.setTokenServices(tokenServices);
return authFilter;
}
@Bean
@ConfigurationProperties("oauth.client")
public AuthorizationCodeResourceDetails oAuth2ResourceDetails() {
return new AuthorizationCodeResourceDetails();
}
@Bean
@ConfigurationProperties("oauth.resource")
public ResourceServerProperties oAuth2Resource() {
return new ResourceServerProperties();
}
@Bean
public FilterRegistrationBean<OAuth2ClientContextFilter> oauth2ClientFilterRegistration(
OAuth2ClientContextFilter filter) {
FilterRegistrationBean<OAuth2ClientContextFilter> registration = new FilterRegistrationBean<OAuth2ClientContextFilter>();
registration.setFilter(filter);
registration.setOrder(-100);
return registration;
}
}
特に、ユーザープリンシパルオブジェクトにアクセスした後で、認証が成功したときに一度発生するロジックを追加する正しい方法は何でしょうか。
私はOAuth2ClientAuthenticationProcessingFilter
実装をさらに掘り下げて、次の可能な解決策を見つけました。
SessionAuthenticationStrategy
デフォルトでは実装されていないカスタムをプラグインすることが可能です。インターフェイスのドキュメントには次のように記載されています。
認証が発生したときのHttpSession関連の動作のプラグ可能なサポートを許可します。
をssoFilter()
次のように変更しました。
private Filter ssoFilter() {
OAuth2ClientAuthenticationProcessingFilter authFilter = new OAuth2ClientAuthenticationProcessingFilter(
"/login");
authFilter.setSessionAuthenticationStrategy(new SessionAuthenticationStrategy() {
@Override
public void onAuthentication(Authentication authentication, HttpServletRequest request,
HttpServletResponse response) throws SessionAuthenticationException {
LinkedHashMap<String, Object> userDets = (LinkedHashMap<String, Object>) ((OAuth2Authentication) authentication)
.getUserAuthentication().getDetails();
response.addCookie(new Cookie("authenticated", userDets.get("email").toString()));
}
});
OAuth2RestTemplate oAuthTemplate = new OAuth2RestTemplate(oAuth2ResourceDetails(), oauth2ClientContext);
UserInfoTokenServices tokenServices = new UserInfoTokenServices(oAuth2Resource().getUserInfoUri(),
oAuth2ResourceDetails().getClientId());
authFilter.setRestTemplate(oAuthTemplate);
tokenServices.setRestTemplate(oAuthTemplate);
authFilter.setTokenServices(tokenServices);
return authFilter;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加