seguridad - spring security kerberos
Spring Security en Wildfly/Undertow: error al ejecutar la cadena de filtros (1)
Al investigar el problema, he notado que hay un problema con las cookies y los remitentes en la solicitud de autenticación.
Actualmente la autenticación de wildfly funcionará si cambia el contexto de aplicación web al contexto raíz:
<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>
Después de reiniciar Wildfly y borrar las cookies, todo debería funcionar como se esperaba.
Estoy trabajando para integrar Spring Security SAML Extension con Spring Boot .
Desarrollé una aplicación de ejemplo completa, todo el código fuente está publicado en GitHub:
Al ejecutar la aplicación web como aplicación Spring Boot (a través de Spring Tool Set, utilizando un servidor de aplicaciones incorporado), funciona bien. Desafortunadamente, el proceso de autenticación no funciona en Undertow / WildFly (y debo usarlo como producción AS).
Al iniciar sesión, puedo ver que el IdP realiza el proceso AuthN y que las instrucciones de mi implementación personalizada de UserDetails
se ejecutan correctamente. A pesar de que Spring no establece los privilegios para el usuario actual.
@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;
}
}
Al depurar, verifiqué que el problema comienza desde la clase FilterChainProxy
. Cuando ejecuto la aplicación web en WildFly, puedo ver que el atributo FILTER_APPLIED
de ServletRequest
es nulo , por lo que Spring borra la 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);
}
}
En VMware vFabric tc Sever y Tomcat eso no sucede. ¿Hay alguna manera de resolver este problema?