Web Application Security

本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springdoc.cn 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。

<debug>

启用Spring Security debug 基础设施。这将提供人类可读的(多行)调试信息来监控进入 security filter 的请求。这可能包括敏感信息,如请求参数或header,因此只能在开发环境中使用。

<http>

如果你在应用程序中使用 <http> 元素,就会创建一个名为 "springSecurityFilterChain" 的 FilterChainProxy Bean,该元素中的配置被用来在 FilterChainProxy 中建立一个过滤链。从Spring Security 3.1开始,额外的 http 元素可以用来添加额外的过滤器链 [1]]。一些核心过滤器总是在过滤器链中创建,其他的过滤器将被添加到栈中,这取决于存在的属性和子元素。标准过滤器的位置是固定的(见命名空间介绍中的 过滤器顺序表),消除了以前版本框架的一个常见错误来源,当时用户必须在 FilterChainProxy Bean中明确配置过滤器链。当然,如果你需要完全控制配置,你仍然可以这样做。

所有需要引用 AuthenticationManager 的过滤器都会被自动注入由命名空间配置创建的内部实例。

每个 <http> 命名空间块总是创建一个 SecurityContextPersistenceFilter、一个 ExceptionTranslationFilter 和一个 FilterSecurityInterceptor。这些都是固定的,不能被替代。

<http> 属性

<http> 元素上的属性控制着核心过滤器的一些属性。

  • use-authorization-manager 使用 AuthorizationManager API而不是 SecurityMetadataSource(默认为true)。

  • access-decision-manager-ref 使用这个 AuthorizationManager,而不是从 <intercept-url> 元素中派生出一个。

  • access-decision-manager-ref 可选的属性,指定 AccessDecisionManager 实现的ID,它应该被用于授权HTTP请求。默认情况下,一个 AffirmativeBased 实现被用于一个 RoleVoter 和一个 AuthenticatedVoter

  • authentication-manager-ref 对该 http 元素创建的 FilterChain 所使用的 AuthenticationManager 的引用。

  • observation-registry-ref 对用于 FilterChain 和相关组件的 ObservationRegistry 的引用。

  • auto-config 自动注册登录表单、BASIC认证、注销服务。如果设置为 "true",所有这些功能都会被添加(尽管你仍然可以通过提供各自的元素来定制每个功能的配置)。如果没有指定,默认为 "false"。不建议使用这个属性。使用明确的配置元素代替,以避免混淆。

  • create-session 控制 Spring Security 类创建 HTTP 会话(Session)的急切性。选项包括。

    • always - 如果不存在会话,Spring Security会主动创建一个会话。

    • ifRequired - 只有在需要会话时,Spring Security才会创建一个会话(默认值)。

    • never - Spring Security永远不会创建会话,但如果应用程序创建了会话,就会使用这个会话。

    • stateless - Spring Security不会创建一个会话,并且在获得Spring Authentication 时忽略该会话。

  • disable-url-rewriting 防止Session ID被附加到应用程序的URL上。如果这个属性被设置为 true,客户必须使用cookie。默认情况下是 true

  • entry-point-ref 通常情况下,使用的 AuthenticationEntryPoint 将根据已配置的认证机制来设置。这个属性允许通过定义一个自定义的 AuthenticationEntryPoint bean来覆盖这种行为,它将启动认证(authentication)过程。

  • jaas-api-provision 如果有的话,以从 JaasAuthenticationToken 获得的 Subject 来运行请求,这是在栈中添加 JaasApiIntegrationFilter Bean实现的。默认为 false

  • name 一个Bean标识符(ID),用于在上下文中引用该Bean的其他地方。

  • once-per-request 对应于 FilterSecurityInterceptorobserveOncePerRequest 属性。默认为 false

  • filter-all-dispatcher-types 对应于 AuthorizationFiltershouldFilterAllDispatcherTypes 属性。当 use-authorization-manager=false 时不工作。 默认为 true

  • patternhttp 元素定义一个pattern,可以控制将通过其定义的过滤器列表过滤的请求。这种解释取决于配置的 请求匹配器(request-matcher)。如果没有定义 pattern,所有的请求都将被匹配,所以应该首先声明最具体的 pattern。

  • realm 设置用于基本认证(basic authentication)的 realm 名称(如果启用)。对应于 BasicAuthenticationEntryPointrealmName 属性。

  • request-matcher 定义 FilterChainProxy 中使用的 RequestMatcher 策略(strategy),以及由 intercept-url 创建的Bean来匹配进入的请求。目前的选项是 mvcantregexciRegex,分别用于 Spring MVC、ant、正则表达式和大小写不敏感的正则表达式。每个 intercept-url 元素使用其patternmethodservlet-path属性创建一个单独的实例。Ant路径使用 AntPathRequestMatcher 进行匹配,正则表达式使用 RegexRequestMatcher 进行匹配,对于Spring MVC的路径匹配则使用 MvcRequestMatcher。关于具体如何进行匹配的更多细节,请参见这些类的Javadoc。如果 Spring MVC 存在于 classpath 中,MVC 是默认策略,如果没有,则使用Ant路径。

  • request-matcher-ref 对实现 RequestMatcher 的Bean的引用,该Bean将决定是否应该使用这个 FilterChain。这是一个比 pattern 更强大的选择。

  • security 通过将此属性设置为 none,一个请求 pattern 可以被映射到一个空的过滤器链。没有 security 将被应用,Spring Security 的任何功能都无法使用。

  • security-context-repository-ref 允许向 SecurityContextPersistenceFilterSecurityContextHolderFilterBasicAuthenticationFilterUsernamePasswordAuthenticationFilterExceptionTranslationFilterLogoutFilter 等注入自定义 SecurityContextHolderStrategy

  • security-context-explicit-save 如果为 true,使用 SecurityContextHolderFilter 而不是 SecurityContextPersistenceFilter。需要显式保存

  • security-context-repository-ref 允许将自定义的 SecurityContextRepository 注入 SecurityContextPersistenceFilter 中。

  • servlet-api-provision 提供 HttpServletRequest 安全方法的版本,如 isUserInRole()getPrincipal(),这些方法是通过在栈中添加一个 SecurityContextHolderAwareRequestFilter Bean 来实现的。默认为 true

<access-denied-handler>

这个元素允许你使用 error-page 属性为 ExceptionTranslationFilter 使用的默认 AccessDeniedHandler 设置 errorPage 属性,或者使用 ref 属性提供你自己的实现。这将在关于 ExceptionTranslationFilter 的章节中详细讨论。

<access-denied-handler> 的父元素

<access-denied-handler> 属性

  • error-page 拒绝访问的页面,如果认证用户请求一个他们没有权限访问的页面,他们将被重定向到这个页面。

  • ref 定义了一个对 AccessDeniedHandler 类型的 Spring Bean 的引用。

<cors>

这个元素允许配置一个 CorsFilter。如果没有指定 CorsFilterCorsConfigurationSource,并且 Spring MVC 在 classpath 上,那么 HandlerMappingIntrospector 将被用作 CorsConfigurationSource

<cors> 属性

<cors> 元素上的属性控制着 heade 元素。

  • ref 可选的属性,指定 CorsFilter 的bean名称。

  • cors-configuration-source-ref 可选的属性,指定要注入由XML命名空间创建的 CorsFilter 中的 CorsConfigurationSource 的bean名称。

<cors> 的父元素

<headers>

这个元素允许配置额外的(security)header 信息,以便与响应一起发送。它可以方便地配置几个header信息,也可以通过 header 元素设置自定义头信息。更多的信息,可以在参考资料中的 Security Headers 部分找到。

  • Cache-Control, PragmaExpires - Cache-Control, Pragma, and Expires - 可以使用 cache-control 元素来设置。这可以确保浏览器不缓存你的安全页面。

  • Strict-Transport-Security - 可以使用 hsts 元素来设置。这可以确保浏览器对未来的请求自动请求HTTPS。

  • X-Frame-Options - 可以使用 frame-options 元素进行设置。 X-Frame-Options header可用于防止点击劫持攻击(clickjacking attacks)。

  • X-XSS-Protection - 可以使用 xss-protection 元素进行设置。 X-XSS-Protection header可以被浏览器用来做基本控制。

  • X-Content-Type-Options - 可以使用 content-type-options 元素来设置。 X-Content-Type-Options header可以防止IE浏览器从声明的内容类型中MIME嗅探出响应。这也适用于谷歌浏览器,在下载扩展时。

  • Public-Key-PinningPublic-Key-Pinning-Report-Only - 可以使用 hpkp 元素进行设置。这允许 HTTPS 网站抵制攻击者使用错误签发的或其他欺诈性证书的冒充行为。

  • Content-Security-PolicyContent-Security-Policy-Report-Only - 可以使用 content-security-policy 元素来设置。 内容安全策略(CSP)是一种机制,网络应用可以利用它来缓解内容注入漏洞,如跨站脚本(XSS)。

  • Referrer-Policy - 可以使用 referrer-policy 元素进行设置, Referrer-Policy 是一种机制,Web应用程序可以利用它来管理 referrer 字段,它包含用户最后浏览的页面。

  • Feature-Policy - 可以使用 feature-policy 元素进行设置, Feature-Policy 是一种机制,允许web开发者有选择地启用、禁用和修改浏览器中某些API和网络功能的行为。

  • Cross-Origin-Opener-Policy - 可以使用 cross-origin-opener-policy 元素进行设置, Cross-Origin-Opener-Policy 是一种机制,可以确保一个顶层文档不与跨源文档共享浏览环境组。

  • Cross-Origin-Embedder-Policy - 可以使用 cross-origin-embedder-policy 元素来设置, Cross-Origin-Embedder-Policy 是一种防止文档加载任何没有明确授予该文档权限的跨源资源的机制。

  • Cross-Origin-Resource-Policy - 可以使用 cross-origin-resource-policy 元素来设置, Cross-Origin-Resource-Policy 是一种机制,它传达了一种愿望,即浏览器阻止对给定资源的 no-cors 跨源/跨站请求。

<headers> 属性

<headers> 元素上的属性控制着 header 元素。

  • defaults-disabled 可选的属性,指定禁用默认的 Spring Security 的 HTTP 响应头。默认是 false(包括默认头信息)。

  • disabled 可选的属性,指定禁用Spring Security的HTTP响应头。默认是 false(头信息被启用)。

<headers> 父元素

<cache-control>

添加 Cache-ControlPragmaExpires header,以确保浏览器不缓存你的安全页面。

<cache-control> 属性

  • disabled 指定是否应禁用缓存控制。默认为 false

<cache-control> 父元素

<hsts>

当启用时,将 Strict-Transport-Security header添加到任何安全请求的响应中。这允许服务器指示浏览器对未来的请求自动使用HTTPS。

<hsts> 属性

  • disabled 指定是否应禁用 Strict-Transport-Security。默认为false。

  • include-sub-domains 指定是否应包括子域。默认为 true

  • max-age-seconds 指定该主机被视为已知HSTS主机的最长时间。默认为一年。

  • request-matcher-ref 用来确定是否应该设置 header 的 RequestMatcher 实例。默认是如果 HttpServletRequest.isSecure() 为 true。

  • preload 指定是否应包括预加载。默认为 false

<hsts> 父元素

<hpkp>

当启用时,会在任何安全请求的响应中添加 HTTP header 的公钥锁定扩展。这使得HTTPS网站能够抵制攻击者使用错误签发的或其他欺诈性证书的冒充行为。

<hpkp> 属性

  • disabled 指定是否应禁用HTTP公钥锁定(HPKP)。默认为 true。

  • include-sub-domains 指定是否应包括子域。默认为false。

  • max-age-seconds 设置 Public-Key-Pins 头的max-age指令的值。默认为60天。

  • report-only 指定浏览器是否应该只报告 pin validation 失败。默认为 true。

  • report-uri 指定浏览器应向其报告 pin validation 失败的URI。

<hpkp> 父元素

<pins>

pin 列表。

<pins> 的子元素

<pin>

使用base64编码的SPKI指纹作为值,加密散列算法作为属性来指定一个 pin。

<pin> 属性

  • algorithm 加密的哈希算法。默认为SHA256。

<pin> 父元素

<content-security-policy>

当启用时,将 内容安全策略(CSP) header 添加到响应中。CSP是一种机制,网络应用可以利用它来减轻内容注入漏洞,如跨站脚本(XSS)。

<content-security-policy> 属性

  • policy-directives Content-Security-Policy header 的安全策略指令,如果 report-only 被设置为 true,则使用 Content-Security-Policy-Report-Only 头。

  • report-only 设置为 true,启用 Content-Security-Policy-Report-Only 头,仅用于报告违反政策的情况。默认值为 false

<content-security-policy> 父元素

<referrer-policy>

当启用时,将 Referrer Policy header 添加到响应中。

<referrer-policy> 属性

  • policy Referrer-Policy 头的策略。默认为 "no-referrer"。

<referrer-policy> 父元素

<feature-policy>

当启用时,将 Feature Policy header 添加到响应中。

<feature-policy> 属性

  • policy-directives Feature-Policy header 的安全政策指令。

<feature-policy> 父元素

<frame-options>

当启用时,将 X-Frame-Options header header 添加到响应中,这允许较新的浏览器做一些安全检查并防止 点击劫持攻击

<frame-options> 属性

  • disabled 如果禁用,X-Frame-Options header 将不被包含。默认为 false

  • policy

    • DENY 该页面不能在frame中显示,不管网站是否试图这样做。这是在指定 frame-options-policy 时的默认值。

    • SAMEORIGIN 该页只能在与该页本身同源的frame中显示。

    换句话说,如果你指定了 DENY,不仅从其他网站加载frame中的页面的尝试会失败,而且从同一网站加载时也会失败。另一方面,如果你指定了 SAMEORIGIN,你仍然可以在frame中使用该页面,只要包括在frame中的网站与提供该页面的网站相同。

<frame-options> 父元素

<permissions-policy>

Permissions-Policy header 添加到响应中。

<permissions-policy> 属性

  • policyPermissions-Policy header 写入的policy值。

<permissions-policy> 父元素

<xss-protection>

X-XSS-Protection header 添加到响应中,以协助防止 反射 / Type-1 跨站脚本(XSS)攻击。这决不是对XSS攻击的全面保护!

<xss-protection> 属性

<xss-protection> 父元素

<content-type-options>

在响应中添加 X-Content-Type-Options header,其值为 nosniff。这将 禁用 IE8+ 和Chrome扩展的 MIME-sniffing

<content-type-options> Attributes

  • disabled 指定是否应禁用 Content Type 选项。默认为 false

<content-type-options> 的父元素

<cross-origin-embedder-policy>

当启用时,会在响应中添加 Cross-Origin-Embedder-Policy header。

<cross-origin-embedder-policy> 属性
  • policy Cross-Origin-Embedder-Policy header 的 policy。

<cross-origin-embedder-policy> 的父元素

<cross-origin-opener-policy>

当启用时,会在响应中添加 Cross-Origin-Opener-Policy header。

<cross-origin-opener-policy> 属性
  • policy Cross-Origin-Opener-Policy header 的 policy。

<cross-origin-opener-policy> 的父元素

<cross-origin-resource-policy>

当启用时,将 Cross-Origin-Resource-Policy header 添加到响应中。

<cross-origin-resource-policy> 属性
  • policy Cross-Origin-Resource-Policy header 的 policy。

<cross-origin-resource-policy> 的父元素

<header>

在响应中添加额外的头信息,名称和值都需要被指定。

<header-attributes> 属性

  • header-name header name

  • value 要添加的 header 的 value

  • refHeaderWriter 接口的自定义实现的引用。

<header> 的父元素

<anonymous>

向栈添加一个 AnonymousAuthenticationFilter 和一个 AnonymousAuthenticationProvider。如果你使用 IS_AUTHENTICATED_ANONYMOUSLY 属性,则需要。

<anonymous> 的父元素

<anonymous> 的属性

  • enabled 在默认的命名空间设置中,匿名的 "authentication" 设施被自动启用。你可以用这个属性禁用它。

  • granted-authority 应该分配给匿名请求的授权。通常情况下,这被用来给匿名请求分配特定的角色,这些角色随后可以被用于授权决策。如果没有设置,默认为 ROLE_ANONYMOUS

  • key 提供者和过滤器之间共享的 key。这通常不需要被设置。如果不设置,它将默认为一个安全的随机生成的值。这意味着在使用匿名功能时,设置这个值可以改善启动时间,因为安全的随机值可能需要一段时间来生成。

  • username 应该分配给匿名请求的 username。这允许识别 principal,这对日志和审计可能很重要。如果没有设置,默认为 anonymousUser

<csrf>

这个元素将为应用程序添加 Cross Site Request Forger (CSRF)保护。它还更新了默认的 RequestCache,只在成功认证后重放 "GET" 请求。其他信息可以在参考资料的 Cross Site Request Forgery (CSRF) 部分找到。

<csrf> 的父元素

<csrf> 属性

  • disabled 可选的属性,指定禁用 Spring Security 的 CSRF 保护。默认是 false(CSRF保护被启用)。强烈建议让CSRF保护处于启用状态。

  • token-repository-ref 要使用的 CsrfTokenRepository。默认是 HttpSessionCsrfTokenRepository

  • request-handler-ref 要使用的可选 CsrfTokenRequestHandler。默认是 CsrfTokenRequestAttributeHandler

  • request-matcher-ref 用来确定是否应该应用 CSRF 的 RequestMatcher 实例。默认是任何HTTP方法,除了 "GET"、"TRACE"、"HEAD"、"OPTIONS"。

<custom-filter>

这个元素用于在过滤器链中添加一个过滤器。它不会创建任何额外的Bean,而是用来选择应用上下文中已经定义的 jakarta.servlet.Filter 类型的Bean,并将其添加到 Spring Security 维护的过滤器链中的特定位置。完整的细节可以在 命名空间 章节中找到。

<custom-filter> 的父元素

<custom-filter> 属性

  • after 过滤器紧随其后,自定义过滤器应放在链中。只有那些希望将自己的过滤器混入 security 过滤器链并对标准Spring Security过滤器有一定了解的高级用户才会需要这个功能。过滤器名称映射到特定的Spring Security实现过滤器。

  • before 自定义过滤器在链中应放在紧邻的过滤器之前。

  • position 自定义过滤器在链中的明确位置。如果你要替换一个标准的过滤器,请使用。

  • ref 定义了一个对实现 Filter 的Spring Bean的引用。

<expression-handler>

定义 SecurityExpressionHandler 实例,如果启用了基于表达式的访问控制,将使用该实例。如果没有提供,将使用默认的实现(不支持ACL)。

<expression-handler> 的属性

  • ref 定义了一个对实现 SecurityExpressionHandler 的 Spring Bean 的引用。

<form-login>

用于将 UsernamePasswordAuthenticationFilter 添加到过滤器堆栈,并将 LoginUrlAuthenticationEntryPoint 添加到 application context,以便按需提供 authentication。这将始终优先于其他命名空间创建的入口点。如果没有提供任何属性,将在URL "/login" 处自动生成一个登录页面 [2]该行为可以使用 <form-login> 属性来定制。

<form-login> 父元素

<form-login> 属性

  • always-use-default-target 如果设置为 true,用户将总是从 default-target-url 给出的值开始,无论他们是如何到达登录页面的。映射到 UsernamePasswordAuthenticationFilteralwaysUseDefaultTargetUrl 属性。默认值为 false

  • authentication-details-source-ref 对认证过滤器将使用的 AuthenticationDetailsSource 的引用。

  • authentication-failure-handler-ref 可以作为 authentication-failure-url 的替代品,让你完全控制认证失败后的导航流。该值应该是 application context 中 AuthenticationFailureHandler Bean的名称。

  • authentication-failure-url 映射到 UsernamePasswordAuthenticationFilterauthenticationFailureUrl 属性。定义了登录失败时浏览器将被重定向到的URL。默认为 /login?error,这将由自动登录页面生成器自动处理,重新渲染带有错误信息的登录页面。

  • authentication-success-handler-ref 这可以作为 default-target-urlalways-use-default-target 的替代品,让你完全控制认证成功后的导航流程。该值应该是 application context 中 AuthenticationSuccessHandler Bean的名称。默认情况下, SavedRequestAwareAuthenticationSuccessHandler 的实现被使用,并注入default-target-url

  • default-target-url 映射到 UsernamePasswordAuthenticationFilterdefaultTargetUrl 属性。如果没有设置,默认值是 "/"(应用程序root)。用户在登录后会被带到这个URL,前提是他们在试图访问安全资源时没有被要求登录,此时他们会被带到最初请求的URL。

  • login-page 应该用于呈现登录页面的URL。映射到 LoginUrlAuthenticationEntryPointloginFormUrl 属性。默认为 "/login"。

  • login-processing-url 映射到 UsernamePasswordAuthenticationFilterfilterProcessesUrl 属性。默认值是 "/login"。

  • password-parameter 包含密码的请求参数的名称。默认为 "password"。

  • username-parameter 请求参数的名称,其中包含用户名。默认为 "username"。

  • authentication-success-forward-urlForwardAuthenticationSuccessHandler 映射到 UsernamePasswordAuthenticationFilterauthenticationSuccessHandler 属性。

  • authentication-failure-forward-urlForwardAuthenticationFailureHandler 映射到 UsernamePasswordAuthenticationFilterauthenticationFailureHandler 属性。

<oauth2-login>

OAuth 2.0 Login 功能使用OAuth 2.0和/或OpenID Connect 1.0提供者配置认证支持。

<oauth2-login> 的父元素

<oauth2-login> 属性

  • client-registration-repository-refClientRegistrationRepository 的引用。

  • authorized-client-repository-refOAuth2AuthorizedClientRepository 的引用。

  • authorized-client-service-refOAuth2AuthorizedClientService 的引用。

  • authorization-request-repository-refAuthorizationRequestRepository 的引用。

  • authorization-request-resolver-refOAuth2AuthorizationRequestResolver 的引用。

  • authorization-redirect-strategy-ref 对 authorization RedirectStrategy 的引用。

  • access-token-response-client-ref Reference to the OAuth2AccessTokenResponseClient.

  • user-authorities-mapper-refGrantedAuthoritiesMapper 的引用。

  • user-service-refOAuth2UserService 的引用。

  • oidc-user-service-ref 对 OpenID Connect OAuth2UserService 的引用。

  • login-processing-url filter 处理认证请求的URI。

  • login-page 发送给用户登录的URI。

  • authentication-success-handler-refAuthenticationSuccessHandler 的引用。

  • authentication-failure-handler-refAuthenticationFailureHandler 的引用。

  • jwt-decoder-factory-refOidcAuthorizationCodeAuthenticationProvider 使用的 JwtDecoderFactory 的引用。

<oauth2-client>

Configures OAuth 2.0 Client support.

<oauth2-client> 的父元素

<oauth2-client> 属性

  • client-registration-repository-refClientRegistrationRepository 的引用。

  • authorized-client-repository-refOAuth2AuthorizedClientRepository 的引用。

  • authorized-client-service-refOAuth2AuthorizedClientService 的引用。

<oauth2-client> 的子节点

<authorization-code-grant>

<authorization-code-grant> 的父元素

<authorization-code-grant> 属性

  • authorization-request-repository-refAuthorizationRequestRepository 的引用。

  • authorization-redirect-strategy-ref 对 authorization RedirectStrategy 的引用。

  • authorization-request-resolver-refOAuth2AuthorizationRequestResolver 的引用。

  • access-token-response-client-refOAuth2AccessTokenResponseClient 的引用。

<client-registrations>

在OAuth 2.0或OpenID Connect 1.0提供者处注册(ClientRegistration)的客户的容器元素。

<client-registrations> 的子元素

<client-registration>

代表一个在OAuth 2.0或OpenID Connect 1.0提供者处注册的客户端。

<client-registration> 的父元素

<client-registration> 属性

  • registration-id ClientRegistration 的唯一标识ID。

  • client-id 客户端ID。

  • client-secret 客户端 secret。

  • client-authentication-method 用于验证客户和提供者的方法。支持的值是 client_secret_basic, client_secret_post, private_key_jwt, client_secret_jwtnone (public clients)

  • authorization-grant-type OAuth 2.0授权框架定义了四种 Authorization Grant 类型。支持的值是 authorization_code, client_credentials, password,以及扩展 grant type urn:ietf:params:oauth:grant-type:jwt-bearer

  • redirect-uri 客户端注册的重定向URI,Authorization Server 在最终用户认证和授权访问客户端后将其重定向到最终用户的 user-agent。

  • scope 客户端在授权请求流程中要求的scope,如openid、电子邮件或个人资料。

  • client-name 用于客户端的描述性名称。这个名字可以在某些情况下使用,比如在自动生成的登录页面中显示客户端的名字。

  • provider-id 对相关提供商的引用。可以引用 <provider> 元素或使用常见的提供者之一(谷歌、Github、Facebook、okta)。

<provider>

OAuth 2.0或OpenID Connect 1.0提供者的配置信息。

<provider> 的父元素

<provider> 属性

  • provider-id provider 的唯一标识ID。

  • authorization-uri 授权服务器的授权端点URI。

  • token-uri 授权服务器的Token端点URI。

  • user-info-uri 用于访问已验证的终端用户的 claims/attribute 的UserInfo端点URI。

  • user-info-authentication-method 向UserInfo端点发送访问令牌时使用的认证方法。支持的值是 headerformquery

  • user-info-user-name-attribute UserInfo 响应中返回的引用终端用户的名称或标识符的属性的名称。

<oauth2-resource-server>

BearerTokenAuthenticationFilterBearerTokenAuthenticationEntryPointBearerTokenAccessDeniedHandler 添加到配置中。此外,必须指定 <jwt><opaque-token>

<oauth2-resource-server> 的父元素

<oauth2-resource-server> 的子元素

<oauth2-resource-server> 属性

  • authentication-manager-resolver-refAuthenticationManagerResolver 的引用,它将在请求时解析 AuthenticationManager

  • bearer-token-resolver-refBearerTokenResolver 的引用,它将从请求中检索出 bearer token。

  • entry-point-ref 对将处理未授权请求的 AuthenticationEntryPoint 的引用

<jwt>

代表一个OAuth 2.0资源服务器,将授权JWT。

<jwt> 的父元素

<jwt> 属性

  • jwt-authentication-converter-refConverter<Jwt, AbstractAuthenticationToken> 的引用。

  • jwt-decoder-refJwtDecoder 的引用。这是一个较大的组件,覆盖了 jwk-set-uri

  • jwk-set-uri JWK Set Uri,用于从OAuth 2.0授权服务器加载签名验证密钥。

<opaque-token>

代表一个OAuth 2.0资源服务器,将授权opaque token。

<opaque-token> 的父元素

<opaque-token> 属性

  • introspector-refOpaqueTokenIntrospector 的引用。这是一个更大的组件,它覆盖了`introspection-uri`, client-id, 和 client-secret.

  • introspection-uri 自省(Introspection)Uri,用于自省 opaque token 的细节。应该伴随着 client-idclient-secret

  • client-id 客户端ID,用于针对所提供的 introspection-uri 进行客户端认证。

  • client-secret 客户端ID,用于针对所提供的 introspection-uri 进行客户端认证。

  • authentication-converter-refOpaqueTokenAuthenticationConverter 的引用。负责将成功的自省(introspection)结果转换为一个 Authentication 实例。

<relying-party-registrations>

在SAML 2.0身份提供者处注册(ClientRegistration)的依赖方的容器元素。

<relying-party-registrations> 的子节点

<relying-party-registration>

代表一个在SAML 2.0身份提供者处注册的依赖方。

<relying-party-registration> 的父元素

<relying-party-registration> 属性

  • registration-id RelyingPartyRegistration 的唯一标识ID。

  • metadata-location 断言方的元数据位置。

  • assertion-consumer-service-location AssertionConsumerService 位置。相当于依赖方的 <SPSSODescriptor> 中的 <AssertionConsumerService Location="…​"/> 的值。

  • assertion-consumer-service-binding AssertionConsumerService Binding。相当于依赖方的 <SPSSODescriptor> 中的 <AssertionConsumerService Binding="…​"/> 的值。支持的值是 POSTREDIRECT

  • single-logout-service-location SingleLogoutService Location。相当于依赖方的 <SPSSODescriptor><SingleLogoutService Location="…​"/> 的值。

  • single-logout-service-response-location SingleLogoutService ResponseLocation。相当于依赖方的 <SPSSODescriptor><SingleLogoutService Location="…​"/> 的值。

  • single-logout-service-binding SingleLogoutService Binding。相当于依赖方的 <SPSSODescriptor><SingleLogoutService Binding="…​" /> 的值。支持的值是 POSTREDIRECT

  • asserting-party-id 对相关断言方的引用。必须引用一个 <asserting-party> 元素。

<relying-party-registration> 子节点

<decryption-credential>

与依赖方相关的解密凭证(credentials)。

<decryption-credential> 的父元素

<decryption-credential> 属性

  • certificate-location certificate 证书的位置。

  • private-key-location 信赖方私钥的位置。

<signing-credential>

与依赖方相关的签名凭证。

<verification-credential> 的父元素

<verification-credential> 属性

  • certificate-location certificate 证书的位置。

  • private-key-location 信赖方私钥的位置。

<asserting-party>

SAML 2.0断言方的配置信息。

<asserting-party> 的父元素。

<asserting-party> 属性

  • asserting-party-id 断言方的唯一标识ID。

  • entity-id 断言方的EntityID。

  • want-authn-requests-signed WantAuthnRequestsSigned 设置,表示断言方希望依赖方在发送 AuthnRequest 前签署。

  • single-sign-on-service-binding SingleSignOnService Binding, 支持的值是 POSTREDIRECT

  • signing-algorithms org.opensaml.saml.ext.saml2alg.SigningMethod Algorithms 的列表,按优先顺序排列,用于此断言方。

  • single-logout-service-location SingleLogoutService Location。相当于断言方的 <IDPSSODescriptor><SingleLogoutService Location="…​"/> 的值。

  • single-logout-service-response-location SingleLogoutService ResponseLocation。相当于断言方 <IDPSSODescriptor><SingleLogoutService ResponseLocation="…​" /> 的值。

  • single-logout-service-binding SingleLogoutService Binding。相当于断言方的 <IDPSSODescriptor><SingleLogoutService Binding="…​"/> 的值。支持的值是 POSTREDIRECT

<asserting-party> 的子节点

<encryption-credential>

与断言方相关的加密凭证(credential)。

<encryption-credential> 的父元素

<encryption-credential> 属性

  • certificate-location certificate 的位置。

  • private-key-location 信赖方私钥的位置。

<verification-credential>

与断言方相关的验证凭证。

<verification-credential> 的父元素

<verification-credential> 属性

  • certificate-location certificate 的位置。

  • private-key-location 信赖方私钥的位置。

<http-basic>

BasicAuthenticationFilterBasicAuthenticationEntryPoint 添加到配置中。如果不启用基于表单的登录,后者将只被用作配置入口点。

<http-basic> 的父元素

<http-basic> 属性

  • authentication-details-source-ref 对认证过滤器将使用的 AuthenticationDetailsSource 的引用。

  • entry-point-refBasicAuthenticationFilter 使用的 AuthenticationEntryPoint

<http-firewall> 元素

这是一个顶层元素,可以用来将 HttpFirewall 的自定义实现注入由命名空间创建的 FilterChainProxy 中。默认的实现应该适用于大多数应用程序。

<http-firewall> 属性

  • ref 定义了一个对实现 HttpFirewall 的 Spring Bean 的引用。

<intercept-url>

这个元素用于定义应用程序感兴趣的 URL pattern 集,并配置如何处理它们。它被用来构造 FilterSecurityInterceptor 使用的 FilterInvocationSecurityMetadataSource。它还负责配置 ChannelProcessingFilter,例如,如果特定的URL需要通过HTTPS访问的话。在对传入的请求进行指定pattern的匹配时,将按照元素的声明顺序进行匹配。因此,最具体的pattern应该放在前面,最一般的应该放在最后。

<intercept-url> 的父元素

<intercept-url> 属性

  • access 列出将存储在 FilterInvocationSecurityMetadataSource 中的访问属性,用于定义的 URL pattern/method 组合。这应该是一个以逗号分隔的 security configuration 属性(如角色名称)的列表。

  • method HTTP方法,该方法将与模式和Servlet路径(可选)结合使用,以匹配传入的请求。如果省略,任何方法都可以匹配。如果一个相同的模式被指定为有方法和无方法,特定方法的匹配将被优先考虑。

  • pattern 定义 URL path 的 pattern。内容将取决于包含http元素的 request-matcher 属性,所以如果Spring MVC在classpath中,将默认为MVC匹配器。

  • request-matcher-refRequestMatcher 的引用,将用于确定是否使用此 <intercept-url>

  • requires-channel 可以是 "http" 或 "https",这取决于一个特定的 URL pattern 是否应该通过 HTTP 或 HTTPS 访问。另外,当没有偏好时,可以使用值 "any"。如果这个属性出现在任何 <intercept-url> 元素上,那么 ChannelProcessingFilter 将被添加到过滤器栈中,并将其额外的依赖关系添加到 application context。

如果添加了 <port-mappings> 配置,这将被 SecureChannelProcessorInsecureChannelProcessor Bean 用来确定用于重定向到H TTP/HTTPS 的端口。

此属性对于 filter-security-metadata-source 来说是无效的。
  • servlet-path 将与pattern和HTTP方法结合使用的servlet路径,以匹配一个传入的请求。这个属性只适用于request-matcher 是’mvc’时。此外,该值只在以下2种使用情况下需要。1)在 ServletContext 中注册了2个或更多的 HttpServlet,它们的映射以 '/' 开始,并且是不同的;2)pattern以注册的 HttpServlet 路径的相同值开始,不包括默认(根)HttpServlet '/'

此属性对于 filter-security-metadata-source 来说是无效的。

<jee>

J2eePreAuthenticatedProcessingFilter 添加到过滤器链,以提供与容器认证的集成。

<jee> 的父元素

<jee> 属性

  • mappable-roles 在传入的 HttpServletRequest 中寻找的角色的逗号分隔的列表。

  • user-service-ref 对一个 user-service(或 UserDetailsService Bean)的引用 Id

<logout>

在过滤器栈中添加一个 LogoutFilter。这是用一个 SecurityContextLogoutHandler 配置的。

<logout> 的父元素

<logout> 属性

  • delete-cookies 以逗号分隔的cookie名称列表,这些cookie在用户注销时应被删除。

  • invalidate-session 映射到 SecurityContextLogoutHandlerinvalidateHttpSession。默认为 "true",所以 session 将在注销时被废止。

  • logout-success-url 用户注销后将被带到的目标URL。默认为 <form-login-login-page>/?logout(即 /login?logout)。

    设置此属性将为 SessionManagementFilter 注入配置有该属性值的 SimpleRedirectInvalidSessionStrategy。当一个无效的 session ID 被提交时,该策略将被调用,重定向到配置的URL。

  • logout-url 用于注销的URL(即将被过滤器处理)。默认为 "/logout"。

  • success-handler-ref 可用于提供 LogoutSuccessHandler 的一个实例,该实例将被调用以控制注销后的导航。

<saml2-login>

SAML 2.0 Login 功能使用SAML 2.0服务提供者配置认证支持。

<saml2-login> 的父元素

<saml2-login> 属性

  • relying-party-registration-repository-ref RelyingPartyRegistrationRepository 的引用。

  • authentication-request-repository-ref Saml2AuthenticationRequestRepository 的引用。

  • authentication-request-context-resolver-ref Saml2AuthenticationRequestResolver 的引用。

  • authentication-converter-ref AuthenticationConverter 的引用。

  • login-processing-url 过滤器处理认证请求的URI。

  • login-page 发送给用户登录的URI。

  • authentication-success-handler-ref AuthenticationSuccessHandler 的引用。

  • authentication-failure-handler-ref AuthenticationFailureHandler 的引用。

  • authentication-manager-ref AuthenticationManager 的引用。

<saml2-logout>

SAML 2.0 Single Logout 功能配置了对RP和AP发起的SAML 2.0 Single Logout 的支持。

<saml2-logout> 的父元素

<saml2-logout> 属性

  • logout-url 依赖方或断言方可以触发注销的URL。

  • logout-request-url 断言方可以发送SAML 2.0注销请求的URL。

  • logout-response-url 断言方可以发送SAML 2.0注销响应的URL。

  • relying-party-registration-repository-ref RelyingPartyRegistrationRepository 的引用。

  • logout-request-validator-ref Saml2LogoutRequestValidator 的引用。

  • logout-request-resolver-ref Saml2LogoutRequestResolver 的引用。

  • logout-request-repository-ref Saml2LogoutRequestRepository 的引用。

  • logout-response-validator-ref Saml2LogoutResponseValidator 的引用。

  • logout-response-resolver-ref Saml2LogoutResponseResolver 的引用。

<password-management>

这个元素配置了密码管理(password management)。

<password-management> 的父元素

<password-management> 属性

  • change-password-page 更改密码的页面。默认为 "/change-password"。

<port-mappings>

默认情况下,PortMapperImpl 的一个实例将被添加到配置中,用于重定向到安全和不安全的URL。这个元素可以选择性地用来覆盖该类定义的默认映射。每个子 <port-mapping> 元素定义了一对 HTTP:HTTPS 端口。默认的映射是 80:443 和8080:8443。一个覆盖这些端口的例子可以在 重定向到HTTPS中找到。

<port-mappings> 的父元素

<port-mappings> 的子元素

<port-mapping>

提供一种方法,在强制重定向时,将http端口映射到https端口。

<port-mapping> 的父元素

<port-mapping> 属性

  • http 要使用的http端口。

  • https 要使用的https端口。

<remember-me>

RememberMeAuthenticationFilter 添加到栈中。这又将被配置为 TokenBasedRememberMeServicesPersistentTokenBasedRememberMeServices 或用户指定的实现 RememberMeServices 的 Bean,取决于属性设置。

<remember-me> 的父元素

<remember-me> 属性

  • authentication-success-handler-ref 如果需要自定义导航,在 RememberMeAuthenticationFilter 上设置 AuthenticationSuccessHandler 属性。该值应该是应用 application context 中的 AuthenticationSuccessHandler Bean的名称。

  • data-source-ref 一个对 DataSource bean 的引用。如果设置了这个, PersistentTokenBasedRememberMeServices 将被使用并配置一个 JdbcTokenRepositoryImpl 实例。

  • remember-me-parameter 用于切换 remember-me 认证的请求参数的名称。默认为 "remember-me"。映射到 AbstractRememberMeServices 的 "parameter" 属性。

  • key 映射到 AbstractRememberMeServices 的 "key" 属性。应该设置为一个唯一的值,以确保 remember-me cookies只在一个应用程序中有效 [3]。如果没有设置,将生成一个安全的随机值。由于生成安全的随机值可能需要一段时间,明确设置这个值可以帮助改善使用 remember-me 功能时的启动时间。

  • services-alias 将内部定义的 RememberMeServices 导出为一个Bean别名,允许它被 application context 中的其他Bean使用。

  • services-ref 允许完全控制将被过滤器使用的 RememberMeServices 实现。该值应该是应用上下文中实现该接口的bean的 id。如果正在使用注销过滤器(logout filter),还应该实现 LogoutHandler

  • token-repository-ref 配置 PersistentTokenBasedRememberMeServices,但允许使用一个自定义的 PersistentTokenRepository bean。

  • token-validity-seconds 映射到 AbstractRememberMeServicestokenValiditySeconds 属性。指定记住我的cookie的有效时间,以秒为单位。默认情况下,它的有效期为14天。

  • user-service-ref Remember-me服务的实现需要访问 UserDetailsService,所以在应用环境中必须有一个定义。如果只有一个,它将被命名空间配置自动选择和使用。如果有多个实例,你可以使用这个属性明确指定一个bean id

<request-cache> 元素

设置 RequestCache 实例,该实例将被 ExceptionTranslationFilter 用于在调用 AuthenticationEntryPoint 之前存储请求信息。

<request-cache> 的父元素

<request-cache> 属性

  • ref 定义了一个对Spring Bean的引用,它是一个 RequestCache

<session-management>

Session-management 相关的功能是通过在过滤器栈中增加一个 SessionManagementFilter 来实现的。

<session-management> 的父元素

<session-management> 属性

  • authentication-strategy-explicit-invocation 将此属性设置为 "true" 意味着将不注入 SessionManagementFilter,并且需要显式调用 SessionAuthenticationStrategy

  • invalid-session-url 设置此属性将为 SessionManagementFilter 注入配置有该属性值的 SimpleRedirectInvalidSessionStrategy。当一个无效的 session ID被提交时,该策略将被调用,重定向到配置的URL。

  • invalid-session-url 允许注入由 SessionManagementFilter 使用的 InvalidSessionStrategy 实例。使用此属性或 invalid-session-url 属性,但不能同时使用。

  • session-authentication-error-url 定义错误页面的URL,当 SessionAuthenticationStrategy 引发异常时应显示该页面。如果不设置,一个未经授权的(401)错误代码将被返回给客户端。请注意,如果错误发生在基于表单的登录过程中,这个属性并不适用,在这种情况下,认证失败的URL将被优先考虑。

  • session-authentication-strategy-ref 允许注入由 SessionManagementFilter 使用的 SessionAuthenticationStrategy 实例。

  • session-fixation-protection 表示在用户认证时如何应用会话固定(session fixation)保护。如果设置为 "none",将不应用任何保护。"newSession" 将创建一个新的空会话,只迁移Spring Security相关的属性。"migrateSession" 将创建一个新的会话,并将所有会话属性复制到新的会话中。在Servlet 3.1(Java EE 7)和更新的容器中,指定 "changeSessionId" 将保留现有会话,并使用容器提供的会话固定保护(HttpServletRequest#changeSessionId())。在Servlet 3.1和更新的容器中默认为 "changeSessionId",在旧的容器中默认为 "migrateSession"。如果在较早的容器中使用 "changeSessionId",会抛出一个异常。

    如果启用了会话固定保护,SessionManagementFilter 将被注入一个适当配置的 DefaultSessionAuthenticationStrategy。更多细节见该类的Javadoc。

<session-management> 的子元素

<concurrency-control>

增加对并发会话控制的支持,允许对用户可以拥有的活动会话(session)数量进行限制。一个 ConcurrentSessionFilter 将被创建,一个 ConcurrentSessionControlAuthenticationStrategy 将被用于 SessionManagementFilter。如果已经声明了一个 form-login 元素,该策略对象也将被注入到创建的认证过滤器中。将创建一个 SessionRegistry 的实例(SessionRegistryImpl 实例,除非用户希望使用自定义bean)供该策略使用。

<concurrency-control> 的父元素

<concurrency-control> 属性

  • error-if-maximum-exceeded 如果设置为 "true",当用户试图超过允许的最大会话数量时,将导致 SessionAuthenticationException。默认行为是使原始会话过期。

  • expired-url 如果用户试图使用一个已经被并发会话控制器 "过期" 的会话,因为用户已经超过了允许的会话数量并在其他地方再次登录,那么用户将被重定向到的URL。应该被设置,除非 exception-if-maximum-exceeded 被设置。如果没有提供值,过期消息将直接写回到响应中。

  • expired-url 允许注入 ConcurrentSessionFilter 使用的 ExpiredSessionStrategy 实例。

  • max-sessions 映射到 ConcurrentSessionControlAuthenticationStrategymaximumSessions 属性。指定 -1 为该值,以支持无限个会话。

  • session-registry-alias 有一个对内部会话注册中心的引用也很有用,可以在你自己的Bean或管理界面中使用。你可以使用 session-registry-alias 属性公开内部Bean,给它一个可以在你的配置中使用的名字。

  • session-registry-ref 用户可以使用 session-registry-ref 属性提供自己的 SessionRegistry 实现。其他并发的会话控制 Bean 将被连接起来使用它。

<x509>

增加了对 X.509 认证的支持。一个 X509AuthenticationFilter 将被添加到栈中,一个 Http403ForbiddenEntryPoint Bean将被创建。后者只有在没有使用其他认证机制的情况下才会被使用(它的唯一功能是返回 HTTP 403 错误代码)。一个 PreAuthenticatedAuthenticationProvider 也将被创建,它将用户权限的加载委托给一个 UserDetailsService

<x509> 的父元素

<x509> 属性

  • authentication-details-source-ref AuthenticationDetailsSource 的引用。

  • subject-principal-regex 定义一个正则表达式,用于从证书中提取用户名(用于 UserDetailsService)。

  • user-service-ref 在配置了多个实例的情况下,允许一个特定的 UserDetailsService 被用于 X.509。如果没有设置,将尝试自动定位一个合适的实例并使用它。

<filter-chain-map>

用于明确配置带有 FilterChainMapFilterChainProxy 实例。

<filter-chain-map> 属性

  • request-matcher 定义用于匹配传入请求的策略。目前的选项是 "ant"(用于ant路径模式),"regex" 用于正则表达式,"ciRegex" 用于不区分大小写的正则表达式。

<filter-chain-map> 子元素

<filter-chain>

用来定义特定的 URL pattern 和适用于匹配该pattern的URL的过滤器列表。当多个 filter-chain 元素被组合成一个列表以配置 FilterChainProxy 时,最具体的pattern必须被放在列表的顶部,而最一般的pattern则在底部。

<filter-chain> 的父元素

<filter-chain> 属性

  • filters 以逗号分隔的对实现 Filter 的 Spring Bean 的引用列表。值 "none" 意味着此 FilterChain 不应该使用 Filter

  • pattern 一个与 request-matcher 结合起来创建 RequestMatcher 的 pattern。

  • request-matcher-refRequestMatcher 的引用,它将被用来确定是否应该调用 filters 属性中的任何 Filter

<filter-security-metadata-source>

用于明确配置 FilterSecurityMetadataSource Bean,以便与 FilterSecurityInterceptor 一起使用。通常只有在你明确配置 FilterChainProxy 时才需要,而不是使用 <http> 元素。使用的 intercept-url 元素应该只包含 patternmethodaccess 属性。任何其他属性都会导致配置错误。

<filter-security-metadata-source> 属性

  • id 一个Bean的唯一ID标识符,用于在上下文中引用该Bean的其他地方。

  • request-matcher 定义用于匹配传入请求的策略。目前的选项是 "ant"(用于ant路径模式),"regex" 用于正则表达式,"ciRegex" 用于不区分大小写的正则表达式。

  • use-expressions 启用 <intercept-url> 元素中 'access' 属性中的表达式,而不是传统的配置属性列表。默认为 "true"。如果启用,每个属性应该包含一个布尔表达式。如果表达式评估为 'true',将被授予访问权。

<filter-security-metadata-source> 的子元素


1. 关于如何从你的 web.xml 中设置映射,请参见 介绍章节
2. 这个功能实际上只是为了方便而提供的,并不打算用于生产(在生产中会选择一种视图技术,可以用来渲染一个定制的登录页面)。DefaultLoginPageGeneratingFilter 类负责渲染登录页面,如果需要的话,将为正常形式的登录和/或OIDC提供登录表单。
3. 这并不影响使用 PersistentTokenBasedRememberMeServices,其中token被存储在服务器端。