私は統合しようとしているSpring Security SAML 拡張とスプリングブート。
この件に関して、私は完全なサンプル アプリケーションを開発しました。そのソース コードは GitHub で入手できます。
Spring Boot アプリケーションとして実行すると (SDK 組み込みアプリケーション サーバーに対して実行)、WebApp は正常に動作します。
残念ながら、同じAuthNプロセスはアンダートウ/ワイルドフライ。
ログによると、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("[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;
}
}
デバッグ中に、問題はクラスに依存していることが分かりましたFilterChainProxy
。実行時に、FILTER_APPLIED
の属性ServletRequest
にはヌル値なので、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 サーバーそしてトムキャットすべて正常に動作しています。この問題を解決するアイデアはありますか?
ベストアンサー1
問題を調査したところ、認証リクエストの Cookie とリファラーに問題があることに気付きました。
現在、Web アプリケーション コンテキストをルート コンテキストに変更すると、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を再起動してクッキーをクリアすると、すべてが期待どおりに動作するはずです。