Spring Security配置访问权限在登录页循环并报错302

2023-05-16

事情是这样的,在学习Spring Security框架时,使用框架默认的登录页面,没有任何问题输入正确的账户和密码后都能登录,但是将登录页面换为自定义的页面后就无法登录了。如下:

请添加图片描述
密码账户密码肯定时没有问题的,看配置源码如下:

  1. 自定义的表单
    <form action="/index" method="post" class="form">
        Username: <input type="text" name="username"><br>
        Password: <input type="password" name="password"><br>
        <button type="submit">提交</button>
    </form>
  1. 实现Security配置类
@Configuration
public class SecurityConfig2 extends WebSecurityConfigurerAdapter {

	//内存存储用户和密码,模拟数据库查数据
    @Bean
    public UserDetailsService userDetailsService(){
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("admin").password(encoder().encode("123")).authorities("role").build());
        return manager;
    }

    /**
     * 配置拦截机制
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        		//所有地址均开启登录认证
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                //开启表单认证
                .formLogin()
                //配置登录页面,无该配置会使用框架自带页面
                .loginPage("/static/login.html")
                //设置登录成功跳转资源地址
                .defaultSuccessUrl("/index")
                //登录失败地址
                .failureUrl("/static/login.html")
                .permitAll()
                .and()
                //禁用 CSRF 防御功能
                .csrf().disable();
        ;
    }


    //密码加密工具类
    @Bean(name = "passwordEncoder")
    PasswordEncoder encoder(){
        return  new BCryptPasswordEncoder();
    }
}

在输入正确账户和密码后如上图所示,无法正常跳转,首先排除的用户名及密码错误问题,因为使用devtool工具,查看返回的状态码为302,资源被拦截了,如下:

在这里插入图片描述

回顾登录逻辑,输入任何地址都会跳转到/static/login.html页面,进行登录验证。输入用户名和密码后,表单将提交到/index,并返回该页面的内容。

问题就出现在这里,跳转到登录页面没错,但是会话没有被记录呀,在之前的默认登陆页面,会话是默认记录的。而_小许_是直接提交到/index下,会话没有被记录,因此index被拦截由返回到登录页面,这里陷入了四循环,就出现了文章开头的一幕。那么如何解决该问题呢?

记录会话状态

Spring Security框架自动实现了会话状态的记录,不需要开发者自定义实现,只需以接口形式调用即可。

loginProcessingUrl是会话状态的代理接口,在配置HttpSecurity时将登录的数据转发到该接口即可,地址也是由开发者自行定义。如下:

protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/static/login.html")
            //会话状态代理接口
            .loginProcessingUrl("/doLogin")
            .defaultSuccessUrl("/index")
            .failureUrl("/static/login.html")
            .permitAll()
            .and()
            .csrf().disable();
}
<form action="/doLogin" method="post" class="form">
    Username: <input type="text" name="username"><br>
    Password: <input type="password" name="password"><br>
    <button type="submit">提交</button>
</form>

表单的认证地址为doLogin地址,security框架的会话代理接口为doLogin,于是框架实现了会话状态的记录。

请添加图片描述

经过此配置后就可以访问了。有时访问的路径不对还会出现404,可以通过successForwardUrl强制转到配置的主页面。

配置登录成功跳转目录的方法由两个defaultSuccessUrl successForwardUrl,它们的区别是前者在访问的是否为参数配置的页面进行跳转。例如,在访问 http://localhost:8080/hello时,defaultSuccessUrl配置额index,那么将会返回到hello,uri的优先级高;successForwardUrl无论地址栏输入的是什么都会返回配置的参数的资源。

还需要注意一下问题:

  1. form表单提交和成功页面跳转必须是post请求;
  2. 表单提交必须转到loginProcessingUrl,否则会返回302;
  3. loginPage方法配置自定义页面,也可以通过控制器返回页面;
  4. 关闭.csrf().disable()

第4个_小许_还不懂哈,但是尝试过,注释该代码后确实也报错302,以后学习到了再更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Security配置访问权限在登录页循环并报错302 的相关文章

随机推荐

  • Swift编程语言 FAQ

    作为苹果在WWDC 2014上发布的新编程语言 xff0c Swift绝对是当前的热门话题 Swift由苹果开发者工具部门总监克里斯 拉特纳 xff08 Chris Lattner xff09 耗时四年开发而成 xff0c 苹果宣称Swif
  • 简单理解混淆矩阵—Matlab详细代码注解

    本人计算机小白一枚 xff0c 将自己学到的知识点整理出来 xff0c 一方面是对自己学习的小总结 xff0c 另一方面是欢迎大家批评指正 如果觉得写得还可以 xff0c 大家可以转发关注此博客 xff0c 谢谢 xff01 后续会有新算法
  • ubuntu下/boot空间被占满的解决方法

    ubuntu下 boot空间被占满的解决方法 在安装Ubuntu的时候 xff0c 给 boot文件目录分配空间的时候 xff0c 是100M xff0c boot可以单独分成一个区 xff0c 也可以不单独分 xff0c 在 xff08
  • scikit-learn sklearn 0.18 官方文档中文版

    本人计算机小白一枚 xff0c 将自己学到的知识点整理出来 xff0c 一方面是对自己学习的小总结 xff0c 另一方面是欢迎大家批评指正 如果觉得写得还可以 xff0c 大家可以转发关注此博客 xff0c 谢谢 xff01 后续会有新算法
  • 机器学习面试问题汇总—史上最详细

    本人计算机小白一枚 xff0c 将自己学到的知识点整理出来 xff0c 一方面是对自己学习的小总结 xff0c 另一方面是欢迎大家批评指正 如果觉得写得还可以 xff0c 大家可以转发关注此博客 xff0c 谢谢 xff01 后续会有新算法
  • 从第一个人开始报数(从1到3报数),凡报到3的人退出圈子

    有n个人围成一圈 xff0c 顺序排号 从第一个人开始报数 xff08 从1到3报数 xff09 xff0c 凡报到3的人退出圈子 xff0c 问最后留下的是原来第几号的那位 xff08 1 lt 61 n lt 61 1000000 xf
  • Windows10 Xrdp远程桌面连接ubuntu 20.04,一步到位!

    https blog csdn net avinswang article details 93601312 utm medium 61 distribute pc relevant none task blog BlogCommendFr
  • 远程桌面无响应解决方案

    问题1 mstsc链接远程桌面后 发现只有桌面背景 xff08 桌面图标不见了 xff0c 任务栏不见了 xff0c 鼠标无处可点 xff09 问题2 远程桌面卡住了 问题分析 针对于问题1 xff0c 是因为关闭了explorer exe
  • 公用网络切换为专用网络的详细步骤

    win10连接的网络显示为公用网络 xff0c 一般来说公用网络的安全性不高 xff0c 专用网络安全性会比公用网络要高 具体方法如下 1 我的电脑安装的是win10系统 xff0c 网络状态为 xff1a 公用网络 2 把Windows1
  • mysql使用SSL连接配置学习(一)

    参考 xff1a https www jb51 net article 100432 htm https www cnblogs com mysql dba p 7061300 html 一 SSL介绍 SSL xff08 Secure S
  • 富文本回显

    今天遇了富文本的回显问题 xff0c 查了好多网页 xff0c 最后总结回显最简单方法 xff0c 留个纪念 lt c forEach items 61 34 bidNoticeList 34 varStatus 61 34 status
  • 弹出详细信息窗口

    lt DOCTYPE html PUBLIC 34 W3C DTD HTML 4 01 Transitional EN 34 gt lt html gt lt head gt lt meta charset 61 34 GB 2312 34
  • 字符串中特殊字符处理

    public String htmlReplace String str str 61 str replace 34 amp ldquo 34 34 34 str 61 str replace 34 amp rdquo 34 34 34 s
  • Android开发环境配置

    环境为jdk11 43 android studio2021 jdk11的安装 xff1a 参考https blog csdn net qq 22136439 article details 103295019 注意 xff1a 1 jdk
  • java中文字符乱码编码转换大全

    System out println new String myFileName getBytes 34 gbk 34 System out println new String myFileName getBytes 34 utf 8 3
  • java实现打印套打功能

    package test import java awt print import java awt 实现套打 xff0c 把套打的格式当成一张图片 xff0c 将要填入的数据按其在图片在坐标来定位 public class PrintTe
  • oracle中not in的优化

    ORACLE中NOT IN 的替代 http myjcwy iteye com blog 553563 典型的查询方式为 xff1a SELECT TITLE FROM BOOKSHELF WHERE TITLE NOT IN SELECT
  • Visual Stdio 中的error C2001: 常量中有换行符

    error C2001 常量中有换行符 问题 xff1a 使用Visual Stdio xff0c cout中文的时候 xff0c 有的时候可以正常编译并运行 xff0c 但是有的时候会出现error C2001 常量中有换行符 出现err
  • oracle实现每天定时执行一个计划任务

    http www shangxueba com jingyan 1614101 html oracle实现每天定时执行一个计划任务 创建测试表 SQL gt create table a a date 表已创建 创建一个自定义过程 SQL
  • Spring Security配置访问权限在登录页循环并报错302

    事情是这样的 xff0c 在学习Spring Security框架时 xff0c 使用框架默认的登录页面 xff0c 没有任何问题输入正确的账户和密码后都能登录 xff0c 但是将登录页面换为自定义的页面后就无法登录了 如下 xff1a 密