Web 应用安全

<debug>

启用 Spring Security 调试基础设施。这将提供人类可读(多行)的调试信息,以监控进入安全过滤器的请求。这可能包含敏感信息,例如请求参数或头,因此只能在开发环境中使用。

<http>

如果在应用程序中使用 <http> 元素,则会创建一个名为 "springSecurityFilterChain" 的 FilterChainProxy Bean,并且该元素中的配置用于在 FilterChainProxy 中构建一个过滤器链。从 Spring Security 3.1 开始,可以使用额外的 http 元素添加额外的过滤器链[1] 用于如何设置从您的 web.xml 的映射]。标准过滤器的位置是固定的(参见命名空间介绍中的过滤器顺序表),消除了框架早期版本中用户必须在 FilterChainProxy Bean 中显式配置过滤器链时常见的错误源。当然,如果需要完全控制配置,您仍然可以这样做。

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

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

<http> 属性

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

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

  • use-authorization-manager 使用此 AuthorizationManager 而不是从 <intercept-url> 元素派生一个

  • access-decision-manager-ref 可选属性,指定应用于授权 HTTP 请求的 AccessDecisionManager 实现的 ID。默认使用 AffirmativeBased 实现,包含 RoleVoterAuthenticatedVoter

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

  • observation-registry-refFilterChain 和相关组件使用的 ObservationRegistry 的引用

  • auto-config 自动注册登录表单、BASIC 身份验证、注销服务。如果设置为 "true",将添加所有这些功能(尽管您仍然可以通过提供相应的元素来自定义每个功能的配置)。如果未指定,默认为 "false"。不推荐使用此属性。请改用显式配置元素以避免混淆。

  • create-session 控制 Spring Security 类创建 HTTP 会话的积极性。选项包括

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

    • ifRequired - Spring Security 仅在需要会话时才创建会话(默认值)。

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

    • stateless - Spring Security 不会创建会话,并忽略会话以获取 Spring Authentication

  • disable-url-rewriting 阻止会话 ID 附加到应用程序的 URL 中。如果此属性设置为 true,客户端必须使用 Cookie。默认值为 true

  • entry-point-ref 通常使用的 AuthenticationEntryPoint 将根据已配置的身份验证机制来设置。此属性允许通过定义一个自定义的 AuthenticationEntryPoint Bean 来覆盖此行为,该 Bean 将启动身份验证过程。

  • jaas-api-provision 如果可用,则将请求作为从 JaasAuthenticationToken 获取的主体运行,这通过向栈中添加 JaasApiIntegrationFilter Bean 来实现。默认为 false

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

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

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

  • patternhttp 元素定义模式控制通过其定义的过滤器列表进行过滤的请求。解释取决于配置的 request-matcher。如果未定义模式,则将匹配所有请求,因此应首先声明最具体的模式。

  • realm 设置基本身份验证(如果启用)使用的 Realm 名称。对应于 BasicAuthenticationEntryPoint 上的 realmName 属性。

  • request-matcher 定义 FilterChainProxyintercept-url 创建的 Bean 中用于匹配传入请求的 RequestMatcher 策略。目前选项包括 mvcantregexciRegex,分别对应 Spring MVC、ant、正则表达式和不区分大小写的正则表达式。使用其 patternmethodservlet-path 属性为每个 intercept-url 元素创建一个单独的实例。Ant 路径使用 AntPathRequestMatcher 进行匹配,正则表达式使用 RegexRequestMatcher 进行匹配,Spring MVC 路径匹配使用 MvcRequestMatcher。有关匹配如何执行的详细信息,请参阅这些类的 Javadoc。如果在 classpath 中存在 Spring MVC,则 MVC 是默认策略,否则使用 Ant 路径。

  • request-matcher-ref 对实现 RequestMatcher 的 Bean 的引用,该 Bean 将确定是否应使用此 FilterChain。这比 pattern 更强大的替代方案。

  • security 通过将此属性设置为 none,请求模式可以映射到空过滤器链。将不应用安全,也无法使用 Spring Security 的任何特性。

  • security-context-repository-ref 允许将自定义的 SecurityContextHolderStrategy 注入到 SecurityContextPersistenceFilterSecurityContextHolderFilterBasicAuthenticationFilterUsernamePasswordAuthenticationFilterExceptionTranslationFilterLogoutFilter 等中。

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

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

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

  • use-expressions 启用 access 属性中的 EL 表达式,如基于表达式的访问控制章节所述。默认值为 true。

<access-denied-handler>

此元素允许您使用 error-page 属性设置 ExceptionTranslationFilter 使用的默认 AccessDeniedHandlererrorPage 属性,或使用 ref 属性提供您自己的实现。这在 ExceptionTranslationFilter 部分有更详细的讨论。

<access-denied-handler> 的父元素

<access-denied-handler> 属性

  • error-page 如果已通过身份验证的用户请求他们无权访问的页面,将被重定向到的访问拒绝页面。

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

<cors>

此元素允许配置 CorsFilter。如果未指定 CorsFilterCorsConfigurationSource,并且 classpath 中存在 Spring MVC,则使用 HandlerMappingIntrospector 作为 CorsConfigurationSource

<cors> 属性

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

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

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

<cors> 的父元素

<headers>

此元素允许配置要随响应发送的额外(安全)头。它使多个头的配置变得容易,并且还允许通过 header 元素设置自定义头。更多信息可以在参考手册的 安全头 部分找到。

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

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

  • X-Frame-Options - 可以使用 frame-options 元素设置。X-Frame-Options 头可用于防止点击劫持攻击。

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

  • X-Content-Type-Options - 可以使用 content-type-options 元素设置。X-Content-Type-Options 头阻止 Internet Explorer 从声明的 content-type 中进行 MIME 嗅探。这也适用于 Google Chrome 在下载扩展时。

  • 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 是一种网络应用程序可以利用的机制,用于管理 referrer 字段,该字段包含用户访问的上一页。

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

  • 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 是一种机制,表达浏览器应阻止对给定资源进行无 CORS 的跨域/跨站请求的意愿。

<headers> 属性

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

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

  • disabled 可选属性,指定是否禁用 Spring Security 的 HTTP 响应头。默认值为 false(头已启用)。

<headers> 的父元素

<cache-control>

添加 Cache-Control、Pragma 和 Expires 头,以确保浏览器不缓存您的安全页面。

<cache-control> 属性

  • disabled 指定是否应禁用 Cache Control。默认 false。

<cache-control> 的父元素

<hsts>

启用后,为任何安全请求向响应添加 Strict-Transport-Security 头。这允许服务器指示浏览器在未来的请求中自动使用 HTTPS。

<hsts> 属性

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

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

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

  • request-matcher-ref 用于确定是否应设置头的 RequestMatcher 实例。默认值是当 HttpServletRequest.isSecure() 为 true 时。

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

<hsts> 的父元素

<hpkp>

启用后,为任何安全请求向响应添加 HTTP 公钥固定扩展头。这允许 HTTPS 网站抵御使用错误颁发或其他欺诈证书的攻击者的冒充。

<hpkp> 属性

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

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

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

  • report-only 指定浏览器是否应仅报告固定验证失败。默认 true。

  • report-uri 指定浏览器应报告固定验证失败的 URI。

<hpkp> 的父元素

<pins>

固定列表

<pins> 的子元素

<pin>

使用 base64 编码的 SPKI 指纹作为值,并使用加密哈希算法作为属性来指定一个固定

<pin> 属性

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

<pin> 的父元素

<content-security-policy>

启用后,为响应添加 内容安全策略 (CSP) 头。CSP 是一种网络应用程序可以利用的机制,用于减轻内容注入漏洞,例如跨站脚本 (XSS)。

<content-security-policy> 属性

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

  • report-only 设置为 true,以启用 Content-Security-Policy-Report-Only 头,仅用于报告策略违规。默认为 false。

<content-security-policy> 的父元素

<referrer-policy>

启用后,为响应添加 Referrer Policy 头。

<referrer-policy> 属性

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

<referrer-policy> 的父元素

<feature-policy>

启用后,为响应添加 Feature Policy 头。

<feature-policy> 属性

  • policy-directives Feature-Policy 头的安全策略指令。

<feature-policy> 的父元素

<frame-options>

启用后,为响应添加 X-Frame-Options 头,这允许较新的浏览器进行一些安全检查并防止点击劫持攻击。

<frame-options> 属性

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

  • policy

    • DENY 页面不能显示在框架中,无论哪个站点尝试显示。这是指定 frame-options-policy 时的默认值。

    • SAMEORIGIN 页面只能在与页面本身同源的框架中显示

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

<frame-options> 的父元素

<permissions-policy>

Permissions-Policy header 添加到响应中。

<permissions-policy> 属性

  • policy 用于 Permissions-Policy header 的策略值。

<permissions-policy> 的父元素

<xss-protection>

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

<xss-protection> 属性

<xss-protection> 的父元素

<content-type-options>

向响应添加值为 nosniff 的 X-Content-Type-Options header。这会为 IE8+ 和 Chrome 扩展程序禁用 MIME 嗅探

<content-type-options> 属性

  • disabled 指定是否应禁用内容类型选项。默认为 false。

<content-type-options> 的父元素

<cross-origin-embedder-policy>

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

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

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

<cross-origin-opener-policy>

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

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

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

<cross-origin-resource-policy>

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

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

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

<header>

向响应添加额外的 header,需要同时指定名称和值。

<header-attributes> 属性

  • header-name header 的 name

  • value 要添加的 header 的 value

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

<header> 的父元素

<anonymous>

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

<anonymous> 的父元素

<anonymous> 属性

  • enabled 在默认的命名空间设置下,匿名“认证”功能会自动启用。你可以使用此属性禁用它。

  • granted-authority 应分配给匿名请求的已授权权限。通常用于为匿名请求分配特定的角色,随后可用于授权决策。如果未设置,默认为 ROLE_ANONYMOUS

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

  • username 应分配给匿名请求的用户名。这允许识别主体,这对于日志记录和审计可能很重要。如果未设置,默认为 anonymousUser

<csrf>

此元素将为应用程序添加 跨站请求伪造 (CSRF) 防护。它还会更新默认的 RequestCache,使其仅在成功认证后重放“GET”请求。更多信息请参见参考资料的 跨站请求伪造 (CSRF) 部分。[2]

<csrf> 的父元素

<csrf> 属性

  • disabled 可选属性,用于指定禁用 Spring Security 的 CSRF 防护。默认为 false(CSRF 防护已启用)。强烈建议保持启用 CSRF 防护。

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

  • request-handler-ref 可选的 CsrfTokenRequestHandler。默认为 CsrfTokenRequestAttributeHandler

  • request-matcher-ref 用于确定是否应应用 CSRF 的 RequestMatcher 实例。默认为除 "GET", "TRACE", "HEAD", "OPTIONS" 之外的任何 HTTP 方法。

<custom-filter>

此元素用于向过滤器链添加一个过滤器。它不会创建任何额外的 bean,而是用于选择应用程序上下文中已定义的 jakarta.servlet.Filter 类型的 bean,并将其添加到 Spring Security 维护的过滤器链中的特定位置。完整的详细信息请参见 命名空间章节

<custom-filter> 的父元素

<custom-filter> 属性

  • after custom-filter 应放置在链中紧随其后的过滤器。此功能仅适用于希望将其自己的过滤器混合到安全过滤器链中并对标准 Spring Security 过滤器有所了解的高级用户。过滤器名称映射到特定的 Spring Security 实现过滤器。

  • before custom-filter 应放置在链中紧靠其前的过滤器。

  • position custom-filter 应放置在链中的显式位置。如果你要替换标准过滤器,请使用此选项。

  • ref 定义对实现 Filter 接口的 Spring bean 的引用。

<expression-handler>

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

<expression-handler> 属性

  • ref 定义对实现 SecurityExpressionHandler 接口的 Spring bean 的引用。

<form-login>

用于向过滤器栈中添加一个 UsernamePasswordAuthenticationFilter,并向应用程序上下文添加一个 LoginUrlAuthenticationEntryPoint 以提供按需认证。这将始终优先于其他命名空间创建的入口点。如果未提供属性,将在 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 的替代方案,使你能够完全控制认证失败后的导航流程。该值应是应用程序上下文中 AuthenticationFailureHandler bean 的名称。

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

  • authentication-success-handler-ref 可用作 default-target-urlalways-use-default-target 的替代方案,使你能够完全控制成功认证后的导航流程。该值应是应用程序上下文中 AuthenticationSuccessHandler bean 的名称。默认情况下,使用 SavedRequestAwareAuthenticationSuccessHandler 的实现,并注入 default-target-url

  • default-target-url 映射到 UsernamePasswordAuthenticationFilterdefaultTargetUrl 属性。如果未设置,默认值为 "/"(应用程序根目录)。用户登录后将被带到此 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 登录功能通过使用 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 对授权 RedirectStrategy 的引用。

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

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

  • user-service-refOAuth2UserService 的引用。

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

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

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

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

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

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

<oauth2-client>

配置 OAuth 2.0 Client 支持。

<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 对授权 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 客户端标识符。

  • client-secret 客户端 secret。

  • client-authentication-method 用于与提供者进行客户端认证的方法。支持的值包括 client_secret_basic, client_secret_post, private_key_jwt, client_secret_jwtnone (公共客户端)

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

  • redirect-uri 客户端注册的重定向 URI,授权服务器在最终用户认证并授权访问客户端后,将最终用户的用户代理重定向到此处。

  • scope 客户端在授权请求流程中请求的 scope,例如 openid, email 或 profile。

  • client-name 用于客户端的描述性名称。该名称可能在某些场景中使用,例如在自动生成的登录页面中显示客户端名称时。

  • provider-id 对关联提供者的引用。可以引用 <provider> 元素或使用常见的提供者之一(google, github, facebook, okta)。

<provider>

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

<provider> 的父元素

<provider> 属性

  • provider-id 唯一标识提供者的 ID。

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

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

  • user-info-uri 用于访问已认证最终用户的声明/属性的用户信息端点 URI。

  • user-info-authentication-method 向用户信息端点发送访问令牌时使用的认证方法。支持的值包括 header, formquery

  • user-info-user-name-attribute 用户信息响应中返回的属性名称,该属性引用最终用户的名称或标识符。

  • issuer-uri 用于使用 OpenID Connect Provider 的 配置端点 或授权服务器的 元数据端点 进行发现来初始配置 ClientRegistration 的 URI。

<oauth2-resource-server>

向配置中添加 BearerTokenAuthenticationFilter, BearerTokenAuthenticationEntryPointBearerTokenAccessDeniedHandler。此外,必须指定 <jwt><opaque-token> 之一。

<oauth2-resource-server> 的父元素

<oauth2-resource-server> 的子元素

<oauth2-resource-server> 属性

  • authentication-manager-resolver-ref 对将在请求时解析 AuthenticationManagerAuthenticationManagerResolver 的引用。

  • bearer-token-resolver-ref 对将从请求中检索 bearer token 的 BearerTokenResolver 的引用。

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

<jwt>

表示将授权 JWT 的 OAuth 2.0 资源服务器。

<jwt> 的父元素

<jwt> 属性

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

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

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

<opaque-token>

表示将授权不透明令牌 (opaque tokens) 的 OAuth 2.0 资源服务器。

<opaque-token> 的父元素

<opaque-token> 属性

  • introspector-refOpaqueTokenIntrospector 的引用。这是一个较大的组件,它会覆盖 introspection-uri, client-idclient-secret

  • introspection-uri 用于内省不透明令牌详细信息的内省 URI。应与 client-idclient-secret 一起提供。

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

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

  • authentication-converter-refOpaqueTokenAuthenticationConverter 的引用。负责将成功的内省结果转换为 Authentication 实例。

<relying-party-registrations>

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

<relying-party-registrations> 属性

  • id 唯一标识 RelyingPartyRegistrationRepository 的 ID。

<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 绑定。等同于依赖方 <SPSSODescriptor><AssertionConsumerService Binding="…​"/> 中的值。支持的值为 POSTREDIRECT

  • single-logout-service-location SingleLogoutService 位置。等同于依赖方 <SPSSODescriptor> 中 <SingleLogoutService Location="…​"/> 中的值。

  • single-logout-service-response-location SingleLogoutService 响应位置。等同于依赖方 <SPSSODescriptor> 中 <SingleLogoutService ResponseLocation="…​"/> 中的值。

  • single-logout-service-binding SingleLogoutService 绑定。等同于依赖方 <SPSSODescriptor> 中 <SingleLogoutService Binding="…​"/> 中的值。支持的值为 POSTREDIRECT

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

<relying-party-registration> 的子元素

<decryption-credential>

与依赖方关联的解密凭据。

<decryption-credential> 的父元素

<decryption-credential> 属性

  • certificate-location 获取证书的位置。

  • private-key-location 获取依赖方私钥的位置。

<signing-credential>

与依赖方关联的签名凭据。

<verification-credential> 的父元素

<verification-credential> 属性

  • certificate-location 获取此证书的位置。

  • 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 绑定。支持的值为 POSTREDIRECT

  • signing-algorithms 此断言方的 org.opensaml.saml.ext.saml2alg.SigningMethod 算法列表,按优先级排序。

  • single-logout-service-location SingleLogoutService 位置。等同于断言方 <IDPSSODescriptor> 中 <SingleLogoutService Location="…​"/> 中的值。

  • single-logout-service-response-location SingleLogoutService 响应位置。等同于断言方 <IDPSSODescriptor> 中 <SingleLogoutService ResponseLocation="…​"/> 中的值。

  • single-logout-service-binding SingleLogoutService 绑定。等同于断言方 <IDPSSODescriptor> 中 <SingleLogoutService Binding="…​"/> 中的值。支持的值为 POSTREDIRECT

<asserting-party> 的子元素

<encryption-credential>

与断言方关联的加密凭据。

<encryption-credential> 的父元素

<encryption-credential> 属性

  • certificate-location 获取证书的位置。

  • private-key-location 获取依赖方私钥的位置。

<verification-credential>

与断言方关联的验证凭据。

<verification-credential> 的父元素

<verification-credential> 属性

  • certificate-location 获取此证书的位置。

  • private-key-location 获取依赖方私钥的位置。

<http-basic>

向配置中添加 BasicAuthenticationFilterBasicAuthenticationEntryPoint。后者仅在未启用基于表单的登录时用作配置入口点。

<http-basic> 的父元素

<http-basic> 属性

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

  • entry-point-ref 设置 BasicAuthenticationFilter 使用的 AuthenticationEntryPoint

<http-firewall> 元素

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

<http-firewall> 属性

  • ref 定义对实现 HttpFirewall 接口的 Spring bean 的引用。

<intercept-url>

此元素用于定义应用程序感兴趣的 URL 模式集,并配置它们的处理方式。它用于构建 `FilterSecurityInterceptor` 所使用的 `FilterInvocationSecurityMetadataSource`。例如,如果特定的 URL 需要通过 HTTPS 访问,它还负责配置一个 `ChannelProcessingFilter`。当根据指定的模式匹配传入请求时,匹配会按照元素声明的顺序进行。因此,最具体的模式应该放在前面,最通用的模式应该放在后面。

<intercept-url> 的父元素

<intercept-url> 属性

  • access 列出将存储在 `FilterInvocationSecurityMetadataSource` 中用于定义的 URL 模式/方法组合的访问属性。这应该是安全配置属性(例如角色名称)的逗号分隔列表。

  • method 将与模式和 servlet 路径(可选)结合使用以匹配传入请求的 HTTP 方法。如果省略,将匹配任何方法。如果指定了相同模式但分别带有和不带有方法,则带有方法的匹配项将优先。

  • pattern 定义 URL 路径的模式。其内容取决于包含此元素的 http 元素的 `request-matcher` 属性,因此如果 classpath 中存在 Spring MVC,则默认为 MVC 匹配器。

  • request-matcher-ref 对 `RequestMatcher` 的引用,用于确定是否使用此 `<intercept-url>`。

  • requires-channel 可以是 "http" 或 "https",取决于特定 URL 模式是应通过 HTTP 还是 HTTPS 访问。或者,当没有偏好时,可以使用值 "any"。如果此属性存在于任何 `<intercept-url>` 元素上,则会将一个 `ChannelProcessingFilter` 添加到过滤器堆栈中,并将其额外的依赖项添加到应用程序上下文中。

如果添加了 `<port-mappings>` 配置,`SecureChannelProcessor` 和 `InsecureChannelProcessor` bean 将使用此配置来确定用于重定向到 HTTP/HTTPS 的端口。

此属性对 filter-security-metadata-source 无效
  • servlet-path 将与模式和 HTTP 方法结合使用以匹配传入请求的 servlet 路径。此属性仅当 request-matcher 为 'mvc' 时适用。此外,仅在以下两种用例中需要该值:1) 在 `ServletContext` 中注册了 2 个或更多 `HttpServlet`,它们的映射以 '/' 开头且不同;2) 模式以注册的 `HttpServlet` 路径的相同值开头,但不包括默认(根)`HttpServlet` '/'

此属性对 filter-security-metadata-source 无效

<jee>

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

<jee> 的父元素

<jee> 属性

  • mappable-roles 一个逗号分隔的角色列表,用于在传入的 HttpServletRequest 中查找。

  • user-service-ref 对用户服务(或 UserDetailsService bean)ID 的引用

<logout>

向过滤器堆栈添加一个 `LogoutFilter`。此过滤器配置有 `SecurityContextLogoutHandler`。

<logout> 的父元素

<logout> 属性

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

  • invalidate-session 映射到 `SecurityContextLogoutHandler` 的 `invalidateHttpSession` 属性。默认为 "true",因此会话将在注销时失效。

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

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

  • logout-url 将导致注销的 URL(即由过滤器处理的 URL)。默认为 "/logout"。

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

<saml2-login>

The SAML 2.0 登录 功能配置使用 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-refAuthenticationSuccessHandler 的引用。

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

  • authentication-manager-ref 对 `AuthenticationManager` 的引用。

<saml2-logout>

The SAML 2.0 单点注销 功能配置支持 RP 和 AP 发起的 SAML 2.0 单点注销。

<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> 属性

  • 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` 添加到堆栈。根据属性设置,此过滤器将配置 `TokenBasedRememberMeServices`、`PersistentTokenBasedRememberMeServices` 或用户指定的实现 `RememberMeServices` 接口的 bean。

<remember-me> 的父元素

<remember-me> 属性

  • authentication-success-handler-ref 如果需要自定义导航,则在 `RememberMeAuthenticationFilter` 上设置 `authenticationSuccessHandler` 属性。该值应该是应用程序上下文中 `AuthenticationSuccessHandler` bean 的名称。

  • data-source-ref 对 `DataSource` bean 的引用。如果设置此属性,将使用 `PersistentTokenBasedRememberMeServices` 并配置 `JdbcTokenRepositoryImpl` 实例。

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

  • key 映射到 `AbstractRememberMeServices` 的 "key" 属性。应设置为唯一值,以确保记住我 cookie 仅在同一个应用程序内有效 [3]。如果未设置此值,将生成一个安全的随机值。由于生成安全的随机值可能需要一些时间,因此显式设置此值有助于在使用记住我功能时提高启动时间。

  • services-alias 将内部定义的 `RememberMeServices` 导出为 bean 别名,以便应用程序上下文中的其他 bean 可以使用它。

  • services-ref 允许完全控制过滤器将使用的 `RememberMeServices` 实现。该值应该是应用程序上下文中实现此接口的 bean 的 `id`。如果正在使用注销过滤器,该 bean 也应实现 `LogoutHandler` 接口。

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

  • token-validity-seconds 映射到 `AbstractRememberMeServices` 的 `tokenValiditySeconds` 属性。指定记住我 cookie 有效的秒数。默认情况下,有效期为 14 天。

  • user-service-ref 记住我服务实现需要访问 `UserDetailsService`,因此必须在应用程序上下文中定义一个。如果只有一个,命名空间配置将自动选择并使用它。如果存在多个实例,可以使用此属性显式指定 bean 的 `id`。

<request-cache> 元素

设置 `RequestCache` 实例,`ExceptionTranslationFilter` 将在调用 `AuthenticationEntryPoint` 之前使用此实例存储请求信息。

<request-cache> 的父元素

<request-cache> 属性

  • ref 定义对实现 `RequestCache` 接口的 Spring bean 的引用。

<session-management>

通过向过滤器堆栈添加 `SessionManagementFilter` 来实现与会话管理相关的功能。

<session-management> 的父元素

<session-management> 属性

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

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

  • invalid-session-url 允许注入 `SessionManagementFilter` 使用的 InvalidSessionStrategy 实例。请使用此属性或 `invalid-session-url` 属性,但不要同时使用两者。

  • session-authentication-error-url 定义当 SessionAuthenticationStrategy 抛出异常时应显示的错误页面的 URL。如果未设置,则向客户端返回未经授权 (401) 的错误代码。请注意,如果在基于表单的登录期间发生错误,此属性不适用,此时认证失败 URL 将优先。

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

  • session-fixation-protection 指示用户认证时如何应用会话固定攻击防护。如果设置为 "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>

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

<concurrency-control> 的父元素

<concurrency-control> 属性

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

  • expired-url 用户因超出允许会话数并在其他地方再次登录而尝试使用被并发会话控制器“过期”的会话时,将被重定向到的 URL。除非设置了 exception-if-maximum-exceeded,否则应设置此属性。如果未提供值,过期消息将直接写入响应。

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

  • max-sessions 映射到 `ConcurrentSessionControlAuthenticationStrategy` 的 `maximumSessions` 属性。指定值 -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 在配置了多个实例的情况下,允许为 X.509 指定特定的 `UserDetailsService`。如果未设置,将尝试自动查找合适的实例并使用它。

<filter-chain-map>

用于使用 FilterChainMap 显式配置 FilterChainProxy 实例。

<filter-chain-map> 属性

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

<filter-chain-map> 的子元素

<filter-chain>

用于在内部定义特定的 URL 模式以及适用于匹配该模式的 URL 的过滤器列表。当多个 filter-chain 元素按顺序组装成列表以配置 FilterChainProxy 时,最具体的模式必须放在列表顶部,最通用的模式放在底部。

<filter-chain> 的父元素

<filter-chain> 属性

  • filters 一个逗号分隔的引用列表,指向实现 `Filter` 接口的 Spring bean。值 "none" 表示此 `FilterChain` 不应使用任何 `Filter`。

  • request-matcher-ref 对 `RequestMatcher` 的引用,用于确定是否应调用 `filters` 属性中的任何 `Filter`。

<filter-security-metadata-source>

用于显式配置 FilterSecurityMetadataSource bean,以便与 FilterSecurityInterceptor 一起使用。通常仅在您显式配置 FilterChainProxy 而非使用 <http> 元素时需要。所使用的 intercept-url 元素应仅包含 pattern、method 和 access 属性。任何其他属性将导致配置错误。

<filter-security-metadata-source> 属性

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

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

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

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


1. 请参阅 xref:servlet/configuration/xml-namespace.adoc#ns-web-xml[介绍性章节
2. 此功能仅为方便起见而提供,不适用于生产环境(生产环境中会选择视图技术来渲染自定义登录页面)。`DefaultLoginPageGeneratingFilter` 类负责渲染登录页面,并在需要时提供普通表单登录和/或 OIDC 的登录表单。
3. 这不影响 `PersistentTokenBasedRememberMeServices` 的使用,因为令牌存储在服务器端。