簡體   English   中英

處理Spring MVC中的JWT異常

[英]Handling JWT Exception in Spring MVC

我正在嘗試在REST Api上實現令牌身份驗證,目前我指的是這篇文章 在文章中討論了使用創建令牌JWT的問題,但我當前的問題是,每次將無效令牌傳遞給我的應用程序時,都會創建一個異常,即JwtException.class,我想捕獲該異常使用我的全局異常處理程序類。 我還嘗試將JwtException包裝在我的應用程序的異常類中,但無效但未捕獲異常。

@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(value={JwtException.class})
public ResponseEntity<?> handleTokenException(JwtException e){
    return new ResponseEntity<Object>(HttpStatus.UNAUTHORIZED);
}

@ExceptionHandler(value={InvalidAuthTokenException.class})
public ResponseEntity<?> handleTokenException(InvalidAuthTokenException e){
    return new ResponseEntity<Object>(HttpStatus.UNAUTHORIZED);
    }
}

您的GlobalExceptionHandler不是真正的全局,它只會捕獲控制器中發生的異常(因此是ControllerAdvice ),您遇到的異常發生在servlet過濾器中,這是Spring Security幾乎完成所有工作的地方。 這個小圖表可能有助於解釋我在說什么:

PreFilters < - 在進入控制器之前執行,JWT的解密正在這里發生

Controller < - ControllerAdvice將捕獲此處拋出的所有異常

PostFilters < - 退出控制器后執行

幸運的是,Spring Security已經有了一些機制來處理在過濾器中解密JWT等事情時發生的異常。 您將需要像這樣更新SpringSecurityConfig。 注意它的重要的是,是的ExceptionTranslationFilter您StatelessAuthenticationFilter(或任何你命名,其中JWT解密發生在過濾器) 之后

    @Configuration
    @EnableWebSecurity
    @Order(2)
    public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            ExceptionTranslationFilter = new ExceptionTranslationFilter(new AuthenticationExceptionHandler());

            http.addFilterAfter(new StatelessAuthenticationFilter(tokenAuthenticationService),
                            ExceptionTranslationFilter.class);
        }


    }

    public class AuthenticationExceptionHandler implements AuthenticationEntryPoint {
        public void commence(HttpServletRequest request, HttpServletResponse, AuthenticationException e) throws IOException, ServletException {
            //Logic on how to handle JWT exception goes here
        }
    }

    public class StatelessAuthenticationFilter extends GenericFilterBean {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            try {
                //DECRYPT YOUR JWT
            } catch (Exception e) {
                 throw new AuthenticationException();//If you get an exception wrap it in a AuthenticationException (or a class that extends it)
            }
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM