OAuth2客户端怎么配置登陆失败重定向url?

来源:6-11 基于JWT实现SSO单点登录2

他门说这就是人生

2019-10-24

我设置困难的原因:

  1. public class SecurityConfig extends WebSecurityConfigurerAdapter里如果要配置failureUrl,需要配置

    http.formLogin()或http.oauth2Login(),作为oauth2客户端,formLogin不合适本场景;oauth2Login我不会使用。所以此方案放弃。

  2. 如果在.properties文件里做配置,找了,没有此项配置。放弃。

  3. 重新配置一个OAuth2ClientAuthenticationProcessingFilter,并加到过滤器链里。我的代码如下:

  4. @Bean
    public OAuth2ClientAuthenticationProcessingFilter oAuth2ClientAuthenticationProcessingFilter() {
        OAuth2ClientAuthenticationProcessingFilter oAuth2ClientAuthenticationProcessingFilter = new OAuth2ClientAuthenticationProcessingFilter("/login");
        SimpleUrlAuthenticationFailureHandler simpleUrlAuthenticationFailureHandler = new SimpleUrlAuthenticationFailureHandler("/error/session-expired.html");
        oAuth2ClientAuthenticationProcessingFilter.setAuthenticationFailureHandler(simpleUrlAuthenticationFailureHandler);
        AuthorizationCodeResourceDetails authorizationCodeResourceDetails = new AuthorizationCodeResourceDetails();
        authorizationCodeResourceDetails.setClientId(clientId);
        authorizationCodeResourceDetails.setClientSecret(clientSecret);
        List<String> scopes = new ArrayList<>();
        scopes.add("all");
        authorizationCodeResourceDetails.setScope(scopes);
        authorizationCodeResourceDetails.setUserAuthorizationUri(serverAddr + "/oauth/authorize");
        authorizationCodeResourceDetails.setAccessTokenUri(serverAddr + "/oauth/token");
        authorizationCodeResourceDetails.setPreEstablishedRedirectUri("http://192.168.101.232:8082/login");
        OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(authorizationCodeResourceDetails);
        oAuth2ClientAuthenticationProcessingFilter.setRestTemplate(oAuth2RestTemplate);
        DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey("cdslyk912");
        TokenStore tokenStore = new JwtTokenStore(converter);
        defaultTokenServices.setTokenStore(tokenStore);
        oAuth2ClientAuthenticationProcessingFilter.setTokenServices(defaultTokenServices);
        return oAuth2ClientAuthenticationProcessingFilter;
    }

    由于是自己配置OAuth2ClientAuthenticationProcessingFilter,所以不止要配simpleUrlAuthenticationFailureHandler,其他的也得重新配。authorizationCodeResourceDetails.setPreEstablishedRedirectUri我不知道该怎么配,配成客户端的登录处理器,由于这个url没有在queryString上传state参数,所以授权失败。但是我这里获取不到state参数啊。放弃。

现在我的做法很不好,我把包名和spring security的SimpleUrlAuthenticationFailureHandler建成一样的,并设置defaultFailureUrl,覆盖spring security的配置,成功了。


但jojo老师,有配置的方法可以完成吗?我想要多一个方法。

写回答

1回答

JoJo

2019-10-28

我们就是用的formLogin配置的啊,“formLogin不合适本场景”是出于什么考虑?

0
1
他门说这就是人生
这是oauth2的客户端,登录用的是OAuth2ClientAuthenticationProcessingFilter。用formLogin来配置的话,实际上是配置的UsernamePasswordAuthenticationFilter,我这理解对吗?对的话,所以说不合适本场景啊。
2019-10-28
共1条回复

Spring Security技术栈开发企业级认证与授权

Spring Security技术栈,REST风格开发常见接口,独立开发认证授权模块保证REST服务安全

2662 学习 · 1561 问题

查看课程