使用Java配置的Spring Security项目实例

Spring Framework在Spring 3.1中添加了Java配置支持。在Spring Security中, Java配置已添加到Spring Security 3.2中, 它使我们能够配置Spring Security而无需编写XML单行。
在这里, 我们将创建一个示例, 该示例实现Spring Security并在不使用XML的情况下进行配置。它包括以下步骤。
步骤1
第一步是创建一个Spring Security Java配置。下面给出了一个简单的基本Java配置。
WebSecurityConfig.java

package com.srcmini; 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.srcmini") public class WebSecurityConfig implements WebMvcConfigurer { @Bean public UserDetailsService userDetailsService() throws Exception { InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); manager.createUser(User.withDefaultPasswordEncoder().username("srcmini"). 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步
现在, 我们将向war注册springSecurityFilterChain。要进行注册, Spring Security提供了我们需要扩展的基类AbstractSecurityWebApplicationInitializer。
对于Spring MVC应用程序, SecurityWebApplicationInitializer如下所示。
SecurityWebApplicationInitializer.java
package com.srcmini; import org.springframework.security.web.context.*; public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {}

该代码将为我们应用程序中的每个URL注册springSecurityFilterChain。
第三步
现在, 在我们现有的ApplicationInitializer中加载WebSecurityConfig并将其添加到getRootConfigClasses()方法中。
MvcWebApplicationInitializer.java
package com.srcmini; 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.srcmini.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="http://www.srcmini.com/", 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>

我们完整的项目如下所示。
使用Java配置的Spring Security项目实例

文章图片
输出
我们在控制器中只有一个动作, 只有真正的用户才能访问它。因此, 当我们运行该应用程序时, 它会提示你输入登录凭据。输出如下。
使用Java配置的Spring Security项目实例

文章图片
这是Spring Security提供的默认登录页面, 我们没有创建它。尽管我们可以创建自己的登录页面并使用应用程序进行配置。我们将在下一个主题中进行此操作。
好了, 现在, 提供登录凭据以进入应用程序资源。 Spring Security验证用户凭据, 并确保该用户是真实的。
让我们看看, 会发生什么?如果输入错误的凭据。
使用Java配置的Spring Security项目实例

文章图片
单击登录按钮后, 它会引发Bad Credentials错误。
使用Java配置的Spring Security项目实例

文章图片
现在, 使用正确的凭据登录。
使用Java配置的Spring Security项目实例

文章图片
【使用Java配置的Spring Security项目实例】这次凭据被匹配并显示我们的主页(index.jsp)。
使用Java配置的Spring Security项目实例

文章图片

    推荐阅读