大家好,今天来为大家解答configuration是什么意思,configuration的意思翻译、用法这个问题的一些问题点,包括Configuration也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
本站(springdoc.cn)中的内容来源于spring.io,原始版权归属于spring.io。由springdoc.cn进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。商标声明:Spring是PivotalSoftware,Inc.在美国以及其他国家的商标。
在Spring3.1中,Spring框架加入了对Javaconfiguration的一般支持。SpringSecurity3.2引入了Java配置,让用户无需使用任何XML就能配置SpringSecurity。
如果你熟悉SecurityNamespace配置,你应该会发现它与SpringSecurityJava配置之间有不少相似之处。
SpringSecurity提供了大量的示例应用程序来演示SpringSecurityJava配置的使用。
第一步是创建我们的SpringSecurityJava配置。该配置创建了一个被称为springSecurityFilterChain的Servlet过滤器,它负责应用程序中的所有安全问题(保护应用程序的URL,验证提交的用户名和密码,重定向到登录表单,等等)。下面的例子显示了SpringSecurityJava配置的最基本例子。
importorg.springframework.beans.factory.annotation.Autowired;\n\nimportorg.springframework.context.annotation.*;\nimportorg.springframework.security.config.annotation.authentication.builders.*;\nimportorg.springframework.security.config.annotation.web.configuration.*;\n\n@Configuration\n@EnableWebSecurity\npublicclassWebSecurityConfig{\n\n\t@Bean\n\tpublicUserDetailsServiceuserDetailsService(){\n\t\tInMemoryUserDetailsManagermanager=newInMemoryUserDetailsManager();\n\t\tmanager.createUser(User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build());\n\t\treturnmanager;\n\t}\n}
这个配置并不复杂或广泛,但它做了很多事情。
下一步是在WAR文件中注册springSecurityFilterChain。你可以在Servlet3.0以上的环境中通过Spring的WebApplicationInitializer支持在Java配置中完成。毫不奇怪,SpringSecurity提供了一个基类(AbstractSecurityWebApplicationInitializer)来确保springSecurityFilterChain为你注册。我们使用AbstractSecurityWebApplicationInitializer的方式有所不同,这取决于我们是否已经在使用Spring,或者SpringSecurity是否是我们应用中唯一的Spring组件。
如果你没有使用Spring或SpringMVC,你需要将WebSecurityConfig传递给超类(superclass)以确保配置被接收。
importorg.springframework.security.web.context.*;\n\npublicclassSecurityWebApplicationInitializer\n\textendsAbstractSecurityWebApplicationInitializer{\n\n\tpublicSecurityWebApplicationInitializer(){\n\t\tsuper(WebSecurityConfig.class);\n\t}\n}
SecurityWebApplicationInitializer:
如果我们在应用的其他地方使用Spring,我们可能已经有一个WebApplicationInitializer,正在加载我们的Spring配置。如果我们使用之前的配置,我们会得到一个错误。相反,我们应该用现有的ApplicationContext注册SpringSecurity。例如,如果我们使用SpringMVC,我们的SecurityWebApplicationInitializer可能看起来像下面这样。
importorg.springframework.security.web.context.*;\n\npublicclassSecurityWebApplicationInitializer\n\textendsAbstractSecurityWebApplicationInitializer{\n\n}
这只是为你应用程序中的每个URL注册springSecurityFilterChain。之后,我们需要确保WebSecurityConfig被加载到我们现有的ApplicationInitializer中。例如,如果我们使用SpringMVC,它会被添加到getRootConfigClasses()中。
publicclassMvcWebApplicationInitializerextends\n\t\tAbstractAnnotationConfigDispatcherServletInitializer{\n\n\t@Override\n\tprotectedClass<?>[]getRootConfigClasses(){\n\t\treturnnewClass[]{WebSecurityConfig.class};\n\t}\n\n\t//...otheroverrides...\n}HttpSecurity
到目前为止,我们的WebSecurityConfig只包含了关于如何验证用户的信息。SpringSecurity是如何知道我们要要求所有的用户都要进行身份验证的?SpringSecurity如何知道我们要支持基于表单的认证?实际上,有一个配置类(称为SecurityFilterChain)在幕后被调用。它被配置为以下的默认实现。
@Bean\npublicSecurityFilterChainfilterChain(HttpSecurityhttp)throwsException{\n\thttp\n\t\t.authorizeRequests(authorize->authorize\n\t\t\t.anyRequest().authenticated()\n\t\t)\n\t\t.formLogin(withDefaults())\n\t\t.httpBasic(withDefaults());\n\treturnhttp.build();\n}
默认配置(如上例所示):
请注意,这种配置与XML命名空间的配置是平行的。
<http>\n\t<intercept-urlpattern="/**"access="authenticated"/>\n\t<form-login/>\n\t<http-basic/>\n</http>多个HttpSecurity实例
我们可以配置多个HttpSecurity实例,就像我们可以在XML中拥有多个<http>节点一样。关键是要注册多个SecurityFilterChain@Bean。下面的例子对以/api/开头的URL有不同的配置。
@Configuration\n@EnableWebSecurity\npublicclassMultiHttpSecurityConfig{\n\t@Bean\n\tpublicUserDetailsServiceuserDetailsService()throwsException{\n\t\t//ensurethepasswordsareencodedproperly\n\t\tUserBuilderusers=User.withDefaultPasswordEncoder();\n\t\tInMemoryUserDetailsManagermanager=newInMemoryUserDetailsManager();\n\t\tmanager.createUser(users.username("user").password("password").roles("USER").build());\n\t\tmanager.createUser(users.username("admin").password("password").roles("USER","ADMIN").build());\n\t\treturnmanager;\n\t}\n\n\t@Bean\n\t@Order(1)\n\tpublicSecurityFilterChainapiFilterChain(HttpSecurityhttp)throwsException{\n\t\thttp\n\t\t\t.securityMatcher("/api/**")\n\t\t\t.authorizeHttpRequests(authorize->authorize\n\t\t\t\t.anyRequest().hasRole("ADMIN")\n\t\t\t)\n\t\t\t.httpBasic(withDefaults());\n\t\treturnhttp.build();\n\t}\n\n\t@Bean\n\tpublicSecurityFilterChainformLoginFilterChain(HttpSecurityhttp)throwsException{\n\t\thttp\n\t\t\t.authorizeHttpRequests(authorize->authorize\n\t\t\t\t.anyRequest().authenticated()\n\t\t\t)\n\t\t\t.formLogin(withDefaults());\n\t\treturnhttp.build();\n\t}\n}
像往常一样配置认证。
创建一个SecurityFilterChain的实例,其中包含@Order以指定哪一个SecurityFilterChain应该被优先考虑。
http.securityMatcher指出,这个HttpSecurity只适用于以/api/开头的URL。
创建另一个SecurityFilterChain的实例。如果URL不是以/api/开头,就会使用这个配置。这个配置被认为在apiFilterChain之后,因为它的@Order值在1之后(没有@Order默认为最后)。
你可以在SpringSecurity中提供你自己的自定义DSL。
publicclassMyCustomDslextendsAbstractHttpConfigurer<MyCustomDsl,HttpSecurity>{\n\tprivatebooleanflag;\n\n\t@Override\n\tpublicvoidinit(HttpSecurityhttp)throwsException{\n\t\t//anymethodthataddsanotherconfigurer\n\t\t//mustbedoneintheinitmethod\n\t\thttp.csrf().disable();\n\t}\n\n\t@Override\n\tpublicvoidconfigure(HttpSecurityhttp)throwsException{\n\t\tApplicationContextcontext=http.getSharedObject(ApplicationContext.class);\n\n\t\t//herewelookupfromtheApplicationContext.Youcanalsojustcreateanewinstance.\n\t\tMyFiltermyFilter=context.getBean(MyFilter.class);\n\t\tmyFilter.setFlag(flag);\n\t\thttp.addFilterBefore(myFilter,UsernamePasswordAuthenticationFilter.class);\n\t}\n\n\tpublicMyCustomDslflag(booleanvalue){\n\t\tthis.flag=value;\n\t\treturnthis;\n\t}\n\n\tpublicstaticMyCustomDslcustomDsl(){\n\t\treturnnewMyCustomDsl();\n\t}\n}
这实际上是HttpSecurity.authorizeRequests()等方法的实现方式。
@Configuration\n@EnableWebSecurity\npublicclassConfig{\n\t@Bean\n\tpublicSecurityFilterChainfilterChain(HttpSecurityhttp)throwsException{\n\t\thttp\n\t\t\t.with(MyCustomDsl.customDsl(),(dsl)->dsl\n\t\t\t\t.flag(true)\n\t\t\t)\n\t\t\t//...\n\t\treturnhttp.build();\n\t}\n}
该代码按以下顺序调用。
如果你愿意,你可以通过使用SpringFactories让HttpSecurity默认添加MyCustomDsl。例如,你可以在classpath上创建一个名为META-INF/spring.factories的资源,内容如下。
org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer=sample.MyCustomDsl
你也可以明确地禁用默认值。
@Configuration\n@EnableWebSecurity\npublicclassConfig{\n\t@Bean\n\tpublicSecurityFilterChainfilterChain(HttpSecurityhttp)throwsException{\n\t\thttp\n\t\t\t.with(MyCustomDsl.customDsl(),(dsl)->dsl\n\t\t\t\t.disable()\n\t\t\t)\n\t\t\t...;\n\t\treturnhttp.build();\n\t}\n}后处理配置对象
SpringSecurity的Java配置并没有公开它所配置的每个对象的每个属性。这为大多数用户简化了配置。毕竟,如果每个属性都暴露出来,用户可以使用标准的bean配置。
虽然有很好的理由不直接暴露每个属性,但用户可能仍然需要更高级的配置选项。为了解决这个问题,SpringSecurity引入了ObjectPostProcessor的概念,它可以用来修改或替换许多由Java配置创建的Object实例。例如,为了配置FilterSecurityInterceptor上的filterSecurityPublishAuthorizationSuccess属性,你可以使用下面的方法。
关于configuration是什么意思,configuration的意思翻译、用法和Configuration的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。