# Web 应用程序安全性

# <debug>

启用 Spring 安全调试基础设施。这将提供人类可读的(多行)调试信息,以监视进入安全过滤器的请求。这可能包括敏感信息,例如请求参数或标题,并且应该仅在开发环境中使用。

# <http>

如果在应用程序中使用<http>元素,则会创建一个名为“SpringSecurityFilterChain”的FilterChainProxy Bean,并且该元素中的配置将用于在FilterChainProxy中构建过滤器链。从 Spring Security3.1 开始,额外的http元素可以用来添加额外的过滤链[1]用于如何从你的web.xml设置映射。一些核心过滤器总是在过滤器链中创建的,而另一些将根据存在的属性和子元素添加到堆栈中。标准过滤器的位置是固定的(参见名称空间介绍中的过滤器订单表),当用户必须在FilterChainProxy Bean 中显式地配置过滤器链时,消除了以前版本框架的常见错误来源。当然,如果你需要完全控制配置,你仍然可以这样做。

所有需要引用[AuthenticationManager](../../authentication/architecture.html# Servlet-authentication-authenticationManager)的过滤器都将自动注入由名称空间配置创建的内部实例。

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

# <http>属性

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

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

  • 认证-管理器-refAuthenticationManager的引用,用于此 HTTP 元素创建的FilterChain

  • 自动配置自动注册一个登录表单、基本身份验证、注销服务。如果设置为“true”,则会添加所有这些功能(尽管你仍然可以通过提供相应的元素来定制每个功能的配置)。如果未指定,默认为“false”。不建议使用此属性。使用显式配置元素来避免混淆。

  • create-session控制着由 Spring 安全类创建 HTTP会话的渴望。选项包括:

    • always- Spring 安全性将主动创建一个会话如果一个不存在。

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

    • never- Spring 安全性永远不会创建会话,但是如果应用程序创建了,则会使用一个。

    • stateless- Spring 安全性不会创建会话并忽略用于获得 Spring Authentication的会话。

  • 禁用 URL 重写防止将会话ID 追加到应用程序中的 URL。如果此属性设置为true,则客户端必须使用 cookie。默认值为true

  • 入口点-参考通常使用的AuthenticationEntryPoint将根据已配置的身份验证机制进行设置。此属性允许通过定义一个定制的AuthenticationEntryPoint Bean 来重写此行为,该定义将启动身份验证过程。

  • JAAS-API-供应如果可用,则以从JaasAuthenticationToken获取的Subject的形式运行请求,该请求通过向堆栈添加JaasApiIntegrationFilter Bean 来实现。默认值为false

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

  • 每次请求一次对应于observeOncePerRequestFilterSecurityInterceptor属性。默认值为true

  • 模式http元素定义一个模式,控制将通过它定义的过滤器列表过滤的请求。解释依赖于配置的请求匹配程序。如果没有定义模式,那么将匹配所有请求,因此应该首先声明最特定的模式。

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

  • 请求匹配程序定义了RequestMatcher策略中使用的FilterChainProxy和由intercept-url创建的 bean,以匹配传入的请求。对于 Spring MVC、 Ant、正则表达式和不区分大小写的正则表达式,当前的选项分别是mvcantregexciRegex。使用patternmethodservlet-path属性为每个截取-URL元素创建一个单独的实例。 Ant 路径是使用AntPathRequestMatcher进行匹配的,正则表达式是使用RegexRequestMatcher进行匹配的,并且对于 Spring MVC 路径是使用MvcRequestMatcher进行匹配的。有关这些类的更多详细信息,请参见 Javadoc。 Ant 路径是默认策略。

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

  • 安全通过将此属性设置为none,可以将一个请求模式映射到一个空的过滤器链。将不会应用任何安全性,并且 Spring 安全性的任何功能都将不可用。

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

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

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

# <http>的子元素

# <access-denied-handler>

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

# <access-denied-handler>的父元素

# <access-denied-handler>属性

  • 错误页面被拒绝访问的页面,如果经过身份验证的用户请求一个他们没有权限访问的页面,该页面将被重定向到该页面。

  • 参考定义了对AccessDeniedHandler类型的 Spring Bean 的引用。

# <cors>

这个元素允许配置CorsFilter。如果指定了 noCorsFilterCorsConfigurationSource,并且 Spring MVC 在 Classpath 上,则使用HandlerMappingIntrospector作为CorsConfigurationSource

# <cors>属性

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

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

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

# <cors>的父元素

# <headers>

该元素允许配置附加的(安全性)头,以便与响应一起发送。它支持几个头的简单配置,还允许通过header元素设置自定义头。其他信息,可以在安全标头部分的引用中找到。

  • Cache-ControlPragma,和Expires-可以使用高速缓存控制元素进行设置。这确保了浏览器不会缓存你的安全页面。

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

  • X-Frame-Options-可以使用框架-选项元素进行设置。X-帧-选项 (opens new window)标头可用于防止单击劫持攻击。

  • X-XSS-Protection-可以使用XSS-保护元素进行设置。浏览器可以使用X-XSS-保护 (opens new window)头来执行基本控制。

  • X-Content-Type-Options-可以使用内容类型选项元素进行设置。X-Content-Type-Options (opens new window)头可以防止 Internet Explorer 从声明的 Content-Type MIME 嗅探响应。这也适用于谷歌 Chrome,当下载扩展时。

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

  • Content-Security-PolicyContent-Security-Policy-Report-Only-可以使用内容安全策略元素进行设置。内容安全策略 (opens new window)是一种机制,Web 应用程序可以利用该机制来减轻内容注入漏洞,例如跨站点脚本。

  • Referrer-Policy-可以使用推荐人-政策元素进行设置,推荐人-政策 (opens new window)是一种机制,Web 应用程序可以利用该机制来管理 Referrer 字段,该字段包含用户所在的最后一个页面。

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

# <headers>属性

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

  • 默认值-禁用可选属性,该属性指定禁用默认的 Spring Security 的 HTTP 响应头。默认值为 false(包括默认的标头)。

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

# <headers>的父元素

# <headers>的子元素

# <cache-control>

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

# <cache-control>属性

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

# <cache-control>的父元素

# <hsts>

启用时,将严格的运输安全 (opens new window)头添加到响应中,用于处理任何安全请求。这允许服务器指示浏览器在将来的请求中自动使用 HTTPS。

# <hsts>属性

  • 已禁用指定是否应禁用 strict-transport-security。默认为 false。

  • 包含-子域指定是否应包含子域。默认为 true。

  • 最大年龄秒指定主机应被视为已知 HSTS 主机的最大时间。违约一年。

  • request-matcher-ref用于确定是否应设置标头的 requestmatcher 实例。默认情况是,如果 HttpServletRequest.isSecure()为真。

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

# <hsts>的父元素

# <hpkp>

启用时,将HTTP 的公钥固定扩展 (opens new window)头添加到响应中,用于处理任何安全请求。这使得 HTTPS 网站能够抵抗攻击者使用错误发行或其他欺诈性证书的假冒行为。

# <hpkp>属性

  • 已禁用指定是否应禁用 HTTP 公钥锁定。默认为 true。

  • 包含-子域指定是否应包含子域。默认为 false。

  • 最大年龄秒设置 public-key-pins 头的 max-age 指令的值。默认 60 天。

  • 仅报告指定浏览器是否只应报告 PIN 验证失败。默认为 true。

  • 报告-URI指定浏览器应向其报告 PIN 验证失败的 URI。

# <hpkp>的父元素

# <pins>

别针列表

# <pins>的子元素

# <pin>

指定 PIN 时,使用 Base64 编码的 SPKI 指纹作为值,使用加密哈希算法作为属性

# <pin>属性

  • 算法加密散列算法。默认值是 SHA256。

# <pin>的父元素

# <content-security-policy>

启用时,将内容安全策略 (opens new window)头添加到响应中。CSP 是一种机制,Web 应用程序可以利用它来减轻内容注入漏洞,例如跨站点脚本。

# <content-security-policy>属性

  • 政策指令用于 content-security-policy 头的安全策略指令,或者如果将 report-only 设置为 true,则使用 content-security-policy-report-only 头。

  • 仅报告设置为 true,以启用 content-security-policy-report-only 头,仅用于报告违反策略的情况。默认为 false。

# <content-security-policy>的父元素

# <referrer-policy>

启用时,将推荐人政策 (opens new window)头添加到响应中。

# <referrer-policy>属性

  • 政策referrer-policy 头的策略。默认的“无推荐人”。

# <referrer-policy>的父元素

# <feature-policy>

启用时,将特征策略 (opens new window)头添加到响应中。

# <feature-policy>属性

  • 政策指令用于 Feature-Policy 头的安全策略指令。

# <feature-policy>的父元素

# <frame-options>

启用后,将X-frame-options 标头 (opens new window)添加到响应中,这允许较新的浏览器进行一些安全检查并防止点击劫持 (opens new window)攻击。

# <frame-options>属性

  • 已禁用如果禁用,将不包括 X-frame-options 标头。默认为 false。

  • 政策

    • DENY该页面不能显示在一个框架中,无论站点试图这样做。这是在指定框架-选项-策略时的默认值。

    • SAMEORIGIN页面只能在与页面本身位于同一原点的框架中显示

    换句话说,如果你指定了 deny,那么在从其他站点加载时,在帧中加载页面的尝试不仅会失败,而且在从同一站点加载时也会失败。另一方面,如果你指定了 SameOrigin,则仍然可以在一个框架中使用该页面,只要在一个框架中包含该页面的站点与为该页面提供服务的站点相同。

# <frame-options>的父元素

# <permissions-policy>

权限-策略标头 (opens new window)添加到响应中。

# <permissions-policy>属性

  • 政策要为Permissions-Policy头写的策略值

# <permissions-policy>的父元素

# <xss-protection>

X-XSS-保护报头 (opens new window)添加到响应中,以帮助防止reflected/type-1 跨站点脚本 (opens new window)攻击。这绝对是对 XSS 攻击的全面保护!

# <xss-protection>属性

  • XSS-保护-禁用不包括reflected/type-1 跨站点脚本 (opens new window)保护的标题。

  • 支持 XSS 保护显式启用或禁用reflected/type-1 跨站点脚本 (opens new window)保护。

  • xss-保护模块当 true 和 xss-protection-enabled 为 true 时,将 mode=block 添加到 header 中。这向浏览器表明,该页面根本不应该加载。当 false 和启用 XSS-Protection-enabled 为 true 时,当检测到反射攻击时,仍将呈现该页面,但将修改响应以防止攻击。请注意,有时有一些绕过此模式的方法,这通常会使阻塞页面变得更理想。

# <xss-protection>的父元素

# <content-type-options>

向响应添加带有 nosniff 值的 x-content-type-options 头。这禁用 MIME 嗅探功能 (opens new window)用于 IE8+ 和 Chrome 扩展。

# <content-type-options>属性

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

# <content-type-options>的父元素

在响应中添加额外的头,需要同时指定名称和值。

# <header-attributes>属性

  • 标头-Name标题的name

  • 价值要添加的标头的value

  • 参考引用了HeaderWriter接口的自定义实现。

# <header>的父元素

# <anonymous>

AnonymousAuthenticationFilter添加到堆栈,并将AnonymousAuthenticationProvider添加到堆栈。如果你正在使用IS_AUTHENTICATED_ANONYMOUSLY属性,则需要这样做。

# <anonymous>的父元素

# <anonymous>属性

  • 已启用通过默认的名称空间设置,匿名“身份验证”功能将自动启用。你可以使用此属性禁用它。

  • 授予-授权应分配给匿名请求的授予权限。这通常用于分配匿名请求的特定角色,随后可以在授权决策中使用该角色。如果未设置,则默认为ROLE_ANONYMOUS

  • 钥匙提供程序和过滤器之间共享的密钥。这通常不需要设置。如果未设置,它将默认为一个安全的随机生成值。这意味着在使用匿名功能时,设置该值可以提高启动时间,因为安全的随机值可能需要一段时间才能生成。

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

# <csrf>

这个元素将向应用程序添加跨站点请求伪造者 (opens new window)保护。它还更新了默认的 RequestCache,以便在身份验证成功时只重放“get”请求。其他信息可以在参考文献的跨站点请求伪造部分中找到。

# <csrf>的父元素

# <csrf>属性

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

  • Token-Repository-ref要使用的 csRFTokenRepository。默认值为HttpSessionCsrfTokenRepository

  • request-matcher-ref用于确定是否应用 CSRF 的请求匹配实例。默认是除了“get”、“trace”、“head”、“options”之外的任何 HTTP 方法。

# <custom-filter>

这个元素用于向过滤链添加过滤器。它不会创建任何额外的 bean,而是用于选择javax.servlet.Filter类型的 Bean,该类型已在应用程序上下文中定义,并在由 Spring Security 维护的筛选链中的特定位置添加该类型。详细信息可以在名称空间章节中找到。

# <custom-filter>的父元素

# <custom-filter>属性

  • 之后紧随其后的过滤器,该自定义过滤器应放置在链中。该功能将仅由希望将自己的过滤器混合到安全过滤器链中并对标准 Spring 安全过滤器有一定了解的高级用户所需要。过滤器名称映射到特定的 Spring 安全实现过滤器。

  • 在此之前将自定义过滤器置于链中之前的过滤器

  • 职务将自定义过滤器放置在链中的明确位置。如果你正在更换标准过滤器,请使用。

  • 参考定义了对实现Filter的 Spring Bean 的引用。

# <expression-handler>

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

# <expression-handler>的父元素

# <expression-handler>属性

  • 参考定义了对实现SecurityExpressionHandler的 Spring Bean 的引用。

# <form-login>

用于将UsernamePasswordAuthenticationFilter添加到筛选器堆栈,并将LoginUrlAuthenticationEntryPoint添加到应用程序上下文,以按需提供身份验证。这将始终优先于其他名称空间创建的入口点。如果不提供属性,将在 URL“/login”[2]自动生成登录页面。可以使用[<form-login>属性](#NSA-form-login-attributes)定制行为。

# <form-login>的父元素

# <form-login>属性

  • 总是-使用-默认-目标如果设置为true,则用户将始终从默认值-目标-URL给出的值开始,无论他们是如何到达登录页面的。映射到UsernamePasswordAuthenticationFilteralwaysUseDefaultTargetUrl属性。默认值为false

  • 身份验证-详细信息-源代码-引用引用将由身份验证过滤器使用的AuthenticationDetailsSource

  • 身份验证-失败-处理程序-ref可以用作身份验证-失败-URL的替代方案,在身份验证失败后,你可以完全控制导航流。该值应该是应用程序上下文中AuthenticationFailureHandler Bean 的名称。

  • 身份验证-失败-URL映射到authenticationFailureUrlauthenticationFailureUrl属性。定义登录失败时浏览器将重定向到的 URL。默认为/login?error,这将由自动登录页面生成器自动处理,用错误消息重新呈现登录页面。

  • 认证-成功-处理程序-引用这可以作为默认值-目标-URL总是-使用-默认-目标的替代方案,使你在成功的身份验证之后可以完全控制导航流。该值应该是应用程序上下文中AuthenticationSuccessHandler Bean 的名称。默认情况下,使用SavedRequestAwareAuthenticationSuccessHandler的实现并注入默认值-目标-URL

  • 默认值-目标-URL映射到defaultTargetUrlUsernamePasswordAuthenticationFilter属性。如果未设置,默认值为“/”(应用程序根)。如果用户在试图访问安全资源时没有被要求登录,那么在登录后将被带到此 URL,这时他们将被带到最初请求的 URL。

  • 登录页面应该用来呈现登录页面的 URL。映射到LoginUrlAuthenticationEntryPointloginFormUrl属性。默认为“/login”。

  • 登录-处理-URL映射到filterProcessesUrlUsernamePasswordAuthenticationFilter属性。默认值为“/login”。

  • 密码参数包含密码的请求参数的名称。默认为“密码”。

  • 用户名参数包含用户名的请求参数的名称。默认为“用户名”。

  • 认证-成功-转发-URLForwardAuthenticationSuccessHandler映射到authenticationSuccessHandlerUsernamePasswordAuthenticationFilter属性。

  • 认证-失败-转发-URLForwardAuthenticationFailureHandler映射到authenticationFailureHandler的属性UsernamePasswordAuthenticationFilter

# <oauth2-login>

OAuth2.0 登录特性使用 OAuth2.0 和/或 OpenID Connect1.0 提供程序配置身份验证支持。

# <oauth2-login>的父元素

# <oauth2-login>属性

  • 客户端-注册-存储库-ref引用ClientRegistrationRepository

  • 授权-客户端-存储库-ref引用OAuth2AuthorizedClientRepository

  • 授权-客户-服务-参考引用OAuth2AuthorizedClientService

  • 授权-请求-存储库-引用引用AuthorizationRequestRepository

  • 授权-请求-解析器-ref引用OAuth2AuthorizationRequestResolver

  • access-token-response-client-ref引用OAuth2AccessTokenResponseClient

  • user-authorities-mapper-ref引用GrantedAuthoritiesMapper

  • user-service-ref引用OAuth2UserService

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

  • 登录-处理-URL过滤器处理身份验证请求的 URI。

  • 登录页面发送用户登录的 URI。

  • 认证-成功-处理程序-引用引用AuthenticationSuccessHandler

  • 身份验证-失败-处理程序-ref引用AuthenticationFailureHandler

  • JWT-解码器-工厂-参考引用JwtDecoderFactory使用的OidcAuthorizationCodeAuthenticationProvider

# <oauth2-client>

配置OAuth2.0 客户端支持。

# <oauth2-client>的父元素

# <oauth2-client>属性

  • 客户端-注册-存储库-ref引用ClientRegistrationRepository

  • 授权-客户端-存储库-ref引用OAuth2AuthorizedClientRepository

  • 授权-客户-服务-参考引用OAuth2AuthorizedClientService

# <oauth2-client>的子元素

# <authorization-code-grant>

配置OAuth2.0 授权代码授予

# <authorization-code-grant>的父元素

# <authorization-code-grant>属性

  • 授权-请求-存储库-引用引用AuthorizationRequestRepository

  • 授权-请求-解析器-ref引用OAuth2AuthorizationRequestResolver

  • access-token-response-client-ref引用OAuth2AccessTokenResponseClient

# <client-registrations>

为客户机注册的容器元素(客户登记),使用 OAuth2.0 或 OpenID Connect1.0 提供程序。

# <client-registrations>的子元素

# <client-registration>

表示在 OAuth2.0 或 OpenID Connect1.0 提供程序中注册的客户端。

# <client-registration>的父元素

# <client-registration>属性

  • 注册-ID唯一标识ClientRegistration的 ID。

  • 客户端-ID客户端标识符。

  • 客户端-机密客户端秘密。

  • 客户机-身份验证-方法用于通过提供程序对客户端进行身份验证的方法。支持的值是客户端 _Secret_BASIC客户端 _Secret_postPrivate_Key_JWT客户端 _Secret_JWT(公众客户) (opens new window)

  • 授权-授予类型OAuth2.0 授权框架定义了四种授权授予 (opens new window)类型。支持的值是authorization_codeclient_credentialspassword,以及扩展授权类型urn:ietf:params:oauth:grant-type:jwt-bearer

  • 重定向 URI客户端注册的重定向 URI,在最终用户对客户端进行了身份验证和授权访问之后,授权服务器将最终用户的用户代理重定向到该 URI。

  • 范围客户端在授权请求流期间请求的范围,例如 OpenID、电子邮件或配置文件。

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

  • 提供者 ID对关联提供者的引用。可以引用<provider>元素或使用常见的提供者之一(Google,GitHub,Facebook,OKTA)。

# <provider>

OAuth2.0 或 OpenID Connect1.0 提供程序的配置信息。

# <provider>的父元素

# <provider>属性

  • 提供者 ID唯一标识提供者的 ID。

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

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

  • User-info-uri用于访问经过身份验证的最终用户的声明/属性的 userinfo 端点 URI。

  • 用户信息认证方法向 UserInfo 端点发送访问令牌时使用的身份验证方法。支持的值是页眉形式查询

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

  • JWK-SET-URI用于从授权服务器检索JSON Web Key (opens new window)集的 URI,其中包含用于验证 ID 令牌的JSON Web 签名 (opens new window)的加密密钥,以及可选的 userinfo 响应。

  • 发行者-URI最初使用发现 OpenID Connect 提供者的配置端点 (opens new window)或授权服务器的元数据端点 (opens new window)来配置ClientRegistration的 URI。

# <oauth2-resource-server>

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

# <oauth2-resource-server>的父元素

# <oauth2-resource-server>的子元素

# <oauth2-resource-server>属性

  • 身份验证-管理器-解析器-ref引用AuthenticationManagerResolver,它将在请求时解析AuthenticationManager

  • 承载-令牌-解析器-ref引用一个BearerTokenResolver,它将从请求中检索不记名令牌

  • 入口点-参考引用将处理未授权请求的AuthenticationEntryPoint

# <jwt>

表示将授权 JWTS 的 OAuth2.0 资源服务器

# <jwt>的父元素

# <jwt>属性

  • jwt-认证-转换器-ref引用Converter<Jwt, AbstractAuthenticationToken>

  • JWT-decoder-ref引用JwtDecoder。这是一个覆盖jwk-set-uri的较大组件

  • JWK-SET-URI用于从 OAuth2.0 授权服务器加载签名验证密钥的 JWK 设置 URI

# <opaque-token>

表示将授权不透明令牌的 OAuth2.0 资源服务器

# <opaque-token>的父元素

# <opaque-token>属性

  • 内省-Ref引用OpaqueTokenIntrospector。这是一个覆盖introspection-uriclient-idclient-secret的较大组件。

  • 内省-URI用于内省不透明令牌细节的内省 URI。应附上client-idclient-secret

  • 客户端-ID针对所提供的introspection-uri用于客户端身份验证的客户端 ID。

  • 客户端-机密针对所提供的introspection-uri用于客户端身份验证的客户端秘密。

# <http-basic>

BasicAuthenticationFilterBasicAuthenticationEntryPoint添加到配置中。只有在未启用基于表单的登录时,才将后者用作配置入口点。

# <http-basic>的父元素

# <http-basic>属性

  • 身份验证-详细信息-源代码-引用引用将由身份验证过滤器使用的AuthenticationDetailsSource

  • 入口点-参考设置AuthenticationEntryPoint所使用的BasicAuthenticationFilter

# <http-firewall>元素

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

# <http-firewall>属性

  • 参考定义了对实现HttpFirewall的 Spring Bean 的引用。

# <intercept-url>

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

# <intercept-url>的父元素

# <intercept-url>属性

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

  • 方法将与模式和 Servlet 路径(可选)结合使用的 HTTP 方法,以匹配传入请求。如果省略,任何方法都将匹配。如果在使用和不使用方法的情况下指定了相同的模式,则方法特定的匹配将优先。

  • 模式定义 URL 路径的模式。内容将依赖于包含 HTTP 元素的request-matcher属性,因此将默认为 Ant 路径语法。

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

  • 需要-通道可以是“HTTP”或“HTTPS”,这取决于是否应该分别通过 HTTP 或 HTTPS 访问特定的 URL 模式。或者,当没有偏好时,可以使用值“any”。如果这个属性存在于任何<intercept-url>元素上,那么ChannelProcessingFilter将被添加到筛选器堆栈中,并将其附加的依赖项添加到应用程序上下文中。

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

此属性对过滤器-安全性-元数据-源无效
  • servlet-path将与模式和 HTTP 方法结合使用的 Servlet 路径,以匹配传入请求。此属性仅在请求匹配程序为“mvc”时才适用。另外,该值仅在以下 2 个用例中需要:1)在ServletContext中注册的HttpServlet中有 2 个或更多的HttpServlet具有以'/'开头的映射,并且它们是不同的;2)模式以注册的HttpServlet路径的相同值开始,排除默认(根)HttpServlet``'/'
此属性对过滤器-安全性-元数据-源无效

# <jee>

将 J2eepreAuthenticatedProcessingFilter 添加到筛选链中,以提供与容器身份验证的集成。

# <jee>的父元素

# <jee>属性

  • 可映射角色在传入的 HttpServletRequest 中要查找的逗号分隔的角色列表。

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

# <logout>

LogoutFilter添加到筛选器堆栈。这被配置为SecurityContextLogoutHandler

# <logout>的父元素

# <logout>属性

  • 删除-cookies用户注销时应删除的 cookie 名称的逗号分隔列表。

  • invalidate-session映射到invalidateHttpSessionSecurityContextLogoutHandler。默认值为“true”,因此会话将在注销时无效。

  • 注销-成功-URL用户退出后将被带到的目标 URL。默认为 <form-login-login-page>/?注销(即/登录?注销)

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

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

  • Success-Handler-Ref可用于提供LogoutSuccessHandler的实例,该实例将在注销后被调用以控制导航。

# <openid-login>

类似于<form-login>并具有相同的属性。login-processing-url的默认值是“/login/openid”。将注册OpenIDAuthenticationFilterOpenIDAuthenticationProvider。后者需要引用UserDetailsService。同样,这可以由id指定,使用user-service-ref属性,或者将自动位于应用程序上下文中。

# <openid-login>的父元素

# <openid-login>属性

  • 总是-使用-默认-目标用户登录后是否总是应该重定向到 default-target-url。

  • 身份验证-详细信息-源代码-引用引用验证过滤器将使用的验证详细信息源

  • 身份验证-失败-处理程序-ref引用验证失败处理程序 Bean,该处理程序应用于处理失败的验证请求。不应该与身份验证-失败-URL 组合使用,因为实现应该始终处理到后续目标的导航。

  • 身份验证-失败-URL登录失败页面的 URL。如果没有指定登录失败的 URL, Spring Security 将在/login?Login_Error 自动创建一个失败的登录 URL 和一个相应的过滤器,以便在请求时呈现该登录失败的 URL。

  • 认证-成功-转发-URLForwardAuthenticationSuccessHandler映射到authenticationSuccessHandler的属性UsernamePasswordAuthenticationFilter

  • 认证-失败-转发-URLForwardAuthenticationFailureHandler映射到authenticationFailureHandler的属性UsernamePasswordAuthenticationFilter

  • 认证-成功-处理程序-引用引用一个验证成功处理了一个成功的验证请求的验证成功处理程序 Bean。不应与默认值-目标-URL(或总是-使用-默认-目标)组合使用,因为实现应该始终处理到后续目标的导航

  • 默认值-目标-URL如果用户之前的操作无法恢复,则在身份验证成功后将被重定向到的 URL。如果用户访问登录页面而没有首先请求触发身份验证的安全操作,则通常会发生这种情况。如果未指定,则默认为应用程序的根。

  • 登录页面登录页面的 URL。如果没有指定登录 URL, Spring Security 将在/Login 处自动创建一个登录 URL 和一个相应的过滤器,以便在需要时呈现该登录 URL。

  • 登录-处理-URL登录表单发布到的 URL。如果未指定,则默认为/登录。

  • 密码参数包含密码的请求参数的名称。默认为“密码”。

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

  • 用户名参数包含用户名的请求参数的名称。默认为“用户名”。

# <openid-login>的子元素

# <attribute-exchange>

attribute-exchange元素定义了应该从标识提供程序请求的属性列表。在名称空间配置章节的OpenID 支持部分中可以找到一个示例。可以使用多个属性,在这种情况下,每个属性都必须具有identifier-match属性,其中包含一个正则表达式,该正则表达式与提供的 OpenID 标识符匹配。这允许从不同的提供商(谷歌、雅虎等)获取不同的属性列表。

# <attribute-exchange>的父元素

# <attribute-exchange>属性

  • 标识符-匹配当决定在身份验证期间使用哪个属性交换配置时,将与所要求的标识进行比较的正则表达式。

# <attribute-exchange>的子元素

# <openid-attribute>

创建 OpenID AX 时使用的属性获取请求 (opens new window)

# <openid-attribute>的父元素

# <openid-attribute>属性

  • 计数指定希望返回的属性的数量。例如,返回 3 封电子邮件。默认值是 1。

  • 姓名指定你希望返回的属性的名称。例如,电子邮件。

  • 必需的指定此属性是否是 OP 所必需的,但如果 OP 不返回该属性,则不会出错。默认值为 false。

  • 类型指定属性类型。例如,https://axschema.org/contact/email (opens new window)。有关有效的属性类型,请参阅你的 OP 文档。

# <password-management>

此元素配置密码管理。

# <password-management>的父元素

# <password-management>属性

  • 更改-密码-页面更改密码页面。默认为“/change-password”。

# <port-mappings>

默认情况下,PortMapperImpl的实例将被添加到配置中,用于重定向到安全和不安全的 URL。可以选择使用此元素重写该类定义的默认映射。每个子元素<port-mapping>定义了一对 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>属性

  • 如果需要自定义导航,认证-成功-处理程序-引用将在RememberMeAuthenticationFilter上设置authenticationSuccessHandler属性。该值应该是应用程序上下文中AuthenticationSuccessHandler Bean 的名称。

  • data-source-refDataSource Bean 的引用。如果设置了这个值,将使用PersistentTokenBasedRememberMeServices并将其配置为JdbcTokenRepositoryImpl实例。

  • Remember-me-parameter切换 Remember-Me 身份验证的请求参数的名称。默认值为“Remember-me”。映射到AbstractRememberMeServices的“参数”属性。

  • Remember-me-cookie存储用于 Remember-Me 身份验证的令牌的 Cookie 的名称。默认值为“Remember-me”。映射到AbstractRememberMeServices的“cookiename”属性。

  • 钥匙映射到AbstractRememberMeServices的“键”属性。应该设置为唯一值,以确保 Remember-Me cookies 仅在一个应用程序[3]内有效。如果没有设置这个值,就会生成一个安全的随机值。由于生成安全的随机值可能需要一段时间,所以在使用 Remember-Me 功能时,显式地设置该值可以帮助提高启动时间。

  • 服务-别名将内部定义的RememberMeServices导出为 Bean 别名,允许它被应用程序上下文中的其他 bean 使用。

  • 服务-参考允许对过滤器将使用的RememberMeServices实现进行完全控制。在实现该接口的应用程序上下文中,值应该是 Bean 中的[gt r=“669”/>。如果正在使用注销过滤器,也应该实现LogoutHandler

  • Token-Repository-ref配置了PersistentTokenBasedRememberMeServices,但允许使用自定义的PersistentTokenRepository Bean。

  • 令牌-有效性-秒映射到tokenValiditySecondsAbstractRememberMeServices属性。指定 rememe-me cookie 的有效时间(以秒为单位)。默认情况下,它的有效期为 14 天。

  • 使用安全 cookie建议 Remember-Me Cookie 仅通过 HTTPS 提交,因此应标记为“Secure”。默认情况下,如果发出登录请求的连接是安全的(应该是安全的),则将使用安全的 cookie。如果将此属性设置为false,则不会使用安全 cookie。将其设置为true将始终设置 cookie 上的安全标志。此属性映射到AbstractRememberMeServicesuseSecureCookie属性。

  • user-service-refRemember-Me 服务实现需要访问UserDetailsService,因此必须在应用程序上下文中定义一个。如果只有一个,它将被命名空间配置自动选择和使用。如果有多个实例,则可以使用此属性显式地指定 Bean id

# <request-cache>元素

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

# <request-cache>的父元素

# <request-cache>属性

  • 参考定义了对 Spring Bean 的引用,即RequestCache

# <session-management>

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

# <session-management>的父元素

# <session-management>属性

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

  • invalid-session-url允许注入 SessionManagementFilter 使用的 InvalidSessionStrategy 实例。可以使用这个属性,也可以使用invalid-session-url属性,但不能同时使用这两个属性。

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

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

  • session-fixation-protection指示在用户进行身份验证时如何应用会话固定保护。如果设置为“无”,则不会应用任何保护。“NewSession”将创建一个新的空会话,其中只迁移了 Spring 与安全相关的属性。“migratesession”将创建一个新的会话并将所有会话属性复制到新的会话。在 Servlet 3.1(Java EE7)和较新的容器中,指定“ChangeSessionID”将保留现有的会话并使用容器提供的会话固定保护(HttpServletRequest#ChangeSessionID())。在 Servlet 3.1 和较新的容器中,默认为“ChangeSessionID”,在较旧的容器中为“MigrateSession”。如果在较旧的容器中使用了“changesessionID”,则抛出一个异常。

    如果会话固定保护被启用,则SessionManagementFilter被注入适当配置的DefaultSessionAuthenticationStrategy。有关此类的更多详细信息,请参见 Javadoc。

# <session-management>的子元素

# <concurrency-control>

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

# <concurrency-control>的父元素

# <concurrency-control>属性

  • 如果将超过最大值时的错误设置为“true”,则当用户尝试超过允许的最大会话次数时,将引发SessionAuthenticationException。默认的行为是使原始的会话过期。

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

  • 已过期的 URL允许注入 ConcurrentSessionFilter 使用的 ExpiredSessionStrategy 实例

  • 最大会话映射到maximumSessionsConcurrentSessionControlAuthenticationStrategy属性。指定-1作为支持无限会话的值。

  • session-registry-alias在你自己的 bean 或管理接口中使用对内部会话注册表的引用也很有用。你可以使用session-registry-alias属性公开内部 Bean,从而为它提供一个可以在配置的其他地方使用的名称。

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

# <x509>

添加对 X.509 身份验证的支持。一个X509AuthenticationFilter将被添加到堆栈中,并且将创建一个Http403ForbiddenEntryPoint Bean。后者仅在不使用其他身份验证机制的情况下使用(其唯一功能是返回 HTTP403 错误代码)。还将创建一个PreAuthenticatedAuthenticationProvider,它将用户权限的加载委托给UserDetailsService

# <x509>的父元素

# <x509>属性

  • 身份验证-详细信息-源代码-引用AuthenticationDetailsSource的引用

  • 主体-主体-正则表达式定义了一个正则表达式,它将用于从证书中提取用户名(用于UserDetailsService)。

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

# <filter-chain-map>

用于显式地配置带有 filterchainmap 的 filterchainproxy 实例

# <filter-chain-map>属性

  • 请求匹配程序定义了用于匹配传入请求的策略。目前的选项是“ Ant”(用于 Ant 路径模式),“regex”用于正则表达式,“ciregex”用于不区分大小写的正则表达式。

# <filter-chain-map>的子元素

# <filter-chain>

内用于定义特定的 URL 模式和应用于匹配该模式的 URL 的筛选器列表。当为了配置 FilterChainProxy 而将多个筛选链元素组合在一个列表中时,最特定的模式必须放在列表的顶部,而大多数一般的模式则放在底部。

# <filter-chain>的父元素

# <filter-chain>属性

  • 过滤器对实现Filter的 Spring bean 的引用的逗号分隔列表。值“none”表示对于这个FilterChain应该使用 noFilter

  • 模式结合请求匹配程序创建请求匹配器的模式

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

# <filter-security-metadata-source>

用于显式地配置一个 FilterSecurityMetaDataSource Bean,以便与 FilterSecurityInterceptor 一起使用。通常仅在显式配置 FilterChainProxy 时才需要,而不是使用 <http>元素。使用的截取 URL 元素应该只包含模式、方法和访问属性。任何其他操作都会导致配置错误。

# <filter-security-metadata-source>属性

  • 身份证 Bean 标识符,用于在上下文的其他地方引用 Bean。

  • 请求匹配程序定义了用于匹配传入请求的策略。当前的选项是“ Ant”(用于 Ant 路径模式),“regex”用于正则表达式,“ciregex”用于不区分大小写的正则表达式。

  • 使用表达式允许在 <intercept-url>元素中的“access”属性中使用表达式,而不是使用传统的配置属性列表。默认值为“true”。如果启用,每个属性应该包含一个布尔表达式。如果表达式计算为“true”,则将授予访问权限。

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


1。参见 Xref: Servlet/configuration/xml-namespace.ADOC#ns-web-xml[介绍性章节]

2。此功能实际上只是为了方便而提供的,并不是用于生产(在生产过程中,将选择一种视图技术,并可用于呈现定制的登录页面)。类DefaultLoginPageGeneratingFilter负责呈现登录页面,并在需要时为普通表单登录和/或 OpenID 提供登录表单。

3。这不会影响PersistentTokenBasedRememberMeServices的使用,在这里,令牌存储在服务器端。

认证服务方法安全性