• Spring Security 表单登录


    1. 简介

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

    2. Maven 依赖

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

    3. Spring Security Java配置

    我们首先创建一个扩展WebSecurityConfigurerAdapterSpring 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:

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

    原文:www.baeldung.com/spring-secu…

    作者:baeldung

    译者:Leesen

  • 相关阅读:
    跟结束进程相关的那些信号
    tcpdump使用示例
    Linux在bash history当中添加timestamp
    CentOS中在/etc/rc.local添加开机自启动项启动失败
    CentOS配置通过DHCP的方式动态获取IP
    CentOS桌面安装
    MySQL二进制安装
    对okhttp参数的一些思考
    依赖倒置原则(DIP)
    Liskov替换原则(LSP)
  • 原文地址:https://www.cnblogs.com/liululee/p/11043423.html
Copyright © 2020-2023  润新知