• 20191118 Spring Boot官方文档学习(4.9)


    4.9。安全

    如果Spring Security在类路径上,则默认情况下Web应用程序是采用的。Spring Boot依靠Spring Security的内容协商策略来确定使用httpBasic还是formLogin。要将方法级安全性添加到Web应用程序,您还可以添加@EnableGlobalMethodSecurity所需的设置。

    默认的UserDetailsService有一个用户。用户名为user,密码为随机密码,并在应用程序启动时以INFO级别显示,如下例所示:

    Using generated security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
    

    如果您微调日志记录配置,请确保将org.springframework.boot.autoconfigure.security类别设置为日志INFO级别的消息。否则,不会打印默认密码。

    您可以通过提供一个spring.security.user.name和spring.security.user.password来更改用户名和密码。

    默认情况下,您在Web应用程序中获得的基本功能是:

    • 一个具有内存存储的UserDetailsService bean (或WebFlux应用程序中的ReactiveUserDetailsService)和一个具有生成的密码的单个用户(请参考SecurityProperties.User的属性)。
    • 整个应用程序的基于表单的登录或HTTP Basic安全性(取决于请求中的Accept标头)(如果执行器位于类路径上,则包括执行器端点)。
    • DefaultAuthenticationEventPublisher,用于发布身份验证事件。

    您可以通过添加一个bean 来提供不同的AuthenticationEventPublisher

    4.9.1。MVC安全

    默认的安全配置在SecurityAutoConfigurationUserDetailsServiceAutoConfiguration中实现。 SecurityAutoConfiguration导入SpringBootWebSecurityConfiguration保证Web安全性,UserDetailsServiceAutoConfiguration配置身份验证,这在非Web应用程序中也很重要。要完全关闭默认的Web应用程序安全性配置或合并多个Spring Security组件(例如OAuth 2 ClientResource Server),请添加一个WebSecurityConfigurerAdapter类型的bean (这样做不会禁用UserDetailsService配置或Actuator的安全性)。

    为了关闭UserDetailsService的配置,您可以添加UserDetailsServiceAuthenticationProviderAuthenticationManager类型的bean。

    可以通过添加自定义WebSecurityConfigurerAdapter来覆盖访问规则。Spring Boot提供了方便的方法,可用于覆盖执行器端点和静态资源的访问规则。 EndpointRequest可用于创建基于management.endpoints.web.base-path属性的RequestMatcherPathRequest可用于创建在常用RequestMatcher资源。

    4.9.2。WebFlux安全

    与Spring MVC应用程序类似,您可以通过添加spring-boot-starter-security依赖项来保护WebFlux应用程序。默认的安全配置在ReactiveSecurityAutoConfigurationUserDetailsServiceAutoConfiguration中实现。 ReactiveSecurityAutoConfiguration导入WebFluxSecurityConfiguration保证Web安全性,UserDetailsServiceAutoConfiguration配置身份验证,这在非Web应用程序中也很重要。要完全关闭默认的Web应用程序安全性配置,可以添加一个WebFilterChainProxy类型的bean (这样做不会禁用UserDetailsService配置或执行器的安全性)。

    要关闭UserDetailsService配置,可以添加类型为ReactiveUserDetailsServiceReactiveAuthenticationManager的Bean 。

    可以通过添加自定义SecurityWebFilterChain bean 来配置访问规则以及使用多个Spring Security组件(例如OAuth 2 Client和Resource Server)。Spring Boot提供了方便的方法,可用于覆盖执行器端点和静态资源的访问规则。 EndpointRequest可用于创建基于management.endpoints.web.base-path属性的ServerWebExchangeMatcher

    PathRequest可用于为常用位置的资源创建ServerWebExchangeMatcher

    例如,您可以通过添加以下内容来自定义安全配置:

    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        return http
            .authorizeExchange()
                .matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
                .pathMatchers("/foo", "/bar")
                    .authenticated().and()
                .formLogin().and()
            .build();
    }
    

    4.9.3。OAuth2

    OAuth2是Spring支持的一种广泛使用的授权框架。

    Client

    如果spring-security-oauth2-client在类路径中,则可以利用一些自动配置功能来轻松设置OAuth2 / Open ID Connect客户端。此配置使用的属性OAuth2ClientProperties。相同的属性适用于servlet和反应式应用程序。

    您可以在spring.security.oauth2.client前缀下注册多个OAuth2客户端和提供者,如以下示例所示:

    spring.security.oauth2.client.registration.my-client-1.client-id=abcd
    spring.security.oauth2.client.registration.my-client-1.client-secret=password
    spring.security.oauth2.client.registration.my-client-1.client-name=Client for user scope
    spring.security.oauth2.client.registration.my-client-1.provider=my-oauth-provider
    spring.security.oauth2.client.registration.my-client-1.scope=user
    spring.security.oauth2.client.registration.my-client-1.redirect-uri-template=https://my-redirect-uri.com
    spring.security.oauth2.client.registration.my-client-1.client-authentication-method=basic
    spring.security.oauth2.client.registration.my-client-1.authorization-grant-type=authorization_code
    
    spring.security.oauth2.client.registration.my-client-2.client-id=abcd
    spring.security.oauth2.client.registration.my-client-2.client-secret=password
    spring.security.oauth2.client.registration.my-client-2.client-name=Client for email scope
    spring.security.oauth2.client.registration.my-client-2.provider=my-oauth-provider
    spring.security.oauth2.client.registration.my-client-2.scope=email
    spring.security.oauth2.client.registration.my-client-2.redirect-uri-template=https://my-redirect-uri.com
    spring.security.oauth2.client.registration.my-client-2.client-authentication-method=basic
    spring.security.oauth2.client.registration.my-client-2.authorization-grant-type=authorization_code
    
    spring.security.oauth2.client.provider.my-oauth-provider.authorization-uri=https://my-auth-server/oauth/authorize
    spring.security.oauth2.client.provider.my-oauth-provider.token-uri=https://my-auth-server/oauth/token
    spring.security.oauth2.client.provider.my-oauth-provider.user-info-uri=https://my-auth-server/userinfo
    spring.security.oauth2.client.provider.my-oauth-provider.user-info-authentication-method=header
    spring.security.oauth2.client.provider.my-oauth-provider.jwk-set-uri=https://my-auth-server/token_keys
    spring.security.oauth2.client.provider.my-oauth-provider.user-name-attribute=name
    

    对于支持OpenID Connect discovery的 OpenID Connect提供程序,可以进一步简化配置。提供者需要配置issuer-uri,即它声明为其发布者标识符的URI。例如,如果issuer-uri提供的是“ https://example.com”,则将OpenID Provider Configuration Request对“ https://example.com/.well-known/openid-configuration”进行标记。结果预期为OpenID Provider Configuration Response。以下示例显示如何使用issuer-uri来配置OpenID Connect提供程序:

    spring.security.oauth2.client.provider.oidc-provider.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
    

    默认情况下,Spring Security OAuth2LoginAuthenticationFilter只处理匹配 /login/oauth2/code/* 的URL。如果要自定义redirect-uri,以使用其他模式,则需要提供配置以处理该自定义模式。例如,对于Servlet应用程序,您可以添加WebSecurityConfigurerAdapter类似于以下内容的自己的应用程序:

    public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .oauth2Login()
                    .redirectionEndpoint()
                        .baseUri("/custom-callback");
        }
    }
    

    普通提供商的OAuth2客户端注册

    对于常见的OAuth2和OpenID提供商,包括谷歌,Github,Facebook和Okta,我们提供了一组默认的供应商(google,github,facebook,和okta)。

    如果不需要自定义这些供应商,则可以将provider属性设置为需要为其推断默认值的属性。另外,如果用于客户端注册的key与默认支持的供应商匹配,则Spring Boot也会进行推断。

    换句话说,以下示例中的两个配置都使用Google供应商:

    spring.security.oauth2.client.registration.my-client.client-id=abcd
    spring.security.oauth2.client.registration.my-client.client-secret=password
    spring.security.oauth2.client.registration.my-client.provider=google
    
    spring.security.oauth2.client.registration.google.client-id=abcd
    spring.security.oauth2.client.registration.google.client-secret=password
    

    Resource Server

    如果spring-security-oauth2-resource-server在类路径中,则Spring Boot可以设置OAuth2资源服务器。对于JWT配置,需要指定JWK Set URI或OIDC Issuer URI,如以下示例所示:

    spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://example.com/oauth2/default/v1/keys
    spring.security.oauth2.resourceserver.jwt.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
    

    如果授权服务器不支持JWK Set URI,则可以使用用于验证JWT签名的公共密钥来配置资源服务器。可以使用spring.security.oauth2.resourceserver.jwt.public-key-location属性来完成此操作,该属性值需要指向包含PEM编码的x509格式的公钥的文件。

    相同的属性适用于servlet和反应式应用程序。

    另外,您可以为Servlet应用程序或ReactiveJwtDecoder响应式应用程序定义自己的JwtDecoder bean 。

    如果使用不透明令牌而不是JWT,则可以配置以下属性以通过自我检查来验证令牌:

    spring.security.oauth2.resourceserver.opaquetoken.introspection-uri=https://example.com/check-token
    spring.security.oauth2.resourceserver.opaquetoken.client-id=my-client-id
    spring.security.oauth2.resourceserver.opaquetoken.client-secret=my-client-secret
    

    同样,相同的属性适用于servlet和反应式应用程序。

    另外,您可以为Servlet应用程序定义OpaqueTokenIntrospector bean或为响应式应用程序定义ReactiveOpaqueTokenIntrospector bean 。

    Authorization Server

    当前,Spring Security不提供对实现OAuth 2.0授权服务器的支持。但是,Spring Security OAuth项目提供了此功能,最终将被Spring Security完全取代。在此之前,您可以使用spring-security-oauth2-autoconfigure模块轻松设置OAuth 2.0授权服务器。

    4.9.4。SAML 2.0

    Relying Party

    如果spring-security-saml2-service-provider在类路径上,则可以利用一些自动配置功能来轻松设置SAML 2.0。此配置使用Saml2RelyingPartyProperties的属性。

    依赖方注册代表身份提供商IDP和服务提供商SP之间的配对配置。您可以在spring.security.saml2.relyingparty前缀下注册多个依赖方,如以下示例所示:

    spring.security.saml2.relyingparty.registration.my-relying-party1.signing.credentials[0].private-key-location=path-to-private-key
    spring.security.saml2.relyingparty.registration.my-relying-party1.signing.credentials[0].certificate-location=path-to-certificate
    spring.security.saml2.relyingparty.registration.my-relying-party1.identityprovider.verification.credentials[0].certificate-location=path-to-verification-cert
    spring.security.saml2.relyingparty.registration.my-relying-party1.identityprovider.entity-id=remote-idp-entity-id1
    spring.security.saml2.relyingparty.registration.my-relying-party1.identityprovider.sso-url=https://remoteidp1.sso.url
    
    spring.security.saml2.relyingparty.registration.my-relying-party2.signing.credentials[0].private-key-location=path-to-private-key
    spring.security.saml2.relyingparty.registration.my-relying-party2.signing.credentials[0].certificate-location=path-to-certificate
    spring.security.saml2.relyingparty.registration.my-relying-party2.identityprovider.verification.credentials[0].certificate-location=path-to-other-verification-cert
    spring.security.saml2.relyingparty.registration.my-relying-party2.identityprovider.entity-id=remote-idp-entity-id2
    spring.security.saml2.relyingparty.registration.my-relying-party2.identityprovider.sso-url=https://remoteidp2.sso.url
    

    4.9.5。Actuator Security

    为了安全起见,默认情况下,除/health/info以外的所有执行器都是禁用的。management.endpoints.web.exposure.include属性可用于启用执行器。

    如果Spring Security是在类路径上,并且没有其他WebSecurityConfigurerAdapter存在,所有的执行器除了/health和/info以外,通过Spring Boot自动配置保护。如果您自定义一个WebSecurityConfigurerAdapter,Spring Boot自动配置将退出,您将完全控制执行器访问规则。

    在设置management.endpoints.web.exposure.include之前,请确保公开的执行器不包含敏感信息,并且通过将它们放置在防火墙后面或通过诸如Spring Security之类的东西进行保护。

    跨站点请求伪造(CSRF)保护

    由于Spring Boot依赖于Spring Security的默认值,因此默认情况下CSRF保护是打开的。这意味着在使用默认安全性配置时,执行器端点请求POST(关闭和记录器端点)PUT或DELETE将收到403禁止错误。

    我们建议仅在创建非浏览器客户端使用的服务时完全禁用CSRF保护。

  • 相关阅读:
    easyui
    H+ Se7en WebUI
    WEB IM
    PowerDesigner 导出 Excel
    SSO跨域 CodeProject
    ICU 是一种说不出的痛啊
    C#的Main(String[] args)参数输入问题
    C# TabControl标签的隐藏
    在foreach的判断条件里执行方法会有效率问题吗?
    C#编程命名规范推荐
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/11885489.html
Copyright © 2020-2023  润新知