当前位置: 首页 > 知识库问答 >
问题:

当antMatchers被允许时令牌过期时,Spring Boot Security Keyclope适配器401响应()

汝岳
2023-03-14

当我登录时,我收到access\u令牌和refresh\u令牌,我将它们作为头发送到Spring Boot服务器的每个HTTP请求中。

我遇到的问题是,当令牌过期时,当我尝试访问无需身份验证即可访问的路由时,我得到401响应,所以结果是我无法访问/v1/users/current,它会检查令牌是否有效,如果不使用刷新令牌并给我一个新的访问令牌。

我现在要做的是使/v1/users/current不需要任何类型的授权/身份验证就可以访问,这样我就可以接收新的访问令牌,我不知道如何使用keydepowebsecurityconfigureradopter实现这一点。

我尝试过使用HandlerInterceptor,但我收到的preHandle请求已经是通过密钥斗篷,我收到类似401的错误。

提前感谢!

编辑:当我使用POSTMAN并向/v1/users/current发送get请求而不使用访问令牌(无身份验证)并且在标头中使用刷新令牌时,我仍然可以访问/v1/users/current路由并获得我需要的新访问令牌。

    @KeycloakConfiguration
class ResourceServerConfiguration extends KeycloakWebSecurityConfigurerAdapter {


    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("*"));
        configuration.setAllowedMethods(Arrays.asList("GET", "POST"));
        //the below three lines will add the relevant CORS response headers
        configuration.addAllowedOrigin("*");
        configuration.addAllowedHeader("*");
        configuration.addAllowedMethod("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }


    @Bean
    public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() {
        return new ServletListenerRegistrationBean<>(new HttpSessionEventPublisher());
    }


    @Autowired
    public void configureGlobal(
            AuthenticationManagerBuilder auth) throws Exception {

        KeycloakAuthenticationProvider keycloakAuthenticationProvider
                = keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(
                new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }

    @Bean
    public KeycloakConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }



    @Override
    public void configure(HttpSecurity http) throws Exception {


        http
                .csrf().disable()
                .cors().configurationSource(corsConfigurationSource())
                .and()
                .authorizeRequests().antMatchers(HttpMethod.GET,"/v1/users/current").permitAll().and()
                .authorizeRequests()
                .antMatchers(HttpMethod.POST,"/login").permitAll()
                .antMatchers(HttpMethod.POST,"/register/admin").hasRole("admin")
                .antMatchers(HttpMethod.POST, "/*")
                .authenticated()
                .anyRequest()
                .permitAll();
    }

/*    @Override
    public void configure(WebSecurity web) throws Exception {

        web.ignoring().antMatchers(HttpMethod.GET,"/v1/users/current");
    }*/

}

共有1个答案

通煜祺
2023-03-14

keydropeateauthenticationprocessingfilter似乎正在检查每个具有授权http头的http请求,这意味着如果您需要在不检查路由的情况下访问路由,那么您可以在没有授权头的情况下发送它。

我已将我的/v1/users/current更改为POST without header,并在请求正文中发送access\u令牌和refresh\u令牌。

 类似资料:
  • 我用ReactJS做单页网页登录。问题是如何以及在哪里保存令牌过期时间。我需要保存在sessionStore中,但当浏览器关闭时,所有的数据都将被删除。本地商店?但数据将永远。或者我可以在localStore中保存并在每个事件中添加函数,该函数检查localStore的过期时间,当事件触发成功时再次更新localStore?但代码看起来很可怕...性能问题呢?这大概可以接受吗?

  • 我对android Gcm令牌过期策略很好奇。当我希望向Gcm服务注册的设备能够接收Gcm推送消息时,我将向API注册它。 然后我会得到一个Gcm令牌“a”。如果我从未在play store上升级我的应用程序版本代码。谷歌会用“B”刷新它并自动终止“A”吗? 如果是,它什么时候做。我看过一些文章说,一旦“A”被“B”刷新,那么当服务器试图向“A”发送消息时,服务器将获得新的注册标识“B”。我现在想

  • 我已经阅读了跑道文档。我特别考虑了以下关于使用的声明: 此请求返回与上述相同的数据,您可以继续反复执行此操作,以保持应用程序的身份验证,而无需要求用户重新身份验证。 这是否意味着将无限期有效或过期: < li >签发后X天;或者 < li >最后一次使用它获取新的< code>access_token后的X天 编辑:请参阅此跑道线程,该线程提出相同的问题,但似乎没有给出任何关于Oauth2.0协议

  • google oauth2刷新令牌何时过期? 我所说的过期是指过期是因为经过了某个时间跨度(不是因为用户已撤销访问权限或用户已请求新的刷新令牌) 我做了一些研究,没有一个引用官方的谷歌文档(我也找不到一个有效的谷歌文档) 其他一些问题表示,由于时间,它从未过期: 谷歌刷新令牌过期了吗? https://community.fitbit.com/t5/web-api-development/inva

  • 目前,我有一个变量来指示标记刷新是否在中进行,在这种情况下,我取消中的所有后续请求,用户必须手动刷新页面,否则我可以注销用户并强制用户登录。 对于上述问题,使用OKHTTP3.x for Android有什么好的解决方案或架构? 编辑:我想解决的问题是一般的,我不想顺序我的电话。也就是说,等待一个调用完成并刷新令牌,然后只在活动和片段级别上发送请求的其余部分。

  • 我写了一个GET API与endpointURL: /service/open/v1/test 在WebSecurity配置适配器下,我的httpSecurity配置如下: 但是在访问API时获取HttpStatus 403。请帮忙。