【问题标题】:how to use If else statement java to a auth filter如何使用 If else 语句 java 到 auth 过滤器
【发布时间】:2019-09-20 07:47:30
【问题描述】:

我有两种通过电话号码和用户名密码验证用户的方法,我试图在我的过滤器中同时使用这两种方法,我应该使用 If 和 Else 还是有更好的方法?我已经尝试了下面的代码,尽管它不起作用。

 @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        try {
            String jwt = getJwtFromRequest(request);


            if (StringUtils.hasText(jwt) && tokenProvider.validateToken(jwt)) {

                Long userId = tokenProvider.getUserIdFromJWT(jwt);

                UserDetails userDetails = customUserDetailsService.loadUserById(userId);
                UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
                authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));

                SecurityContextHolder.getContext().setAuthentication(authentication);

            } else if (StringUtils.hasText(jwt) && jwtTokenHandler.validateToken(jwt)) {

                String phoneNumber = jwtTokenHandler.validatePhone(jwt) ;

                UserDetails userDetailsUser = customUserDetailsService.loadUserPhone(phoneNumber);

                UsernamePasswordAuthenticationToken authenticationMobile = new UsernamePasswordAuthenticationToken(userDetailsUser, null, userDetailsUser.getAuthorities());
                authenticationMobile.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));

                SecurityContextHolder.getContext().setAuthentication(authenticationMobile);
             }


        } catch (Exception ex) {
            logger.error("Could not set user authentication in security context", ex);
        }

        filterChain.doFilter(request, response);
    }

【问题讨论】:

  • 我个人会使用两个过滤器:BasicAuthFilter(用户名和密码)和PhoneAuthFilter
  • 感谢@YassinHajaj 我做了一些调整并使用了 catch (Exception),它确实工作得很好,尽管我仍然不知道这是否是最好的选择。

标签: java spring spring-boot jwt-auth


【解决方案1】:

我个人会使用两个过滤器BasicAuthFilterPhoneAuthFilter,但是如果你想快速重构现有的,这里有一个提议

protected void doFilterInternal(HttpServletRequest request, 
                                HttpServletResponse response, 
                                FilterChain filterChain) 
                                    throws ServletException, 
                                           IOException {
    try {
        String jwt = getJwtFromRequest(request);
        if (StringUtils.hasText(jwt)) {
            UserDetails userDetails = null;
            if (tokenProvider.validateToken(jwt)) {
                Long userId = tokenProvider.getUserIdFromJWT(jwt);
                userDetails = customUserDetailsService.loadUserById(userId);
            } else if (tokenProvider.validatePhone(jwt)) {
                String phoneNumber = jwtTokenHandler.validatePhone(jwt);
                userDetails = customUserDetailsService.loadUserPhone(phoneNumber);
            }

            if (userDetails != null) {
                UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
                authenticationMobile.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                SecurityContextHolder.getContext().setAuthentication(authenticationMobile);
            }
        }
    } catch (Exception ex) {
        logger.error("Could not set user authentication in security context", ex);
    }

    filterChain.doFilter(request, response);
}

【讨论】:

    【解决方案2】:

    我不认为这是最好的选择,但它确实有效。

    protected void doFilterInternal(HttpServletRequest request,
                                        HttpServletResponse response,
                                        FilterChain filterChain)
                throws ServletException,
                IOException {
    
            try {
                String jwt = getJwtFromRequest(request);
    
                if (StringUtils.hasText(jwt)) {
    
                    UserDetails userDetails = null;
    
                    if (tokenProvider.validateToken(jwt)) {
                        Long userId = tokenProvider.getUserIdFromJWT(jwt);
                        userDetails = customUserDetailsService.loadUserById(userId);
                    }
    
                    if (userDetails != null) {
                        UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
                        authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                        SecurityContextHolder.getContext().setAuthentication(authentication);
    
                    }
                }
            } catch (Exception tryAgain) {
                logger.error("Could not set user authentication. Let's try with mobile auth", tryAgain);
                try {
                    String jwt = getJwtFromRequest(request);
    
                    if (StringUtils.hasText(jwt)) {
    
                        UserDetails userDetails = null;
    
                        if (jwtTokenHandler.validateToken(jwt)) {
                            String phoneNumber = jwtTokenHandler.validatePhone(jwt);
                            userDetails = customUserDetailsService.loadUserPhone(phoneNumber);
                        }
    
                        if (userDetails != null) {
                            UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
                            authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                            SecurityContextHolder.getContext().setAuthentication(authentication);
    
                        }
                    }
                } catch (Exception error) {
                    logger.error("Still could not set user authentication in security context", error);
                }
    
            }
    
            filterChain.doFilter(request, response);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2019-04-09
      • 1970-01-01
      相关资源
      最近更新 更多