为了账号安全,请及时绑定邮箱和手机立即绑定

只有在抛出运行时异常时才发现线程绑定请求

只有在抛出运行时异常时才发现线程绑定请求

哈士奇WWW 2022-05-12 18:59:18
我需要在我的代码上使用请求范围来获取和使用 JWT 令牌上的授权,每个请求都有一个单独的令牌,每个请求都需要一个独立的验证。当任何请求过程没有任何错误时,一切正常,但如果应用程序抛出任何运行时异常,例如 BadRequestException,响应中断:java.lang.IllegalStateException: No thread-bound request found我正在使用带有 Ribbon、Feign 和 Hystrix 的 Spring 云环境。这里的 WebSecurityConfigurerAdapter 实现:    @Override    protected void configure(HttpSecurity http) throws Exception {        http.cors()                .and()                .authorizeRequests()                .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()                .anyRequest().authenticated()                .and()                .addFilterBefore(new JWTAuthenticationFilter(enviroment, jwtAuthenticationService, authScope),                        UsernamePasswordAuthenticationFilter.class)                .httpBasic()                .and()                .csrf().disable();        http.headers().frameOptions().sameOrigin();    }我之前的过滤器    package br.com.qisi.twoface.configuration.security.jwt;    import br.com.qisi.twoface.authorization.model.Authorization;    import br.com.qisi.twoface.configuration.security.AuthRequestScope;    import io.jsonwebtoken.Claims;    import org.springframework.security.core.Authentication;    import org.springframework.security.core.context.SecurityContextHolder;    import org.springframework.web.filter.GenericFilterBean;    import javax.servlet.FilterChain;    import javax.servlet.ServletException;    import javax.servlet.ServletRequest;    import javax.servlet.ServletResponse;    import javax.servlet.http.HttpServletRequest;    import javax.servlet.http.HttpServletResponse;    import java.io.IOException;    }
查看完整描述

1 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

根据@dur 评论,我将代码更改为使用 SecurityContextHolder 并获取当前线程上下文授权。


我现在的组件:


    @Component

    public class AuthRequestInfo {


        private AuthorizationService authorizationService;


        public AuthRequestInfo(AuthorizationService authorizationService) {

            this.authorizationService = authorizationService;

        }


        public Authorization getAuthorization(){

            Claims claims = (Claims)SecurityContextHolder.getContext().getAuthentication().getPrincipal();

            String key = claims.get(KEY_CLAIM).toString();

            return this.authorizationService.findByExampleOptional(Authorization.builder().key(key).build())

                    .orElseThrow(new UnauthorizedException(INVALID_TWOFACE_AUTHORIZATION_HEADER));

        }


    }

SecurityContextHolder 身份验证是在 GenericFilterBean 上设置的。现在我没有问题。


查看完整回答
反对 回复 2022-05-12
  • 1 回答
  • 0 关注
  • 74 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信