【问题标题】:Set cookies on successful OAuth2 Authentication in Spring Security OAuth2 implementation在 Spring Security OAuth2 实现中设置成功 OAuth2 身份验证的 cookie
【发布时间】:2019-12-07 14:24:08
【问题描述】:

根据https://spring.io/guides/tutorials/spring-boot-oauth2/ 提供的指南,我正在实施一个有点简单的 OAuth2 安全 Web 应用程序

我需要在成功登录后设置一些任意 cookie 以简化我的前端浏览器应用程序中的操作。

目前我有一个使用 OAuth2 对具有 Google 帐户的用户进行身份验证的工作设置。

我打算在我的 WebSecurityConfigurerAdapter configure() 函数中使用 HttpSecurity oauth2Login().successHandler() 但是我没有提供 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;
    }
}

添加在成功身份验证期间会发生一次的逻辑的正确方法是什么,特别是在我有权访问用户 Principal 对象之后。

【问题讨论】:

    标签: java spring spring-boot cookies spring-security-oauth2


    【解决方案1】:

    我对@9​​87654321@ 的实现做了一些进一步的挖掘,并找到了以下可能的解决方案。

    可以插入默认情况下未实现的自定义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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-28
      • 2015-04-27
      • 2014-09-15
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 2019-01-24
      • 2016-01-05
      相关资源
      最近更新 更多