2014-07-25 4 views
1

좋은 예제를 찾고 cannopt를 찾았습니다. SOAP 헤더에서 사용자 이름과 암호를 가져오고 우리의 기존 서비스 메소드를 사용하여 인증 한 후 스프링 보안 컨텍스트를 설정하려고합니다. Wss4jSecurityInterceptor를 구현하고 헤더 요소의 유효성을 검사합니다. 콜백 또는 다른 메커니즘에서 수행해야하는 작업은 나중에 끝점에서 액세스 할 수 있도록 uthetication 컨텍스트를 만드는 것입니다.SOAP 메시지 인증

그러나 비밀번호를 입력하지 않으면 비밀번호 오류가 계속 발생하므로 콜백이 올바른 위치라고 생각하지 않습니다. 나는 봄의 보안과 통합에 익숙하지 않다.

구성 :

 <bean id="SOAPSecurityInterceptor" class="com.ps.snt.ws.interceptor.SOAPSecurityInterceptor"> 
     <property name="validationActions" value="UsernameToken"/> 
     <property name="validationCallbackHandler" ref="callbackHandler"/> 
    </bean> 
    <bean id="callbackHandler" class="com.ps.snt.ws.interceptor.SOAPSecurityValidationCallbackHandler"> 
    </bean> 

콜백 :

내 요구 사항은 간단
public class SOAPSecurityValidationCallbackHandler extends SimplePasswordValidationCallbackHandler { 

    @Override 
     protected void handleUsernameToken(WSPasswordCallback callback) throws IOException, UnsupportedCallbackException { 
      System.out.println("In security callback " + callback.getPassword()); 

      boolean valid = true; 

      String token = callback.getIdentifier(); 
      String password = callback.getPassword(); 
      Integer zoneID = null; 

      String username = null; 


      StringBuffer errorMessages = new StringBuffer(); 

      if(StringUtils.isEmpty(token)) { 
       errorMessages.append("Username token cannot be empty"); 
       valid = false; 
      } else { 
       Pattern pattern = Pattern.compile("^[\\w]+\\d\\d\\d\\d\\d"); 
       Matcher matcher = pattern.matcher(token); 
       if(!matcher.matches()) { 
        valid = false; 
        errorMessages.append("Username token must be in the format '[email protected]'."); 
       } 
       else { 
        String[] parts = token.split("@"); 
        username = parts[0]; 
        zoneID = Integer.parseInt(parts[1]); 
       } 

      } 

      if(StringUtils.isEmpty(password)) { 
       errorMessages.append("Password cannot be empty."); 
       valid = false; 
      } 


      if(valid && username != null && zoneID != null) { 
       LoginService loginService = new LoginService(); 
       LoginContextDO loginContextDO = loginService.getAuthenticatedLoginContext(username, password, zoneID); 

       AbstractAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, password); 
       authentication.setDetails(loginContextDO); 
       authentication.setAuthenticated(true); 

       SecurityContextHolder.getContext().setAuthentication(authentication); 


      } else { 
       System.out.println("Authetnication failed!"); 
      } 

     } 
} 

: 이 - 사용자 이름과 암호 를 검색 - - 우리의 기존 서비스를 호출 SOAP 헤더 (작품) 을 확인 우리의 로그인 컨텍스트를 만드십시오. - 스프링 보안 컨텍스트 (자세한 내용은 logincontext 사용)를 설정하여 나중에 엔드 포인트에서 사용할 수 있습니다.

비누 헤더의 유효성을 검사하고 해당 헤더에서 보안 컨텍스트를 설정하는 데 사용할 수있는 메커니즘은 무엇입니까?

답변

1

SpringSecurityPasswordValidationCallbackHandler입니다. Spring WS docs에서 :

SpringSecurityPasswordValidationCallbackHandler는 스프링 보안 UserDetailService를 사용하여 일반 텍스트와 다이제스트 패스워드의 유효성을 검사합니다. 이 서비스를 사용하여 토큰에 지정된 사용자의 암호 (다이제스트)를 검색합니다. 그런 다음이 세부 정보 개체에 포함 된 암호 (의 다이제스트)를 메시지의 다이제스트와 비교합니다. 동일하면 사용자가 성공적으로 인증되고 UsernamePasswordAuthenticationToken이 SecurityContextHolder에 저장됩니다. userDetailsService를 사용하여 서비스를 설정할 수 있습니다. 또한로드 된 사용자 세부 정보를 캐시하기 위해 userCache 속성을 설정할 수 있습니다. 답장을

<beans> 
    <bean class="org.springframework.ws.soap.security.wss4j.callback.SpringDigestPasswordValidationCallbackHandler"> 
     <property name="userDetailsService" ref="userDetailsService"/> 
    </bean> 

    <bean id="userDetailsService" class="com.mycompany.app.dao.UserDetailService" /> 
    ... 
</beans> 
+0

덕분에, 나는 이것이 작동 방법에 대해 여전히 혼란 스러워요. UserDetailsService 클래스에는 User 객체를 반환하는 loadByUsername 메서드가 있습니다. 이 클래스가 호출되기 전에 인증 부분이 이미 완료되었다고 가정 할 수 있습니까? –

+0

그래서 여전히 사용자의 암호를 얻기 위해 콜백 처리기를 구현해야합니다. 내가 이해할 수있는대로, 나는 다음을 할 필요가있다. 1) 콜백 handleUSernameToken 메소드를 구현하여 데이터베이스에서 패스워드를 가져오고 콜백에 그것을 설정한다. 2) Spring은 내가 설정 한 것과 SOAP 메시지 패스워드를 일치시킴으로써 사용자 이름을 인증한다. 콜백에서 3) loadByUsername 메소드를 구현하여 User 객체를 만듭니다. 이 스킴에 내 사용자 정의 LoginContext 객체를 어디에 둘 것인지, User 클래스에는 사용할 수있는 속성이없는 것으로 보입니다. –

+0

왜 필요한지 잘 모르겠습니다. 만약 당신이'WS-Security'를 따르는다면 요청에 모든 것이 있어야합니다 ... –