Spring security配置项目

Spring Framework在Spring 3.1中添加了Java配置支持。在Spring Security中,Java配置已添加到Spring Security 3.2中,使我们可以配置Spring Security 而无需编写XML单行。

在这里,我们将创建一个实现Spring的示例。安全性且未使用XML进行配置。它包括以下步骤。

步骤1

第一步是创建Spring Security Java配置。下面给出了一个简单的基本Java配置。

WebSecurityConfig.java

package com.nhooo;
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("com.nhooo")
public class WebSecurityConfig implements WebMvcConfigurer {
    
    @Bean
    public UserDetailsService userDetailsService() throws Exception {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withDefaultPasswordEncoder().username("Nhooo").
        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 。要进行注册,Spring Security提供了我们需要扩展的基类AbstractSecurityWebApplicationInitializer。

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

SecurityWebApplicationInitializer.java

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

此代码将为我们应用程序中的每个URL注册springSecurityFilterChain。

步骤3

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

MvcWebApplicationInitializer.java

package com.nhooo;
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 Basic身份验证进行身份验证

第5步

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

HomeController.java

package com.nhooo.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示例

输出:

我们在控制器中只有一个动作,只有真正的用户才能访问它。因此,当我们运行该应用程序时,它会提示您输入登录凭据。输出在下面给出。

Spring Security Java示例1

这是 Spring Security提供的默认登录页面页面,我们没有创建它。尽管我们可以创建自己的登录页面并使用应用程序进行配置。我们将在下一个主题中进行此操作。

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

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

Spring Security Java示例2

单击登录按钮后,则会引发 Bad Credentials (错误凭据)错误。

Spring Security Java示例3

现在,使用 正确的凭据登录。/strong>

Spring Security Java示例4

这次凭据被匹配并显示了主页(index.jsp)。

Spring Security Java示例5