【问题标题】:Controlling authentication redirects with JHipster, Spring Security, and oauth2使用 JHipster、Spring Security 和 oauth2 控制身份验证重定向
【发布时间】:2018-08-09 02:44:17
【问题描述】:

我希望能够在用户未登录时控制自动重定向到 oauth2 授权服务器。

我生成了一个 JHipster Gateway 项目,下面的代码只是它的一个副本,添加了oAuth2ClientContextFilter 变量,即autowired,然后我将它用于setRedirectStrategy

但是,当需要使用它时,变量是NULL。我做错了什么?

@EnableOAuth2Sso
@Configuration

public class OAuth2SsoConfiguration extends WebSecurityConfigurerAdapter {

    private final RequestMatcher authorizationHeaderRequestMatcher;

    private final CorsFilter corsFilter;

    @Autowired
    private OAuth2ClientContextFilter oAuth2ClientContextFilter;

    private final Logger log = LoggerFactory.getLogger(OAuth2SsoConfiguration.class);

    public OAuth2SsoConfiguration(@Qualifier("authorizationHeaderRequestMatcher")
                                  RequestMatcher authorizationHeaderRequestMatcher, CorsFilter corsFilter) {
        this.authorizationHeaderRequestMatcher = authorizationHeaderRequestMatcher;
        this.corsFilter = corsFilter;
        oAuth2ClientContextFilter.setRedirectStrategy(new RedirectStrategy() {

            @Override
            public void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) throws IOException {
                // My Code Here
            }

        });

    }

    @Bean
    public AjaxLogoutSuccessHandler ajaxLogoutSuccessHandler() {
        return new AjaxLogoutSuccessHandler();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
            .disable()
            .addFilterBefore(corsFilter, CsrfFilter.class)
            .headers()
            .frameOptions()
            .disable()
        .and()
            .logout()
            .logoutUrl("/api/logout")
            .logoutSuccessHandler(ajaxLogoutSuccessHandler())
        .and()
            .requestMatcher(new NegatedRequestMatcher(authorizationHeaderRequestMatcher))
            .authorizeRequests()
            .antMatchers("/api/profile-info").permitAll()
            .antMatchers("/api/**").authenticated()
            .antMatchers("/management/health").permitAll()
            .antMatchers("/management/**").hasAuthority(AuthoritiesConstants.ADMIN)
            .anyRequest().permitAll();
    }
}

【问题讨论】:

    标签: java spring-security oauth-2.0 jhipster spring-security-oauth2


    【解决方案1】:

    混合自动装配策略(字段自动装配和构造函数自动装配)并不好,因为构造发生在@Autowired 之前。所以要么将过滤器注入构造函数:

    private OAuth2ClientContextFilter oAuth2ClientContextFilter;
    
    public OAuth2SsoConfiguration(
        @Qualifier("authorizationHeaderRequestMatcher")RequestMatcher authorizationHeaderRequestMatcher, 
        CorsFilter corsFilter, 
        OAuth2ClientContextFilter oAuth2ClientContextFilter
    ) {
        this.authorizationHeaderRequestMatcher = authorizationHeaderRequestMatcher;
        this.corsFilter = corsFilter;
        this.oAuth2ClientContextFilter = oAuth2ClientContextFilter;
        .....
    }
    

    或将 RequestMatcher 和 CorsFilter 移出构造函数参数并表示它们 @Autowired

    【讨论】:

    • 请注意,如果你使用@Autowired字段(使用构造函数是better choice),你可以为方法使用@PostConstruct注解,当字段获取时它会被调用分配的值。
    猜你喜欢
    • 2014-09-15
    • 2017-06-14
    • 2015-04-27
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2015-07-30
    相关资源
    最近更新 更多