webentwicklung-frage-antwort-db.com.de

Spring Security on Wildfly: Fehler beim Ausführen der Filterkette

Ich versuche Spring Security SAML Extension mit Spring Boot.

Zu diesem Thema habe ich eine vollständige Beispielanwendung entwickelt. Sein Quellcode ist auf GitHub verfügbar:

Wenn Sie es als Spring Boot-Anwendung ausführen (auf dem im SDK integrierten Anwendungsserver), funktioniert die WebApp einwandfrei.

Leider funktioniert derselbe AuthN-Prozess auf Undertow/WildFly überhaupt nicht.

Laut den Protokollen führt der IdP tatsächlich den AuthN -Prozess durch: Die Anweisungen meiner benutzerdefinierten UserDetails -Implementierung werden korrekt ausgeführt. Trotz des Ausführungsflusses richtet Spring die Berechtigungen für den aktuellen Benutzer nicht ein und behält sie bei.

@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("[email protected]") != 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;
    }
}

Während des Debuggens habe ich herausgefunden, dass das Problem von der Klasse FilterChainProxy abhängt. Zur Laufzeit wird das Attribut FILTER_APPLIED von ServletRequest hat einen null Wert, somit löscht Spring den 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);
    }
}

Auf VMware vFabric tc Sever und Tomcat funktioniert alles einwandfrei. Haben Sie eine Idee zur Lösung dieses Problems?

192
vdenotaris

Bei der Untersuchung des Problems ist mir aufgefallen, dass die Authentifizierungsanforderung einige Probleme mit Cookies und Verweisen enthält.

Derzeit funktioniert die Wildfly-Authentifizierung, wenn Sie den Webanwendungskontext in den Stammkontext ändern:

 <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>

Nach dem Neustart von wildfly und dem Löschen der Cookies sollte alles wie erwartet funktionieren

7
nesteant