• 一文搞懂SpringSecurity---[Day04]失败跳转


    一文搞懂SpringSecurity—[Day04]失败跳转

    设置请求账户和密码的参数名

    源码简介

    当进行登录时会执行 UsernamePasswordAuthenticationFilter 过滤器。

    • usernamePasrameter :账户参数名
    • passwordParameter :密码参数名
    • postOnly=true :默认情况下只允许POST请求。

    在这里插入图片描述

    修改配置
    //表单提交
    http.formLogin()
          //自定义登录页面
         .loginPage("/login.html")
          //当发现/login时认为是登录,必须和表单提交的地址一样。去执行UserServiceImpl
         .loginProcessingUrl("/login")
          //登录成功后跳转页面,POST请求
         .successForwardUrl("/toMain")
          //登录失败后跳转页面,POST请求
         .failureForwardUrl("/toError")
         .usernameParameter("myusername")
         .passwordParameter("mypassword");
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    修改login.html
    form action="/login" method="post">
       用户名:<input type="text" name="myusername" /><br/>
       密码:<input type="password" name="mypassword" /><br/>
        <input type="submit" value="登录" />
    </form>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    自定义登录成功处理器

    源码分析

    使用successForwardUrl()时表示成功后转发请求到地址。内部是通过 successHandler() 方法进行控制成功后交 给哪个类进行处理

    在这里插入图片描述

    ForwardAuthenticationSuccessHandler内部就是最简单的请求转发。

    由于是请求转发,当遇到需要跳转到站外或 在前后端分离的项目中就无法使用了。

    在这里插入图片描述

    当需要控制登录成功后去做一些事情时,可以进行自定义认证成功控制器。

    代码实现

    自定义类

    新建类 com.xiaobai.handler.MyAuthenticationSuccessHandler 编写如下:

    package com.example.spring.config;
    
    import org.springframework.security.core.Authentication;
    import org.springframework.security.core.userdetails.User;
    import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * 身份验证成功处理程序
     *
     * @author 爪哇小白2021
     * @date 2022/07/04
     */
    public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
    
        private String url;
    
        public MyAuthenticationSuccessHandler(String url) {
            this.url = url;
        }
    
        @Override
        public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
            //Principal 主体,存放了登录用户的信息
            User user = (User) authentication.getPrincipal();
            System.out.println(user.getUsername());
            //输出null
            System.out.println(user.getPassword());
            System.out.println(user.getAuthorities());
            response.sendRedirect(url);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    修改配置项

    使用 successHandler()方法设置成功后交给哪个对象进行处理

    //表单提交
    http.formLogin()
          //自定义登录页面
         .loginPage("/login.html")
          //当发现/login时认为是登录,必须和表单提交的地址一样。去执行UserServiceImpl
         .loginProcessingUrl("/login")
          //登录成功后跳转页面,POST请求
          // .successForwardUrl("/toMain")
          //和successForwardUrl不能共存
         .successHandler(new MyAuthenticationSuccessHandler("http://www.baidu.com"))
          //登录失败后跳转页面,POST请求
         .failureForwardUrl("/toError")
         .usernameParameter("myusername")
         .passwordParameter("mypassword");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    自定义登录失败处理器

    源码分析 failureForwardUrl()内部调用的是 failureHandler() 方法

    在这里插入图片描述

    ForwardAuthenticationFailureHandler 中也是一个请求转发,并在request 作用域中设置 SPRING_SECURITY_LAST_EXCEPTION 的 key,内容为异常对象。

    在这里插入图片描述

    代码实现

    新建控制器

    新建 com.xiaobai.handler.MyForwardAuthenticationFailureHandler 实现AuthenticationFailureHandler。在方法中 添加重定向语句

    package com.example.spring.config;
    
    import org.springframework.security.core.AuthenticationException;
    import org.springframework.security.web.authentication.AuthenticationFailureHandler;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * 转发处理身份验证失败
     *
     * @author 爪哇小白2021
     * @date 2022/07/04
     */
    public class MyForwardAuthenticationFailureHandler implements AuthenticationFailureHandler {
        private String url;
    
        public MyForwardAuthenticationFailureHandler(String url) {
            this.url = url;
        }
    
        @Override
        public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
            response.sendRedirect(url);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    修改配置类

    修改配置类中表单登录部分。

    设置失败时交给失败处理器进行操作。 failureForwardUrlfailureHandler 不可 共存。

    //表单提交
    http.formLogin()
          //自定义登录页面
         .loginPage("/login.html")
          //当发现/login时认为是登录,必须和表单提交的地址一样。去执行UserServiceImpl
         .loginProcessingUrl("/login")
          //登录成功后跳转页面,POST请求
          // .successForwardUrl("/toMain")
          //和successForwardUrl不能共存
         .successHandler(new MyAuthenticationSuccessHandler("http://www.baidu.com"))
          //登录失败后跳转页面,POST请求
          // .failureForwardUrl("/toError")
         .failureHandler(new MyForwardAuthenticationFailureHandler("/error.html"))
         .usernameParameter("myusername")
         .passwordParameter("mypassword");
    败后跳转页面,POST请求
          // .failureForwardUrl("/toError")
         .failureHandler(new MyForwardAuthenticationFailureHandler("/error.html"))
         .usernameParameter("myusername")
         .passwordParameter("mypassword");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    Go学习笔记 -- 数组和切片
    Vue组件
    Rust常用特型之TryFrom和TryInto特型
    代码随想录二刷 day01 | 704. 二分查找 27. 移除元素 26.删除有序数组中的重复项 80. 删除有序数组中的重复项 II
    3 学习用特殊字符串联命令
    赢麻了!smardaten闷声干大事,竟然用无代码开发了复杂小程序!
    K8S云计算系列-(4)
    对于UDS协议的传输控制协议ISO15765的学习记录
    数据结构——图的遍历
    【Java 基础篇】Java实现文件搜索详解
  • 原文地址:https://blog.csdn.net/m0_56368068/article/details/125612941