当前位置: 移动技术网 > IT编程>开发语言>Java > Spring Security 表单登录功能的实现方法

Spring Security 表单登录功能的实现方法

2019年07月19日  | 移动技术网IT编程  | 我要评论

1.简介

本文将重点介绍使用 spring security 登录。 本文将构建在之前简单的 spring mvc示例 之上,因为这是设置web应用程序和登录机制的必不可少的。

2. maven 依赖

要将maven依赖项添加到项目中,请参阅spring security with maven 一文。 标准的 spring-security-web 和 spring-security-config 都是必需的。

3. spring security java配置

我们首先创建一个扩展 websecurityconfigureradapter 的 spring security 配置类。 通过添加 @enablewebsecurity ,我们获得了spring security和mvc集成支持:

@configuration
@enablewebsecurity
public class secsecurityconfig extends websecurityconfigureradapter {
  @override
  protected void configure(final authenticationmanagerbuilder auth) throws exception {
    auth.inmemoryauthentication()
     .withuser("user1").password(passwordencoder().encode("user1pass")).roles("user")
     .and()
     .withuser("user2").password(passwordencoder().encode("user2pass")).roles("user")
     .and()
     .withuser("admin").password(passwordencoder().encode("adminpass")).roles("admin");
  }
  @override
  protected void configure(final httpsecurity http) throws exception {
    http
     .csrf().disable()
     .authorizerequests()
     .antmatchers("/admin/**").hasrole("admin")
     .antmatchers("/anonymous*").anonymous()
     .antmatchers("/login*").permitall()
     .anyrequest().authenticated()
     .and()
     .formlogin()
     .loginpage("/login.html")
     .loginprocessingurl("/perform_login")
     .defaultsuccessurl("/homepage.html", true)
     //.failureurl("/login.html?error=true")
     .failurehandler(authenticationfailurehandler())
     .and()
     .logout()
     .logouturl("/perform_logout")
     .deletecookies("jsessionid")
     .logoutsuccesshandler(logoutsuccesshandler());
  }
  @bean
  public passwordencoder passwordencoder() {
    return new bcryptpasswordencoder();
  }
}

在此示例中,我们使用内存身份验证并定义了3个用户。

现在来看看我们用来创建表单登录配置的元素。

3.1. authorizerequests()

我们允许匿名访问*/login*,以便用户可以进行身份验证,同时也是保护其他请求。请注意,*antmatchers()*元素的顺序很重要 - 首先需要填写具体的路径规则,然后是才是大致匹配的规则。

3.2. formlogin()

这有几种方法可以用来配置表单登录的行为:

loginpage()  – 自定义登录页面
loginprocessingurl()  – 提交username和password的url
defaultsuccessurl()  – 登录成功后跳转的url
failureurl()  – 登录失败后跳转的url

3.3. authentication manager

身份验证提供程序由一个简单的内存实现支持 - inmemoryuserdetailsmanager 。 当尚不需要完整的持久性机制时,这对于进行快速原型设计很有用。

从spring 5开始,我们还必须定义密码编码器。 在我们的例子中,我们使用了 bcryptpasswordencoder 。

4. 添加spring security到web应用

要使用上面定义的spring security配置,我们需要将其添加到web应用程序。 在这种情况下,我们不需要任何 web.xml :

public class springapplicationinitializer 
 extends abstractannotationconfigdispatcherservletinitializer {
  
  protected class<?>[] getrootconfigclasses() {
    return new class[] {secsecurityconfig.class};
  }
}

注意,如果我们使用spring boot应用程序,则不需要此初始化程序。 有关如何在spring boot中加载安全性配置的更多详细信息,详情参阅 spring boot security auto-configuration

5. spring security xml配置

我们来看看相应的xml配置。整个项目使用java配置,因此我们需要通过java @configuration 类导入xml配置文件:

@configuration
@importresource({ "classpath:websecurityconfig.xml" })
public class secsecurityconfig {
  public secsecurityconfig() {
   super();
  }
}

以及spring security 的xml配置– websecurityconfig.xml :

<http use-expressions="true">
  <intercept-url pattern="/login*" access="isanonymous()" />
  <intercept-url pattern="/**" access="isauthenticated()"/>
 
  <form-login login-page='/login.html'
   default-target-url="/homepage.html"
   authentication-failure-url="/login.html?error=true" />
  <logout logout-success-url="/login.html" />
</http>
 
<authentication-manager>
  <authentication-provider>
    <user-service>
      <user name="user1" password="user1pass" authorities="role_user" />
    </user-service>
    <password-encoder ref="encoder" />
  </authentication-provider>
</authentication-manager>
 
<beans:bean id="encoder"
 class="org.springframework.security.crypto.bcrypt.bcryptpasswordencoder">
</beans:bean>

6. web.xml

在引入spring 4之前,我们曾经在 web.xml 中配置spring security - 只有一个额外的过滤器添加到 spring mvc 的web.xml中:

<display-name>spring secured application</display-name>
 
<!-- spring mvc -->
<!-- ... -->
<!-- spring security -->
<filter>
  <filter-name>springsecurityfilterchain</filter-name>
  <filter-class>org.springframework.web.filter.delegatingfilterproxy</filter-class>
</filter>
<filter-mapping>
  <filter-name>springsecurityfilterchain</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

过滤器 - delegatingfilterproxy - 简单地委托给一个spring管理的bean - filterchainproxy-它本身可以从完整的spring bean生命周期管理中受益。

7. login form

登录表单页面使用简单的机制将视图名称映射到url 向spring mvc注册,且无需编写controller:

registry.addviewcontroller("/login.html");

对应于 login.jsp :

<html>
<head></head>
<body>
  <h1>login</h1>
  <form name='f' action="login" method='post'>
   <table>
     <tr>
      <td>user:</td>
      <td><input type='text' name='username' value=''></td>
     </tr>
     <tr>
      <td>password:</td>
      <td><input type='password' name='password' /></td>
     </tr>
     <tr>
      <td><input name="submit" type="submit" value="submit" /></td>
     </tr>
   </table>
 </form>
</body>
</html>

spring login form包含以下相关组件:

login  - 接受表单post的url,触发身份验证过程
username  - 用户名
password  - 密码

8.进一步配置spring登录

当我们在上面介绍spring安全配置时,我们简要讨论了一些登录机制的配置 - 现在详细介绍一下。

覆盖spring security中大多数默认值的一个原因是隐藏应用程序受spring security保护的事实,并最大限度地减少潜在攻击者对应用程序的了解。

完全配置后,login元素如下所示:

@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配置:

<form-login
 login-page='/login.html'
 login-processing-url="/perform_login"
 default-target-url="/homepage.html"
 authentication-failure-url="/login.html?error=true"
 always-use-default-target="true"/>

8.1. 登录页

接下来,让我们看看如何使用*loginpage()*方法配置自定义登录页面:

http.formlogin()
  .loginpage("/login.html")

或者,使用xml配置:

login-page='/login.html'

如果我们不指定这个,spring security将在*/login*上生成一个非常基本的登录表单。

8.2. 登录的post url

触发身份验证默认的url是*/login*,我们可以使用 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 会在*/login?error*自动生成登录失败页面。

要覆盖它,我们可以使用*failureurl()*方法:

http.formlogin()
 .failureurl("/login.html?error=true")

或者xml:

authentication-failure-url="/login.html?error=true"

9. 结论

在这个spring登录示例中,我们配置了一个简单的身份验证过程 - 我们讨论了spring安全登录表单,安全配置和一些可用的更高级的自定义。

这个spring登录教程的实现可以在github 项目中找到 - 这是一个基于eclipse的项目,所以它应该很容易导入和运行。

当项目在本地运行时,可以在以下位置访问示例html:

总结

以上所述是小编给大家介绍的spring security 表单登录功能的实现方法,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网