安全上

我刚刚宣布了新消息学习Spring Security课程,包括全部材料专注于春季安全的新OAuth2堆栈5:

>>查看课程

1.介绍

本文将重点讨论使用Spring Security登录。我们将建立在简单之上上一个春季MVC示例,因为这是设置Web应用程序以及登录机制的必要部分。

进一步阅读:

Spring Security -登录后重定向到上一个URL

Spring Security中登录后重定向的一个简短示例

两个具有Spring安全性的登录页面

使用两个单独的登录页面配置Spring Security的快速实用指南。

春季安全表单登录

Spring登录示例——如何设置一个简单的登录表单、一个基本的安全XML配置和一些更高级的配置技术。

2. Maven依赖项

当使用弹簧靴时spring-boot-starter-security起动器将自动包含所有依赖项,例如spring-security-core,spring-security-webspring-security-config其中:

<依赖> < groupId > org.springframework。启动< / groupId > < artifactId > spring-boot-starter-security < / artifactId > <版本> 2.3.3。依赖版本< / > < / >

如果我们不使用春靴,请参阅Spring Security with Maven文章,描述如何添加所有必需的依赖项。这两个标准spring-security-webspring-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:

      <身份验证 - 提供程序>        

6.的web . xml

在引入Spring 4之前中配置Spring安全配置web . xml-只有一个额外的过滤器添加到标准的Spring MVCweb . xml:

<显示名称>春季安全应用 <! -  spring mvc  - > <! -  ...  - > <! -  Spring Security  - >  springsecurityfilterchain   org.springframework.web.filter.delegatedfilterproxy     springsecurityfilterchain   / * / url-pattern> 

过滤器- - - - - -DelegatingFilterProxy-简单地委托给一个spring管理的bean - theFilterChainProxy.-它本身能够从Spring bean的全生命周期管理等中受益。

7.登录表单

登录表单页面将使用简单的机制向Spring MVC注册将视图名称映射到url中间不需要显式的控制器:

Registry.AddViewController(“/ login.html”);

当然,这个对应于login.jsp.jsp.:

    

登录

春天登录表单具有以下相关工件:

  • 登录- 发布表单以触发身份验证过程的URL
  • 用户名——用户名
  • 密码——密码

8.进一步配置Spring登录

我们简要讨论了在上面介绍了Spring安全配置时登录机制的一些配置 - 让我们现在进入一些细节。

在Spring Security中覆盖大多数默认值的一个原因是隐藏应用程序使用Spring Security获得的事实并最大限度地减少潜在攻击者了解应用程序的信息。金宝搏官网188be

完全配置,登录元素如下所示:

@Override protected void configure(HttpSecurity http) throws Exception {http. formlogin () .loginPage("/login.html") .loginProcessingUrl("/perform_login") .defaultSuccessUrl("/homepage.html",true) .failureUrl("/login.html?error=true")}}

或者对应的XML配置:

8.1。登录页面

接下来,让我们看看如何使用loginPage()方法:

http.formlogin().loginpage(“/ login.html”)

或者,通过XML配置:

登录页面= ' / login.html '

如果我们不指定这一点,Spring Security将在/登录URL。

8.2。用于登录的POST URL

Spring登录将发布以触发身份验证过程的默认URL是/登录曾经是/ j_spring_security_checkSpring Security 4

我们可以使用loginProcessingUrl方法重写此URL:

http.formlogin().loginprocessingurl(“/ perform_login”)

或者,通过XML配置:

login-processing-url = " / perform_login”

重写这个默认URL的一个很好的理由是隐藏这个事实,即应用程序实际上是由Spring Security保护的——该信息不应该在外部可用。

8.3。登陆页面显示成功

在成功的登录过程之后,用户被重定向到页面 - 默认情况下是Web应用程序的根目录。

我们可以通过defaultSuccessUrl ()方法:

http.formLogin () .defaultSuccessUrl(“/ homepage.html”)

或使用XML配置:

default-target-url =“/ homepage.html”

如果是always-use-default-target设置为true,则用户总是被重定向到此页面。如果该属性设置为false,那么在提示进行身份验证之前,用户将被重定向到他们想要访问的前一个页面。

8.4。失败的着陆页

与登录页面一样,登录失败页面是由Spring Security at自动生成的/登录吗?默认情况下错误。

要覆盖这个,我们可以用FallyURL()方法:

http.formLogin () .failureUrl(“错误= true / login.html ?”)

或使用XML:

身份验证 - 失败 -  url =“/ login.html?错误= true”

9.结论

在这个春天登录的例子,我们配置了一个简单的身份验证过程——我们讨论了Spring安全登录表单、安全配置和一些更高级的定制。

可以找到此Spring登录教程的实施GitHub项目-这是一个基于eclipse的项目,所以它应该很容易导入和运行。

当项目在本地运行时,示例HTML可以在以下地址访问:

http://localhost:8080/spring-security-mvc-login/login.html
安全底

我刚刚宣布了新消息学习Spring Security课程,包括全部材料专注于春季安全的新OAuth2堆栈5:

>>查看课程
10评论
最老的
最新
内联反馈
查看所有评论
评论在本文上关闭!
用户: <输入类型='文本'name ='用户名'value =''>
密码: <输入类型='password'name ='password'/>
<输入名称=“提交”类型=“提交”值=“提交”/>