Spring Security SAML Extension 을 Spring Boot 와 통합하려고합니다 .
문제에 관해, 나는 완전한 샘플 응용 프로그램을 개발했습니다. 소스 코드는 GitHub에서 사용할 수 있습니다 :
SDK 내장 응용 프로그램 서버에서 실행되는 Spring Boot 응용 프로그램으로 실행하면 웹 응용 프로그램이 제대로 작동합니다.
불행히도 Undertow / WildFly 에서는 동일한 AuthN 프로세스가 전혀 작동하지 않습니다 .
로그에 따르면 IdP는 실제로 AuthN 프로세스를 수행합니다 UserDetails
. 사용자 지정 구현 지침 이 올바르게 실행됩니다. 실행 흐름에도 불구하고 Spring은 현재 사용자에 대한 권한을 설정하고 유지하지 않습니다.
@Component
public class SAMLUserDetailsServiceImpl implements SAMLUserDetailsService {
// Logger
private static final Logger LOG = LoggerFactory.getLogger(SAMLUserDetailsServiceImpl.class);
@Override
public Object loadUserBySAML(SAMLCredential credential)
throws UsernameNotFoundException, SSOUserAccountNotExistsException {
String userID = credential.getNameID().getValue();
if (userID.compareTo("jdoe@samplemail.com") != 0) { // We're simulating the data access.
LOG.warn("SSO User Account not found into the system");
throw new SSOUserAccountNotExistsException("SSO User Account not found into the system", userID);
}
LOG.info(userID + " is logged in");
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
GrantedAuthority authority = new SimpleGrantedAuthority("ROLE_USER");
authorities.add(authority);
ExtUser userDetails = new ExtUser(userID, "password", true, true, true,
true, authorities, "John", "Doe");
return userDetails;
}
}
디버깅하는 동안 문제가 FilterChainProxy
클래스에 의존한다는 것을 알았습니다 . 런타임시, 속성 FILTER_APPLIED
의이 ServletRequest
이 널 이렇게 봄이 지워, 값을 SecurityContextHolder
.
private final static String FILTER_APPLIED = FilterChainProxy.class.getName().concat(".APPLIED");
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
boolean clearContext = request.getAttribute(FILTER_APPLIED) == null;
if (clearContext) {
try {
request.setAttribute(FILTER_APPLIED, Boolean.TRUE);
doFilterInternal(request, response, chain);
} finally {
SecurityContextHolder.clearContext();
request.removeAttribute(FILTER_APPLIED);
}
} else {
doFilterInternal(request, response, chain);
}
}
에 VM웨어 vFabric TC를 끊다 와 톰캣 , 모든 것을 완전히 잘 작동합니다. 이 문제를 해결하는 데 대한 아이디어가 있습니까?
답변
문제를 조사한 결과 인증 요청에 쿠키 및 참조자가 엉망인 것으로 나타났습니다.
웹 애플리케이션 컨텍스트를 루트 컨텍스트로 변경하면 현재 wildfly 인증이 작동합니다.
<server name="default-server" default-host="webapp">
<http-listener name="default" socket-binding="http"/>
<host name="default-host" alias="localhost" default-web-module="sso.war"/>
</server>
wildfly를 다시 시작하고 쿠키를 지우면 모든 것이 예상대로 작동합니다.