Wildfly上的Spring Security:执行过滤器链时出错

我正在尝试将Spring Security SAML扩展弹簧靴集成。

关于这个问题,我确实开发了一个完整的示例应用程序。它的源代码可以在GitHub上找到:

通过将其作为Spring Boot应用程序运行(在SDK内置应用服务器上运行),WebApp可以正常工作。

不幸的是,相同的身份验证过程在暗流/野蝇上根本不起作用。

根据日志,IDP实际上执行授权过程:我的自定义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类。在运行时,ServletRequest的属性FILTER_APPLIED具有无效值,因此Spring清除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);
}
}

VMware vFabric TC服务器雄猫上,一切工作完全正常。你有办法解决这个问题吗?

8520 次浏览

在调查这个问题时,我注意到身份验证请求中的cookie和引用程序出现了一些混乱。

目前,如果您将WebApplication上下文更改为根上下文,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并清除Cookie后,一切都应按预期工作