spring-security 如何指定接收到令牌后或失败时的自定义返回URL?

piztneat  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(137)

我有以下设置:

  • 我有一个Angular前端和Spring-Boot后端
  • 用户正在通过普通表单登录到我的后端
  • 我正在集成需要oauth2身份验证的第三方API,因此用户需要向我的应用程序授予权限,以便我可以代表他们从该第三方加载数据
  • 我在HttpSecurity配置中配置了oauth2Client()以启用oauth2

目前发生的情况是:
1.前端正在调用一个端点以从第三方获取数据,比如/api/get-library,它试图访问第三方的受保护资源。
1.这将导致来自第三方的401,并触发Spring中的oauth流
1.用户被重定向到第三方以授予对我的应用程序的权限
1.授予权限后,用户首先被重定向到指定为spring.security.oauth2.client.registration.foobar.redirect-uri的URL I
1.然后, Boot 检索令牌并为我的主体存储它
1.之后,Sping Boot将重定向到原始url/api/get-library
1.但这只是一些RestController,因此在浏览器中向用户显示一些JSON数据
所以第六点是我的问题。我不希望用户最终被重定向到某个API端点,我希望他被重定向到我的Angular应用程序的一个页面。
如果用户拒绝授予权限,也会出现类似的问题。然后,用户被重定向到spring.security.oauth2.client.registration.foobar.redirect-uri,查询参数为?error=true。同样,在这种情况下,我希望重定向到我的Angular应用程序。
最初,我想我也可以配置oauth2Login(),它有一个failureHandlersuccessHandler,但在我的例子中没有调用它们,因为我在这里没有进行登录。
那么有人能帮助我吗?我如何为oauth2Client配置我自己的重定向?在成功的情况下,以及失败的情况下?这里有哪些相关的Bean?

lawou6xi

lawou6xi1#

我找到了解决办法:
要检查的主要Spring类是OAuth2AuthorizationCodeGrantFilter。当用户在OAuth提供程序中授予/拒绝权限时,将调用此筛选器。
不幸的是,没有办法为此过滤器配置自定义重定向URL,所以我实现了一个黑客解决方案:
1.我将OAuth2AuthorizationCodeGrantFilter的实现复制到一个自己的类中,并使用2个参数对其进行了扩展:然后我在processAuthorizationResponse方法中使用这些URL来重定向到我的URL
1.然后,我将自己的AppOAuth2AuthorizationCodeGrantFilter放在HttpSecurityConfig中的Spring Filter之前,因此使用它来代替Spring版本
1.在我的Angular应用程序中,我在调用可能需要OAuth身份验证的端点之前,将确切位置存储在应用程序中。因此,当用户代理返回到Angular应用程序时,我可以导航回原始位置。
这感觉很糟糕,所以如果有人能想出更好的解决方案,我会很高兴听到。:-)
Spring的一些代码片段:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        ...
        http.addFilterBefore(oAuth2AuthorizationCodeGrantFilter(), OAuth2AuthorizationCodeGrantFilter.class);
        ...
    }

    @Bean @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Bean
    public AppOAuth2AuthorizationCodeGrantFilter oAuth2AuthorizationCodeGrantFilter() throws Exception {
        return new AppOAuth2AuthorizationCodeGrantFilter(
                clientRegistrationRepository,
                oAuth2AuthorizedClientRepository,
                authenticationManagerBean(),
                oauthSuccessRedirectUrl,
                oauthErrorRedirectUrl);
    }

相关问题