使用Java配置的Spring Security项目

Spring Framework在3.1版本中引入了Java配置支持。在Spring Security中,Java配置是在Spring Security 3.2中添加的,允许我们在不编写任何XML代码的情况下配置Spring Security

在这里,我们将创建一个示例,实现了Spring Security,并在不使用XML的情况下进行配置。它包括以下步骤。

步骤1

第一步是创建一个Spring Security Java配置。以下是一个简单的基本Java配置示例。

package cn.javatiku;  
  
import org.springframework.context.annotation.*;  
//import org.springframework.security.config.annotation.authentication.builders.*;  
import org.springframework.security.config.annotation.web.builders.HttpSecurity;  
import org.springframework.security.config.annotation.web.configuration.*;  
import org.springframework.security.core.userdetails.User;  
import org.springframework.security.core.userdetails.UserDetailsService;  
import org.springframework.security.provisioning.InMemoryUserDetailsManager;  
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;  
  
@EnableWebSecurity  
@ComponentScan("cn.javatiku")  
public class WebSecurityConfig implements WebMvcConfigurer {  
      
    @Bean  
    public UserDetailsService userDetailsService() throws Exception {  
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();  
        manager.createUser(User.withDefaultPasswordEncoder().username("javatiku").  
        password("java123").roles("USER").build());  
        return manager;  
    }  
      
    protected void configure(HttpSecurity http) throws Exception {  
                  
        http  
        .antMatcher("/")                                 
        .authorizeRequests()  
            .anyRequest().hasRole("ADMIN")  
            .and()  
        .httpBasic();  
    }  
}  

此配置创建一个名为springSecurityFilterChain的Servlet过滤器。它负责保护应用程序的URL,验证提交的用户名和密码,重定向到登录表单等。

上述Java配置执行以下操作来为我们的应用程序做配置:

  • 对每个URL都需要进行身份验证
  • 创建登录表单
  • 允许用户使用基于表单的身份验证进行认证
  • 允许注销
  • 防止CSRF攻击
  • 集成安全标头等

步骤2

现在,我们将springSecurityFilterChain注册到WAR包中。为了注册,Spring Security提供了一个基类AbstractSecurityWebApplicationInitializer,我们需要扩展它。

对于Spring MVC应用程序,SecurityWebApplicationInitializer如下所示:

package cn.javatiku;  
import org.springframework.security.web.context.*;  
  
public class SecurityWebApplicationInitializer  
    extends AbstractSecurityWebApplicationInitializer {  
  
}  

这段代码将为我们的应用程序的每个URL注册springSecurityFilterChain

步骤3

现在,在我们的现有ApplicationInitializer中加载WebSecurityConfig,并添加到getRootConfigClasses()方法中。

package cn.javatiku;  
  
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;  
public class MvcWebApplicationInitializer extends  
        AbstractAnnotationConfigDispatcherServletInitializer {  
    @Override  
    protected Class<?>[] getRootConfigClasses() {  
        return new Class[] { WebSecurityConfig.class };  
    }  
    @Override  
    protected Class<?>[] getServletConfigClasses() {  
        // TODO Auto-generated method stub  
        return null;  
    }  
    @Override  
    protected String[] getServletMappings() {  
        return new String[] { "/" };  
    }  
}  

步骤4

WebSecurityConfigurerAdapter类提供了一个configure(HttpSecurity http)方法,其中包含以下默认配置。默认定义如下所示。

protected void configure(HttpSecurity http) throws Exception {  
http  
.authorizeRequests()  
.anyRequest().authenticated()  
.and()  
.formLogin()  
.and()  
.httpBasic();  
}  

它与下面给出的XML类似。

<http>  
<intercept-url pattern="/**" access="authenticated"/>  
<form-login />  
<http-basic />  
</http>  

这个方法做了以下几件事情:

  • 确保用户发出的每个请求都需要进行身份验证
  • 允许用户使用基于表单的登录进行认证
  • 允许用户使用HTTP基本身份验证进行认证

步骤5

创建一个控制器来处理用户请求。

package cn.javatiku.controller;  
import org.springframework.stereotype.Controller;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RequestMethod;  
@Controller  
public class HomeController {  
      
    @RequestMapping(value="/", method=RequestMethod.GET)  
    public String index() {  
          
        return "index";  
    }  
}  

我们有一个视图(.jsp)页面index.jsp,其中包含以下源代码。

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Home Page</title>  
</head>  
<body>  
Welcome to home page!  
</body>  
</html>  

我们的完整项目如下所示。

spring-security-java-example.png

输出:

我们的控制器中只有一个操作,只有经过身份验证的用户才能访问。因此,当我们运行应用程序时,它会提示输入登录凭据。输出如下所示。

spring-security-java-example1.png

这是Spring Security提供的默认登录页面,我们没有创建它。虽然我们可以创建自己的登录页面并与应用程序配置。我们将在下一个主题中介绍如何实现这一点。

好的,现在提供登录凭据以进入应用程序资源。Spring Security验证用户凭据并确保用户是真实的。

让我们看看,如果我们输入错误的凭据会发生什么。

spring-security-java-example2.png

点击登录按钮后,它会抛出Bad Credentials(错误的凭据)错误。

spring-security-java-example3.png

现在,使用正确的凭据登录

spring-security-java-example4.png

这次凭据匹配,并显示我们的主页(index.jsp)。

spring-security-java-example5.png

标签: spring, Spring教程, Spring技术, Spring语言学习, Spring学习教程, Spring下载, Spring框架, Spring框架入门, Spring框架教程, Spring框架高级教程, Spring面试题, Spring笔试题, Spring编程思想