[spring] Wildfly의 Spring Security : 필터 체인 실행 중 오류

Spring Security SAML ExtensionSpring 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를 다시 시작하고 쿠키를 지우면 모든 것이 예상대로 작동합니다.


답변