0

웹 서비스를 호출하여 기존의 스프링 보안 인증을 무시하고 실패 할 경우, 제 3 자 로그인 페이지를 리디렉션해야합니다.기존 스프링 보안 인증을 덮어 씁니다.

이 인증 웹 서비스를 호출하려면 ServletRequest 매개 변수를 가져와야하며 리디렉션을 위해 ServletResponse에 액세스해야합니다.

따라서 ServletRequest 및 ServletResponse 매개 변수로 일부 인증 방법을 찾아야합니다.

하지만 여전히 이러한 ProcessingFilter 또는 AuthenticationProvider를 찾지 못했습니다.

스프링 보안에 따르면 나는 AuthenticationProvider 관련 인증 메소드를 오버라이드해야한다고 생각합니다.

은 사용 사례에 따르면, 나는 봄 보안 사전 인증,

을 구현해야하지만, 문제는 인증 매개 변수를 가진 PreAuthenticatedAuthenticationProvider 관련 '인증합니다'방법이다.

PreAuthenticatedAuthenticationProvider

public class PreAuthenticatedAuthenticationProvider implements 
     AuthenticationProvider, InitializingBean, Ordered { 

    public Authentication authenticate(Authentication authentication) {} 

} 

솔루션으로서, AuthenticationFailureHandler의 사용자 정의 구현을 사용할 가능성이있다?

감사합니다.

나는 다음과 같은 방법으로 문제가 해결있어 한

답변

0

,

오버라이드 doFilter 방법

@Override 
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) req; 
    HttpServletResponse response = (HttpServletResponse) res; 

    try { 

     // Get current Authentication object from SecurityContext 
     Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 

     // Call for third party WS when the Authenticator object is null 
     if (auth == null) { 

      logger.debug("doFilter : Proceed the authentication"); 

      String appId = "My_APP_ID"; 
      String redirectURL = request.getRequestURL().toString(); 

      // Call for third party WS for get authenticate 
      if (WS_Authenticator.isAuthenticated(appId, redirectURL)) { 

       // Successfully authenticated 
       logger.debug("doFilter : WS authentication success"); 

       // Get authenticated username 
       String userName = WS_Authenticator.getUserName();    

       // Put that username to request 
       request.setAttribute("userName", userName); 

      } else { 

       String redirectURL = WS_Authenticator.getAuthorizedURL(); 
       logger.debug("doFilter : WS authentication failed"); 
       logger.debug("doFilter : WS redirect URL : " + redirectURL); 

       ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); 
       ((HttpServletResponse) response).sendRedirect(redirectURL); 

       // Return for bypass the filter chain 
       return; 
      } 

     } else { 
      logger.debug("doFilter : Already authenticated"); 
     } 

    } catch (Exception e) { 
     logger.error("doFilter: " + e.getMessage());    
    } 

    super.doFilter(request, response, chain); 
    return; 
} 

무시 AbstractPreAuthenticatedProcessingFilter 사용자 정의를 구현가 만난 getPreAuthenticatedCredentials

오버라이드 loadUserDetails 방법 A CustomAuthenticationUserDetailsServiceImpl 구현

@Override 
protected Object getPreAuthenticatedCredentials(HttpServletRequest request) { 

    // Get authenticated username 
    String[] credentials = new String[1]; 
    credentials[0] = (String) request.getAttribute("userName"); 

    return credentials; 
} 
  • HOD

    public class CustomAuthenticationUserDetailsServiceImpl implements AuthenticationUserDetailsService<Authentication> { 
    
        protected static final Logger logger = Logger.getLogger(CustomAuthenticationUserDetailsServiceImpl.class); 
    
        @Autowired 
        private UserDataService userDataService; 
    
        public UserDetails loadUserDetails(Authentication token) throws UsernameNotFoundException { 
    
         // Get authenticated username 
         String[] credentials = (String[]) token.getCredentials(); 
         String userName = credentials[0]; 
    
         try { 
    
          // Get user by username 
          User user = userDataService.getDetailsByUserName(userName); 
    
          // Get authorities username    
          List<String> roles = userDataService.getRolesByUserName(userName);   
          user.setCustomerAuthorities(roles); 
          return user; 
    
         } catch (Exception e) { 
          logger.debug("loadUserDetails: User not found! " + e.getMessage()); 
          return null; 
         }  
        } 
    }