春季安全表单登录
最后修改:2021年4月15日
1.介绍
本文将重点讨论使用Spring Security登录。我们将建立在简单之上上一个春季MVC示例,因为这是设置Web应用程序以及登录机制的必要部分。
进一步阅读:
2. Maven依赖项
当使用弹簧靴时spring-boot-starter-security起动器将自动包含所有依赖项,例如spring-security-core,spring-security-web和spring-security-config其中:
<依赖> < groupId > org.springframework。启动< / groupId > < artifactId > spring-boot-starter-security < / artifactId > <版本> 2.3.3。依赖版本< / > < / >
如果我们不使用春靴,请参阅Spring Security with Maven文章,描述如何添加所有必需的依赖项。这两个标准spring-security-web和spring-security-config将被要求。
3. Spring Security Java配置
让我们首先创建一个扩展的Spring安全配置类WebSecurityConfigurerAdapter。
通过添加@bablewebsecurity.,我们获得了Spring安全和MVC集成支持:
@ configuration @EnableWebSecurity公开课SecSecurityConfig延伸WebSecurityConfigurerAdapter {@Override保护无效配置(最终AuthenticationManagerBuilder auth)抛出异常{/ /身份验证管理器(见下文)}@Override保护无效配置(最终HttpSecurity http) {/ / http builder配置抛出异常用于授权请求和表单登录(见下文)}}
在本例中,我们使用了内存身份验证并定义了3个用户。
接下来,我们将浏览用于创建表单登录配置的元素。
让我们首先构建身份验证管理器。
3.1。身份验证管理器
身份验证提供者由一个简单的内存实现支持InmemoryUserDetailsManager.具体来说。当尚不需要完全持久机制时,这对于快速原型设计是有用的:
protected void configure(最终的AuthenticationManagerBuilder auth) throws Exception {auth. inmemoryauthentication () .withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER") . () .withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER") . ().withUser(“admin”).password (passwordEncoder () .encode(“adminPass”)).roles(“admin”);}
在这里,我们将三个用户配置有用户名,密码和硬编码的角色。
从Spring 5开始,我们还必须定义一个密码编码器。在我们的示例中,我们使用了bcryptpasswordencoder:
@Bean public PasswordEncoder PasswordEncoder(){返回新的BCryptPasswordEncoder();}
接下来,让我们配置httpsecurity。
3.2。用于授权请求的配置
我们首先进行必要的配置来授权请求。
这里,我们允许匿名访问/登录这样用户就可以进行身份验证。限制/行政来管理角色和确保其他一切:
@Override protected void configure(最终HttpSecurity http) throws Exception {http .csrf().disable() .authorizeRequests() .antMatchers("/admin/**").hasRole(" admin ") .antMatchers("/anonymous*").anonymous() .antMatchers("/login*").permitAll() .anyRequest().authenticated() . (). ()}
请注意,antMatchers ()元素是重要的更具体的规则需要先来,然后是更普遍的规则。
3.3。表单登录的配置
接下来,我们将上述配置扩展到表单登录和注销:
@Override protected void configure(final HttpSecurity http) throws Exception {http // ... .和().formLogin() .loginPage("/login.html") .loginProcessingUrl("/perform_login") .defaultSuccessUrl("/home .html"),true) .failureUrl("/login.html?error=true") .failureHandler(authenticationFailureHandler()) .logout() . logoutturl ("/perform_logout") .deleteCookies("JSESSIONID") .logoutSuccessHandler(logoutSuccessHandler());}
- loginPage ()—自定义登录页面
- loginProcessingUrl ()—提交用户名和密码的URL
- defaultSuccessUrl ()—登录成功后的登录页面
- FallyURL()—登录失败后的登录页面
- logoutUrl ()-自定义注销
4.向Web应用程序添加Spring安全性
要使用上述Spring安全配置,我们需要将其附加到Web应用程序。
我们将使用它WebApplicationInitializer,所以我们不需要提供任何web.xml:
public class AppInitializer implements WebApplicationInitializer {@Override public void onStartup(ServletContext sc) {AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();root.register (SecSecurityConfig.class);sc.addListener(新ContextLoaderListener(根));sc.addFilter("securityFilter", new DelegatingFilterProxy("springSecurityFilterChain")) .addMappingForUrlPatterns(null, false, "/*");}}
请注意,如果我们使用Spring Boot应用程序,则不需要此初始化器。看看我们的文章Spring Boot安全自动配置有关如何在Spring Boot中加载安全配置的更多细节。
5.Spring安全XML配置
让我们看一下相应的XML配置。
整个项目正在使用Java配置,因此我们需要通过Java导入XML配置文件@ configuration类:
@Configuration @ImportResource({"classpath:webSecurityConfig.xml"}) public class SecSecurityConfig {public SecSecurityConfig() {super();}}
和Spring安全XML配置-webSecurityConfig.xml:
http> <身份验证 - 提供程序> 用户服务> 验证 - 提供程序> authentication-manager> beans:bean>
6.的web . xml
在引入Spring 4之前中配置Spring安全配置web . xml-只有一个额外的过滤器添加到标准的Spring MVCweb . xml:
<显示名称>春季安全应用 display-name> <! - spring mvc - > <! - ... - > <! - Spring Security - > springsecurityfilterchain filter-name> org.springframework.web.filter.delegatedfilterproxy filter类> filter> springsecurityfilterchain filter-name> / * / url-pattern> filter-mapping>
过滤器- - - - - -DelegatingFilterProxy-简单地委托给一个spring管理的bean - theFilterChainProxy.-它本身能够从Spring bean的全生命周期管理等中受益。
7.登录表单
登录表单页面将使用简单的机制向Spring MVC注册将视图名称映射到url中间不需要显式的控制器:
Registry.AddViewController(“/ login.html”);
当然,这个对应于login.jsp.jsp.:
head> 登录 h1>