Ich versuche, die Spring Security SAML-Erweiterung in Spring Boot zu integrieren .
Zu diesem Thema habe ich eine vollständige Beispielanwendung entwickelt. Der Quellcode ist auf GitHub verfügbar:
Durch Ausführen als Spring Boot-Anwendung (ausgeführt auf dem in SDK integrierten Anwendungsserver) funktioniert die WebApp einwandfrei.
Leider funktioniert der gleiche AuthN-Prozess auf Undertow / WildFly überhaupt nicht .
Gemäß den Protokollen führt der IdP tatsächlich den AuthN- Prozess aus: Die Anweisungen meiner benutzerdefinierten UserDetails
Implementierung werden korrekt ausgeführt. Trotz des Ausführungsablaufs richtet Spring die Berechtigungen für den aktuellen Benutzer nicht ein und behält sie nicht 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("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;
}
}
Beim Debuggen habe ich herausgefunden, dass das Problem von der FilterChainProxy
Klasse abhängt . Zur Laufzeit hat das Attribut FILTER_APPLIED
von ServletRequest
einen Nullwert , daher löscht Spring das 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);
}
}
Unter VMware vFabric tc Sever und Tomcat funktioniert alles einwandfrei . Haben Sie eine Idee zur Lösung dieses Problems?
SecurityContextHolder.clearContext()
Sitzungsdaten werden nicht gelöscht. Der ThreadLocal
Speicher des Kontexts wird entfernt, bevor ein Thread wieder in den Thread-Pool freigegeben wird. Mein Punkt ist, dass dies immer am Ende einer Anfrage geschehen sollte. Was Sie also sehen, ist normal und wahrscheinlich nicht die Ursache Ihres Problems.
SecurityContextHolder
sollte das nach einer Anfrage gelöscht werden. Der einzige Zweck dieses Codes besteht darin, dass die Filterkette während derselben Anforderung mehrmals angewendet wird (in diesem Fall sollte nur die ursprüngliche Kette den Kontext löschen). Ich denke also nicht, dass das ein Problem ist.