Spring教程-使用Java配置的Spring Security项目
使用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提供的默认登录页面,我们没有创建它。虽然我们可以创建自己的登录页面并与应用程序配置。我们将在下一个主题中介绍如何实现这一点。
好的,现在提供登录凭据以进入应用程序资源。Spring Security验证用户凭据并确保用户是真实的。
让我们看看,如果我们输入错误的凭据会发生什么。
点击登录按钮后,它会抛出Bad Credentials(错误的凭据)错误。
现在,使用正确的凭据登录。
这次凭据匹配,并显示我们的主页(index.jsp)。