基础的网站安全 Java配置

第一步是创建我们的Java配置。这个配置在你的应用程序中创建一个springSecurityFilterChain 的Servlet的过滤器,负责所有安全(例如 保护应用程序的URL,验证提交的用户名和密码,重定向到登陆的表单等等)。你可以在下面找到大部分Java配置项的例子:

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.context.annotation.*;
  3. import org.springframework.security.config.annotation.authentication.builders.*;
  4. import org.springframework.security.config.annotation.web.configuration.*;
  5. @EnableWebSecurity
  6. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  7. @Autowired
  8. public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
  9. auth.inMemoryAuthentication()
  10. .withUser("user").password("password").roles("USER");
  11. }
  12. }

configureGlobal 方法的名字不重要,然而,重要的是只在一个被@EnableWebSecurity, @EnableGlobalMethodSecurity或者@EnableGlobalAuthentication注解的类中配置AuthenticationManagerBuilder,否则会有不可预知的后果。

真的是没有太多的配置,但它确实很多功能。你可以在下面的找到功能摘要:

  • 在你的应用程序中对每个URL进行验证
  • 为你生成一个登陆表单
  • 允许用户使用用户名user和密码password使用验证表单进行验证。
  • 允许用户登出
  • CSRF 攻击防范
  • Session保护
  • 安全 Header 集成
    • 对安全要求严格的HTTP传输安全
    • X-Content-Type-Options 集成
    • 缓存控制(稍后可以允许你缓存静态资源)
    • X-XSS-Protection集成
    • X-Frame-Options集成防止点击劫持
  • 和以下 Servlet API 方法集成
    • HttpServletRequest#getRemoteUser()
    • HttpServletRequest.html#getUserPrincipal()
    • HttpServletRequest.html#isUserInRole(java.lang.String)
    • HttpServletRequest.html#login(java.lang.String, java.lang.String)
    • HttpServletRequest.html#logout()

AbstractSecurityWebApplicationInitializer

下一步是在war里注册 springSecurityFilterChain. 这可以通过Spring在Servlet 3.0+环境中对WebApplicationInitializer的支持进行Java配置,Spring Security提供了基本的抽象类AbstractSecurityWebApplicationInitializer,这可以确保springSecurityFilterChain被注册。我们使用AbstractSecurityWebApplicationInitializer的不同方式取决于你是已经在使用Spring框架还是只使用了Spring Security。

  • Section 3.1.2, “AbstractSecurityWebApplicationInitializer 不与Spring一起使用” - 使用这个说明如果你没有使用Spring框架
  • Section 3.1.3, “AbstractSecurityWebApplicationInitializer 与Spring一起使用” - 如果你正在使用Spring框架使用这个说明

AbstractSecurityWebApplicationInitializer 不与Spring一起使用

如果你没有使用Spring MVC 或Spring , 你需要传递SecurityConfig到超类来确保配置被使用,你可以参考下面的例子:

  1. import org.springframework.security.web.context.*;
  2. public class SecurityWebApplicationInitializer
  3. extends AbstractSecurityWebApplicationInitializer {
  4. public SecurityWebApplicationInitializer() {
  5. super(SecurityConfig.class);
  6. }
  7. }

SecurityWebApplicationInitializer将会做下面的事情:

  • 自动为你的应用程序的每个URL注册springSecurityFilterChain 过滤器
  • 添加一个 ContextLoaderListener用来载入SecurityConfig.

AbstractSecurityWebApplicationInitializer 与Spring一起使用

如果我们在应用程序的其他地方已经使用了Spring,那么我们已经有了一个WebApplicationInitializer用来载入Spring的配置。如果我们使用上面的配置将会得到一个错误。所以我们应该使用已经存在的ApplicationContext来注册Spring Security.举个例子,如果我们使用Spring MVC我们的SecurityWebApplicationInitializer应该看起来和下面的差不多:

  1. import org.springframework.security.web.context.*;
  2. public class SecurityWebApplicationInitializer
  3. extends AbstractSecurityWebApplicationInitializer {
  4. }

这会简单的只为你的应用程序的所有URL注册springSecurityFilterChain过滤器。然后我们需要确保这个Security配置被载入到我们已经存在的ApplicationInitializer. 例如, 如果你使用Spring MVC他应该被加入到 getRootConfigClasses()

  1. public class MvcWebApplicationInitializer extends
  2. AbstractAnnotationConfigDispatcherServletInitializer {
  3. @Override
  4. protected Class<?>[] getRootConfigClasses() {
  5. return new Class[] { SecurityConfig.class };
  6. }
  7. // ... other overrides ...
  8. }