小工具      在线工具  汉语词典  css  js  c++  java

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

# Spring,spring,java,spring boot,spring security 额外说明

收录于:152天前

事情是这样的,在学习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. 实现安全配置类
@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地址,安全框架的会话代理接口为doLogin,因此框架实现了会话状态的记录。

请添加图片描述

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

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

还有一些问题需要注意:

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

第四个小徐还没看懂,但是我尝试了一下,注释掉代码后确实报了302的错误。我学习后会更新的。

. . .

相关推荐

额外说明

SQLSERVER2012备份日志报错:”读取失败: 23(数据错误(循环冗余检查)

问题: SQLSERVER2012数据库,8月6日的LOG自动备份出现问题,之前备份一直正常,报错如下: 失败:(-1073548784) 执行查询“BACKUP LOG [chenjchdb] TO  DISK = N'E:\\chen_...”失败,

额外说明

JVM13_跨平台,字节码文件的前端编译器,什么是字节码指令

文章目录 ①. 字节码文件的跨平台性(了解) ②. Java的前端编译器(了解) ③. 透过字节码指令看代码细节 ④. 如何解读供虚拟机解释执行的二进制字节码? ⑤. 什么是字节码指令 ①. 字节码文件的跨平台性(了解) ①. Java语言:跨平台的语言

额外说明

Python每日一练——列表,元组和字典第十一关:del和pop的用法

面试题第十一关: 第一部分——考点: del的用法 pop的用法 第二部分——面试题: 1.面试题一:del和pop都可以用来删除列表元素,那么它们有什么区别呢 第三部分——解析: 面试题一 之 del和pop都可以用来删除列表元素,那么它们有什么区别呢

额外说明

《Spring MVC》 第五章 实现RESTful

系列文章目录 第一章 MVC模式 第二章 让程序run起来 第三章 @Controller、@RequestMapping 注解和获取请求参数 第四章 域对象、视图、转发和重定向 第五章 第五章 实现RESTful 第六章 MVC类型转换器、格式化器 第

额外说明

vscode配置react样式模块化开发代码提示

一、配置css模块化的代码提示 1、关于css模块化开发可以参考文档,参考文档,这样写代码没样式名的提示也不是很友好的,以下配置可以提示类名的方式 2、安装依赖包 npm install typescript-plugin-css-modules -D

额外说明

keras入门 ---用预训练好网络模型的bottleneck特征

在深度学习的学习过程中,我们可能会用到一些已经训练好的模型,比如 Alex Net, google net, VGG net, ResNet等,那我们怎么使用这些已经训练好的模型呢? 在这篇博客中,我们使用已经训练好的VGG16模型来帮助我们进行这个分类

额外说明

AQS同步组件-Semaphore(信号量)解析和案例

基本概念 Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制并发访问资源的线程个数。 例如排队买票的情况,如果只有三个窗口,那么同一时间最多也只能有三个人买票。第四个人来了之后就必

额外说明

AVPlayer进行IOS视频开发的基本使用

1.名词解释:(1)AVPlayer负责控制播放(管理和调节) 使用AVPlayer时需要注意的是,AVPlayer本身不能显示视频,而是AVPlayerLayer显示视频。 AVPlayerLayer继承自CALayer,添加到view.layer后即

额外说明

【24种设计模式】责任链模式

责任链模式是一种行为设计模式,允许您沿着处理链传递请求,直到处理程序能够处理该请求。此模式将请求的发送者和接收者解耦,使多个对象有机会处理请求。 责任链模式的结构 责任链模型由以下角色组成: 抽象处理程序(Handler):定义处理请求的接口,并维护下一

ads via 小工具