6.Spring Security SAML 与应用程序集成

6.与应用程序集成

SAML模块可以直接嵌入到新的或现有的Spring应用程序中。在这种情况下,应用程序本身包含war存档的WEB-INF / lib目录中的SAML库,并处理所有SAML交互。使用SAML库的另一个选择是将其部署为独立模块,该模块使用自定义机制将有关已认证用户的信息传输到目标应用程序。本章仅讨论第一个选项。

6.1 Maven依赖

为了包含库及其所有依赖项,请将以下依赖项添加到pom.xml文件中:

<dependency>
	<groupId>org.springframework.security.extensions</groupId>
	<artifactId>spring-security-saml2-core</artifactId>
	<version>${version}</version>
</dependency>

当前版本的SAML扩展已经过测试,可以与Spring 3.1.2,Spring Security 3.1.2和OpenSAML 2.6.1一起使用。这些库的更高版本可能兼容而无需修改。

6.2 Bean定义

SAML库的配置需要sample / src / main / webapp / WEB-INF / securityContext.xml 配置文件中包含的bean定义 。在您自己的Spring应用程序中直接或包含该文件的副本。以下章节中的配置步骤将自定义默认上下文中包含的bean。

默认情况下,SAML库的Bean正在使用自动布线和基于注释的配置。确保您的Spring配置包含以下设置,以便支持这些功能:

<context:annotation-config/>
<context:component-scan base-package="org.springframework.security.saml"/>

6.3基于Java的配置

Spring SAML将在未来版本中包含基于Spring Java的配置的配置类。

有关在Spring Boot应用程序中转换为Java配置的securityContext.xml示例,请参阅Vincenzo De Notaris的项目,网址为https://github.com/vdenotaris/spring-boot-security-saml-sample

6.4 Spring Security集成

需要启用SAML模块的过滤器作为Spring Security设置的一部分。如果SAML身份验证应该是应用程序集bean samlEntryPoint的默认身份验证机制,则 作为默认入口点。确保过滤器 samlFilter 作为自定义过滤器之一包含在内。如果在应用程序的第一次请求期间应自动生成SP元数据,则还包括过滤器 metadataGeneratorFilter。配置指令可以例如如下所示:

<security:http entry-point-ref="samlEntryPoint">
	<security:custom-filter before="FIRST" ref="metadataGeneratorFilter"/>
	<security:custom-filter after="BASIC_AUTH_FILTER" ref="samlFilter"/>
</security:http>

6.5错误处理

处理SAML消息期间引发的严重错误通常作为ServletExceptions传播到Java容器。为了配置自定义错误处理,请更新web.xml并为ServletExceptions提供通用处理程序:

<error-page>
	<exception-type>javax.servlet.ServletException</exception-type>
	<location>/error.jsp</location>
</error-page>

ServletException包含失败原因的原因。出于安全性和用户体验的原因,建议不向最终用户显示例外内容。

处理SAML AuthenticationResponse期间产生的错误可以通过将org.springframework.security.web.authentication.AuthenticationFailureHandler接口的自定义实现插入samlWebSSOProcessingFilter bean来处理。

6.6日志

SAML Extension使用SLF4J框架进行日志记录。这同样适用于底层的OpenSAML库。默认情况下,示例应用程序使用针对SLF4J的log4j 1.2版绑定,并使用以下依赖项进行配置:

<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.6.3</version>
	<scope>compile</scope>
</dependency>

要从日志中查看SAML消息和错误的内容,请调整SAMLDefaultLogger bean的设置。

<bean id="samlLogger" class="org.springframework.security.saml.log.SAMLDefaultLogger">
       	<property name="logAllMessages" value="true"/>
    	<property name="logErrors" value="true"/>
    	<property name="logMessagesOnException" value="true"/>
	</bean>

如果您正在使用其他日志记录库,请确保相应地更改依赖项。

您可以通过修改文件sample / src / main / resources / log4j.properties并添加以下内容来启用调试日志记录:

log4j.logger.org.springframework.security.saml=DEBUG
log4j.logger.org.opensaml=DEBUG
log4j.logger.PROTOCOL_MESSAGE=DEBUG

有关使用其他日志记录框架的详细信息,请参阅SLF4J手册


(1)