좋은 예제를 찾고 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 사용)를 설정하여 나중에 엔드 포인트에서 사용할 수 있습니다.
비누 헤더의 유효성을 검사하고 해당 헤더에서 보안 컨텍스트를 설정하는 데 사용할 수있는 메커니즘은 무엇입니까?
덕분에, 나는 이것이 작동 방법에 대해 여전히 혼란 스러워요. UserDetailsService 클래스에는 User 객체를 반환하는 loadByUsername 메서드가 있습니다. 이 클래스가 호출되기 전에 인증 부분이 이미 완료되었다고 가정 할 수 있습니까? –
그래서 여전히 사용자의 암호를 얻기 위해 콜백 처리기를 구현해야합니다. 내가 이해할 수있는대로, 나는 다음을 할 필요가있다. 1) 콜백 handleUSernameToken 메소드를 구현하여 데이터베이스에서 패스워드를 가져오고 콜백에 그것을 설정한다. 2) Spring은 내가 설정 한 것과 SOAP 메시지 패스워드를 일치시킴으로써 사용자 이름을 인증한다. 콜백에서 3) loadByUsername 메소드를 구현하여 User 객체를 만듭니다. 이 스킴에 내 사용자 정의 LoginContext 객체를 어디에 둘 것인지, User 클래스에는 사용할 수있는 속성이없는 것으로 보입니다. –
왜 필요한지 잘 모르겠습니다. 만약 당신이'WS-Security'를 따르는다면 요청에 모든 것이 있어야합니다 ... –