4. Spring Security 5.1之 Java Configuration

Spring Framework 从Spring 3.1 开始支持Java Config 方式配置Bean. Spring Security.
从 3.2版本 起 也开始支持 Java Configuration ,使用户更容易配置 Spring
Security而不需要使用任何XML。

1. Hello Web Security Java Configuration

第一步是创建Spring Security Java配置。 该配置创建一个名为springSecurityFilterChain的Servlet过滤器,它负责应用程序中的所有安全性(保护应用程序URL,验证提交的用户名和密码,重定向到日志格式等)。 您可以在下面找到Spring Security Java配置的最基本示例:

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@EnableWebSecurity
public class WebSecurityConfig implements WebMvcConfigurer {
    @Bean
    public UserDetailsService userDetailsService(){
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        //下面这个方法由于不安全已经弃用
        //manager.createUser(User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build());
        //新方法
        PasswordEncoder passwordEncoder = PasswordEncoderFactories. createDelegatingPasswordEncoder();
        manager.createUser(User.withUsername(("user")).password(passwordEncoder.encode("password")).roles("USER").build());
        return manager;
    }
}

这种配置确实没什么用,但它做了很多。 您可以在下面找到以下功能的摘要:

  • 要求对应用程序中的每个URL进行身份验证

  • 为您生成登录表单

  • 允许具有Username用户和密码的用户使用基于表单的身份验证进行身份验证

  • 允许用户注销

  • CSRF攻击预防

  • 会话固定保护

  • 安全标头集成

    • 用于安全请求的HTTP严格传输安全性
    • X-Content-Type-Options集成
    • 缓存控制(稍后可由应用程序覆盖以允许缓存静态资源)
    • X-XSS-Protection集成
    • X-Frame-Options集成有助于防止Clickjacking
  • 与以下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()

1.1 AbstractSecurityWebApplicationInitializer

下一步是使用war注册springSecurityFilterChain

这可以在Java配置中使用Spring的WebApplicationInitializer支持在Servlet 3.0+环境中完成。

不出所料,Spring Security提供了一个基类AbstractSecurityWebApplicationInitializer,它将确保为您注册springSecurityFilterChain。

我们使用AbstractSecurityWebApplicationInitializer的方式取决于我们是否已经使用Spring,或者Spring Security是否是我们应用程序中唯一的Spring组件。

  • Section 6.1.2, “AbstractSecurityWebApplicationInitializer without Existing Spring” - Use these instructions if you are not using Spring
    already
  • Section 6.1.3, “AbstractSecurityWebApplicationInitializer with Spring MVC” - Use these instructions if you are already using Spring

1.2 AbstractSecurityWebApplicationInitializer 没有使用Spring

如果您不使用Spring或Spring MVC,则需要将WebSecurityConfig传递到超类中以确保获取配置。 你可以在下面找到一个例子:

import org.springframework.security.web.context.*;

public class SecurityWebApplicationInitializer
    extends AbstractSecurityWebApplicationInitializer {

    public SecurityWebApplicationInitializer() {
        super(WebSecurityConfig.class);
    }
}

SecurityWebApplicationInitializer将执行以下操作:

  • 自动为应用程序中的每个URL注册springSecurityFilterChain过滤器
  • 添加一个加载WebSecurityConfig的ContextLoaderListener。

1.3 AbstractSecurityWebApplicationInitializer with Spring MVC

如果我们在应用程序的其他地方使用Spring,我们可能已经有了一个加载Spring Configuration的WebApplicationInitializer。 如果我们使用以前的配置,我们会收到错误。 相反,我们应该使用现有的ApplicationContext注册Spring Security。 例如,如果我们使用Spring MVC,我们的SecurityWebApplicationInitializer将如下所示:

import org.springframework.security.web.context.*;

public class SecurityWebApplicationInitializer
    extends AbstractSecurityWebApplicationInitializer {

}

这只是为应用程序中的每个URL注册springSecurityFilterChain过滤器。

之后,我们将确保在现有的ApplicationInitializer中加载WebSecurityConfig。 例如,如果我们使用Spring MVC,它将被添加到getRootConfigClasses()中.

public class MvcWebApplicationInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { WebSecurityConfig.class };
    }

    // ... other overrides ...
}

全部官方源码示例
JavaConfig官方源码示例

猜你喜欢

转载自blog.csdn.net/hadues/article/details/89296581