当前位置: 首页 > 知识库问答 >
问题:

在spring boot中使用SAML进行身份验证

艾令雪
2023-03-14

实际上,我们正在开发一个应用程序,在Spring boot 1.5中,通过oauth2实现的Spring security完成身份验证和授权,现在我们有一个要求,在身份验证部分,拆分身份验证,并将身份验证部分转移到第三方,即SAML集成,

流程:登录-

如何在my spring security中仅使用userid授权用户,并生成自定义令牌(自定义任何spring security筛选器),

如何在我的Spring Security筛选器中填充身份验证对象(如果使用身份验证提供程序),

在SAML认证服务器中重定向到IDP的最佳方式。

实现注销功能的最佳方式。

我如何才能实现这些要求,有人可以建议,因为我是新手。

我目前的配置每件事都是Java配置的,

**spring security,Resource server,Authorization server**

我正在制作文件中提供的样品,https://github.com/vdenotaris/spring-boot-security-saml-sample

当启动Spring启动应用程序以下错误发生,

2017-12-29 10:15:12.192错误25076---[元数据重新加载]o.o.s.m.p.HTTPMetadataProvider:从中检索元数据时出错http://idp.ssocircle.com/idp-meta.xml

JAVA网ConnectException:连接被拒绝:在java上连接。网DualStackPlainSocketImpl。在java上连接0(本机方法)~[?:1.8.0_66]。网DualStackPlainSocketImpl。socketConnect(DualStackPlainSocketImpl.java:79)~[?:1.8.0_66]在java上。网AbstractPlainSocketImpl。java上的doConnect(AbstractPlainSocketImpl.java:350)~[?:1.8.0_66]。网AbstractPlainSocketImpl。在java上连接到地址(AbstractPlainSocketImpl.java:206)~[?:1.8.0_66]。网AbstractPlainSocketImpl。在java上连接(AbstractPlainSocketImpl.java:188)~[?:1.8.0_66]。网普通袜子。在java上连接(PlainSocketImpl.java:172)~[?:1.8.0_66]。网SocksSocketImpl。在java上连接(socksocketimpl.java:392)~[?:1.8.0_66]。网插座在java上连接(Socket.java:589)~[?:1.8.0_66]。网插座在java上连接(Socket.java:538)~[?:1.8.0_66]。网插座(Socket.java:434)~[?:1.8.0_66]在java上。网插座(Socket.java:286)~[?:1.8.0_66]在org上。阿帕奇。平民httpclient。协议DefaultProtocolSocketFactory。createSocket(DefaultProtocolSocketFactory.java:80)~[commons-httpclient-3.1.jar:?]在org。阿帕奇。平民httpclient。协议DefaultProtocolSocketFactory。createSocket(DefaultProtocolSocketFactory.java:122)~[commons-httpclient-3.1.jar:?]在org。阿帕奇。平民httpclient。HttpConnection。打开(HttpConnection.java:707)~[commons-httpclient-3.1.jar:?]在org。阿帕奇。平民httpclient。多线程HttpConnectionManager$HttpConnectionAdapter。打开(多线程HttpConnectionManager.java:1361)~[commons-httpclient-3.1.jar:?]在org。阿帕奇。平民httpclient。HttpMethodDirector。executeWithRetry(HttpMethodDirector.java:387)~[commons-httpclient-3.1.jar:?]在org。阿帕奇。平民httpclient。HttpMethodDirector。executeMethod(HttpMethodDirector.java:171)~[commons-httpclient-3.1.jar:?]在org。阿帕奇。平民httpclient。HttpClient。executeMethod(HttpClient.java:397)~[commons-HttpClient-3.1.jar:?]在org。阿帕奇。平民httpclient。HttpClient。executeMethod(HttpClient.java:323)~[commons-HttpClient-3.1.jar:?]在org。opensaml。saml2。元数据。供应商。HTTPMetadataProvider。fetchMetadata(HTTPMetadataProvider.java:250)[opensaml-2.6.1.jar:?]在org。opensaml。saml2。元数据。供应商。AbstractReloadingMetadataProvider。刷新(AbstractReloadingMetadataProvider.java:255)[opensaml-2.6.1.jar:?]在org。opensaml。saml2。元数据。供应商。AbstractReloadingMetadataProvider。doInitialization(AbstractReloadingMetadataProvider.java:236)[opensaml-2.6.1.jar:?]在org。opensaml。saml2。元数据。供应商。AbstractMetadataProvider。初始化(AbstractMetadataProvider.java:407)[opensaml-2.6.1.jar:?]在org。springframework。安全山姆。元数据。ExtendedMetadataDelegate。在org上初始化(ExtendedMetadataDelegate.java:167)[spring-security-saml2-core-1.0.2.RELEASE.jar:1.0.2.RELEASE]。springframework。安全山姆。元数据。MetadataManager。initializeProvider(MetadataManager.java:412)[spring-security-saml2-core-1.0.2.RELEASE.jar:1.0.2.RELEASE]位于org。springframework。安全山姆。元数据。MetadataManager。refreshMetadata(MetadataManager.java:238)[spring-security-saml2-core-1.0.2.RELEASE.jar:1.0.2.RELEASE]位于org。springframework。安全山姆。元数据。CachingMetadataManager。refreshMetadata(cachingmetadatmanager.java:86)[spring-security-saml2-core-1.0.2.RELEASE.jar:1.0.2.RELEASE]位于org。springframework。安全山姆。元数据。MetadataManager$RefreshTask。在java上运行(MetadataManager.java:1040)[spring-security-saml2-core-1.0.2.RELEASE.jar:1.0.2.RELEASE]。util。时间阅读。java上的mainLoop(Timer.java:555)[?:1.8.0_66]。util。时间阅读。运行(Timer.java:505)[?:1.8.0_66]

2017-12-29 10:15:12.193DEBUG 25076---[Metada-reload]. s. m. p. AbstractReloadingMetadataProvider:试图从http://idp.ssocircle.com/idp-meta.xml刷新元数据时出错

org.opensaml.saml2.metadata.provider.元数据提供者异常:从http://idp.ssocircle.com/idp-meta.xmlorg.opensaml.saml2.metadata.provider.HTTPMetadataProvider.fetch元数据(HTTPMetadataProvider.java:274)~[opensaml-2.6.1.jar:?]在org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.refresh(AbstractReloadingMetadataProvider.java:255)[opensaml-2.6.1.jar:?]在org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.do初始化(AbstractReloadingMetadataProvider.java:236)[opensaml-2.6.1.jar:?]在org.opensaml.saml2.metadata.provider.AbstractMetadataProvider.initialize(AbstractMetadataProvider.java:407)[opensaml-2.6.1.jar:?]在org.springframework.security.saml.metadata.ExtendedMetadataDelegate.initialize(ExtendedMetadataServer. java: 167)[sping-security-saml2-core-1.0.2. RELEASE. jar: 1.0.2. RELEASE]在org. springframework. security. saml. metadata. MetadataManager.401 alizeProvider(MetadataManager. java: 412)[sping-security-saml2-core-1.0.2. RELEASE. jar: 1.0.2. RELEASE]在org. springframework. security. saml. metadata. Metadata(MetadataManager. java: 238)[sping-security-saml2-core-1.0.2. RELEASE. jar: 1.0.2. RELEASE]在org. springframework. security. saml. metadata. CachingMetadataManager.刷新元数据(CachingMetadataManager.AbstractPlainSocketInpl. doConnect(AbstractPlainSocketInpl. java: 350)~[?: 1.8.0_66]在java. net。AbstractPlainSocketInpl. java: 206)~[?: 1.8.0_66]在java. net。AbstractPlainSocketInpl. java: 188)~[?: 1.8.0_66]在java. net。PlainSocketInpl. Connect(PlainSocketInpl. java: 172)~[?: 1.8.0_66]在java. net。SocksSocketInpl. Connect(SocksSocketInpl. java: 392)~[?: 1.8.0_66]在java. net。Socket. Connect(Socket. java: 589)~[?: 1.8.0_66]在java. net。Socket. Connect(Socket. java: 538)MultiThreadedHttpConnectionManager$HttpConnectionAdapter. open(MultiThreadedHttpConnectionManager. java: 1361)~[Commons-http pclient-3.1. jar:?]在org. apache.公共性. http客户端。HttpmetodDirector.刽子手重试(HttpmetodDirector. java: 387)~[公共性-http pclient-3.1. jar:?]在org. apache.公共性. http pclient3. java: 171)~[公共性-http pclient-3.1. jar:?]在org. apache.公共性. http pclient397)~[公共性-http pclient-3.1. jar:?]在org. apache.公共性. http pclient323)~[

2017-12-29 10:15:12.194信息25076---[元数据重新加载]。s、 m.p.AbstractReloadingMetadataProvider:元数据提供程序的下一个刷新周期http://idp.ssocircle.com/idp-meta.xml'将在'2017-12-29T04:50:12.194Z'('2017-12-29T10:20:12.194 05:30'当地时间)2017-12-29 10:15:12.194错误25076---[Metadata reload]o.o.s.m.p.AbstractMetadataProvider:元数据提供程序未能正确初始化,fail fast=true,停止

组织。opensaml。saml2。元数据。供应商。MetadataProviderException:org。opensaml。saml2。元数据。供应商。MetadataProviderException:从中检索元数据时出错http://idp.ssocircle.com/idp-meta.xml在org。opensaml。saml2。元数据。供应商。AbstractReloadingMetadataProvider。刷新(AbstractReloadingMetadataProvider.java:267)~[opensaml-2.6.1.jar:?]在org。opensaml。saml2。元数据。供应商。AbstractReloadingMetadataProvider。doInitialization(AbstractReloadingMetadataProvider.java:236)~[opensaml-2.6.1.jar:?]在org。opensaml。saml2。元数据。供应商。AbstractMetadataProvider。初始化(AbstractMetadataProvider.java:407)[opensaml-2.6.1.jar:?]在org。springframework。安全山姆。元数据。ExtendedMetadataDelegate。在org上初始化(ExtendedMetadataDelegate.java:167)[spring-security-saml2-core-1.0.2.RELEASE.jar:1.0.2.RELEASE]。springframework。安全山姆。元数据。MetadataManager。initializeProvider(MetadataManager.java:412)[spring-security-saml2-core-1.0.2.RELEASE.jar:1.0.2.RELEASE]位于org。springframework。安全山姆。元数据。MetadataManager。refreshMetadata(MetadataManager.java:238)[spring-security-saml2-core-1.0.2.RELEASE.jar:1.0.2.RELEASE]位于org。springframework。安全山姆。元数据。CachingMetadataManager。refreshMetadata(cachingmetadatmanager.java:86)[spring-security-saml2-core-1.0.2.RELEASE.jar:1.0.2.RELEASE]位于org。springframework。安全山姆。元数据。MetadataManager$RefreshTask。在java上运行(MetadataManager.java:1040)[spring-security-saml2-core-1.0.2.RELEASE.jar:1.0.2.RELEASE]。util。时间阅读。java上的mainLoop(Timer.java:555)[?:1.8.0_66]。util。时间阅读。运行(Timer.java:505)[?:1.8.0_66]由:org引起。opensaml。saml2。元数据。供应商。MetadataProviderException:从中检索元数据时出错http://idp.ssocircle.com/idp-meta.xml在org。opensaml。saml2。元数据。供应商。HTTPMetadataProvider。fetchMetadata(HTTPMetadataProvider.java:274)~[opensaml-2.6.1.jar:?]在org。opensaml。saml2。元数据。供应商。AbstractReloadingMetadataProvider。刷新(AbstractReloadingMetadataProvider.java:255)~[opensaml-2.6.1.jar:?]。。。9更多原因:java。网ConnectException:连接被拒绝:在java上连接。网DualStackPlainSocketImpl。在java上连接0(本机方法)~[?:1.8.0_66]。网DualStackPlainSocketImpl。socketConnect(DualStackPlainSocketImpl.java:79)~[?:1.8.0_66]在java上。网AbstractPlainSocketImpl。java上的doConnect(AbstractPlainSocketImpl.java:350)~[?:1.8.0_66]。网AbstractPlainSocketImpl。在java上连接到地址(AbstractPlainSocketImpl.java:206)~[?:1.8.0_66]。网AbstractPlainSocketImpl。在java上连接(AbstractPlainSocketImpl.java:188)~[?:1.8.0_66]。网普通袜子。在java上连接(PlainSocketImpl.java:172)~[?:1.8.0_66]。网SocksSocketImpl。在java上连接(socksocketimpl.java:392)~[?:1.8.0_66]。网插座在java上连接(Socket.java:589)~[?:1.8.0_66]。网插座在java上连接(Socket.java:538)~[?:1.8.0_66]。网插座(Socket.java:434)~[?:1.8.0_66]在java上。网插座(Socket.java:286)~[?:1.8.0_66]在org上。阿帕奇。平民httpclient。协议DefaultProtocolSocketFactory。createSocket(DefaultProtocolSocketFactory.java:80)~[commons-httpclient-3.1.jar:?]在org。阿帕奇。平民httpclient。协议DefaultProtocolSocketFactory。createSocket(DefaultProtocolSocketFactory.java:122)~[commons-httpclient-3.1.jar:?]在org。阿帕奇。平民httpclient。HttpConnection。打开(HttpConnection.java:707)~[commons-httpclient-3.1.jar:?]在org。阿帕奇。平民httpclient。多线程HttpConnectionManager$HttpConnectionAdapter。打开(多线程HttpConnectionManager.java:1361)~[commons-httpclient-3.1.jar:?]在org。阿帕奇。平民httpclient。HttpMethodDirector。executeWithRetry(HttpMethodDirector.java:387)~[commons-httpclient-3.1.jar:?]在org。阿帕奇。平民httpclient。HttpMethodDirector。executeMethod(HttpMethodDirector.java:171)~[commons-httpclient-3.1.jar:?]在org。阿帕奇。平民httpclient。HttpClient。executeMethod(HttpClient.java:397)~[commons-HttpClient-3.1.jar:?]在org。阿帕奇。平民httpclient。HttpClient。executeMethod(HttpClient.java:323)~[commons-HttpClient-3.1.jar:?]在org。opensaml。saml2。元数据。供应商。HTTPMetadataProvider。fetchMetadata(HTTPMetadataProvider.java:250)~[opensaml-2.6.1.jar:?]在org。opensaml。saml2。元数据。供应商。AbstractReloadingMetadataProvider。刷新(AbstractReloadingMetadataProvider.java:255)~[opensaml-2.6.1.jar:?]。。。9更多

2017-12-29 10:15:12.195ERROR 25076-[Metada-reload]o. s. s. m. MetadataManager:初始化元数据提供程序org.opensaml.saml2.metadata.provider.HTTPMetadataProvider@6ae8b7失败,将忽略提供程序

org.opensaml.saml2.metadata.provider.MetadataProvider异常:org.opensaml.saml2.metadata.provider.MetadataProviderExctive:在org.opensaml.saml2.metadata.provider.从http://idp.ssocircle.com/idp-meta.xml检索元数据时出错AbstractReloadingMetadataProvider.refresh(AbstractReloadingMetadataProvider.java:267)~[opensaml-2.6.1.jar:?]在org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.do初始化(AbstractReloadingMetadataProvider.java:236)~[opensaml-2.6.1.jar:?]在org.opensaml.saml2.metadata.provider.AbstractMetadataProvider.initialize(AbstractMetadataProvider.java:407)~[opensaml-2.6.1.jar:?]在org.springframework.security.saml.metadata.ExtendedMetadataDelegate.initialize(ExtendedMetadataDelegate.java:167)~[sping-security-saml2-core-1.0.2. RELEASE. jar: 1.0.2.AbstractReloadingMetadataProvider.刷新(AbstractReloadingMetadataProvider. java: 255)~[opensaml-2.6.1. jar:?]...9更多由: java. net引起的连接异常:连接被拒绝:连接在java. net. DualStackPlainSocketInp. Connect0(本机方法)~[?: 1.8.0_66]在java. net. DualStackPlainSocketInp. SocketConnect(DualStackPlainSocketInp. java: 79)~[?: 1.8.0_66]在java. net. AbstractPlainSocketInp. doConnect(AbstractPlainSocketInp. java: 350)~[?: 1.8.0_66]在java. net. AbstractPlainSocketInp. java: 206)~[?: 1.8.0_66]在java. net. AbstractPlainSocketInp默认协议SocketFactory. createSocket(DefaultPROCOSocketFactory. java: 80)~[conons-http pclient-3.1. jar:?]在org. apache.公共性. http客户端.协议。默认协议SocketFactory. createSocket(DefaultPROcolSocketFactory. java: 122)~[公共性-http客户端-3.1. jar:?]在org. apache.公共性. http pclient. open(HttpConnec. java: 707)~[公共性-http pclient-3.1. jar:?]在org. apache.公共性. http pclient. MultiThreadedHttpConnectionManager$HttpConnectionAdapter. open(MultiThreadedHttpConnectionManager. java: 1361)~[公共性-http pclient-3.1. jar:?]在org. apache.公共性. http pclient. Httpclient

2017-12-29 10:15:12.196DEBUG 25076-[Metada-reload]o. s. s. m. MetadataManager:重新加载元数据已完成

如何对该错误进行排序?此示例是否可以在本地环境中运行和测试?或者我需要一些外部配置?

共有1个答案

宗弘扬
2023-03-14

我建议您首先在SP中实现spring saml扩展。它将帮助您满足以下要求:

如何在我的Spring Security筛选器中填充身份验证对象(如果使用身份验证提供程序),

在SAML认证服务器中重定向到IDP的最佳方式。

实现注销功能的最佳方式。

在您的应用程序能够通过SAML使用IDP对用户进行身份验证后,然后扩展类SAMLAuthentiationProvider的实现。该类从IDP接收断言并对其进行验证。一旦断言被验证,您可以通过自定义实现userContextMapper将SAML令牌中的传入授权映射到您的本地授权。在这一部分中,您可以生成一个JWT令牌,并将其用于所有api调用。大多数IDP都提供了一个接口,用于将SAML令牌交换为OAuth2访问令牌。在这种情况下,您不必生成任何令牌。

如果你需要任何进一步的信息或细节,请告诉我。

更新:

 类似资料:
  • 问题内容: 在我的iOS应用程序中,我想使用WKWebView在应用程序中包装外部URL 。此URL需要基本身份验证(它需要用户和密码凭据,如以下屏幕截图所示)。 经过一番调查,我尝试使用 didReceiveAuthenticationChallengemethod来启用自动 登录,因此我不了解它的工作原理。 这是我的代码。 I’m facing with this exception: If

  • 我正在尝试使用urllib3连接到网页。代码如下所示。 如果我们假设url是需要使用用户名和密码进行身份验证的某个网页,那么我是否使用正确的代码进行身份验证? 我使用urllib2做这件事很舒服,但使用urllib3做不到同样的事情。 非常感谢

  • jwt不应该仅仅用于认证用户吗?我读到过可以在里面存储非敏感的东西,比如用户ID。将权限级别之类的东西存储在令牌中可以吗?这样我可以避免数据库调用。

  • 我正在使用SpringBoot开发具有微服务架构的Rest Backend。为了保护endpoint,我使用了JWT令牌机制。我正在使用Zuul API网关。 如果请求需要权限(来自JWT的角色),它将被转发到正确的微服务。Zuul api网关的“WebSecurityConfigrerAdapter”如下。 这样,我必须在这个类中编写每个请求授权部分。因此,我希望使用方法级安全性,即“Enabl

  • 我正在建立Angular 4 NodeJS(用于SAML-PASSPORT)Spring Boot(所有API)应用程序。 这是身份验证和授权流程:1。在UI中,用户单击登录2。请求被发送到SAML IDP以进行登录3。用户验证自己4。SAML IDP发回我的NodeJS APIendpoint/登录/回调5。NodeJS将用户重定向到前端-此时,我想生成一个令牌并将其发送到UI端。我无法通过UR

  • 问题内容: 我可以通过接收到请求的xml 但不是 没有JavaScript错误,没有跨域策略问题。可能是语法错误,但是我找不到合适的教程。有什么建议吗? 问题答案: 我认为您需要纯格式: