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

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

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

收录于:17天前

事情是这样的,在学习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的错误。我学习后会更新的。

. . .

相关推荐

额外说明

商城项目03_人人网前后端工程、逆向工程、通用工程建设、优惠券及各类微服务工程建设

文章目录 ①. 人人前后端项目 ②. 人人项目-逆向工程 ③. common工程搭建 ④. coupon、member、ware、order代码导入 ①. 人人前后端项目 ①. 在码云上搜索人人开源,我们使用renren-fast(后端)、renren-

额外说明

【Unity面试篇】Unity 面试题总结甄选 |热更新与Lua语言 | ❤️持续更新❤️

前言 关于Unity面试题相关的所有知识点:-‍-2023年Unity面试题大全,共十万字面试题总结【收藏一篇足够面试,持续更新】 为了方便大家可以重点复习某个模块,所以将各方面的知识点进行了拆分并更新整理了新的内容,并对之前的版本中有些模糊的地方进行了

额外说明

【Unity3D 灵巧小知识点】 | 使用宏定义和Application.platform判断运行平台

Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方

额外说明

求众数——摩尔投票法

169. 多数元素 - 力扣(LeetCode)    将第一个元素设为标志初始值,标志数量设为1 遍历元素,当元素与标志值不同时标志值--,相同时++ 当标志值--时,判断标志值是否=0,等于零更换标志为nums[i],数量置1. 最后返回的标志即大于

额外说明

Android R: mFocusedWindow和mFocusedApp更新流程

Android R: mFocusedWindow和mFocusedApp更新流程 有些场景下会根据mFocusedWindow和mFocusedApp做一下开发。 所以,分析mFocusedWindow和mFocusedApp更新流程还是有必要的。 1

额外说明

Vaadin介绍与开发练习之一(总体介绍与创建项目)

文章目录 Vaadin是什么? Vaadin与JavaScript区别 Vaadin与Java以及GWT的关系 总结 Vaadin 初貌 Vaadin提供的组件 Vaadin 开发概述 创建Vaadin项目 开发参考 Vaadin是什么? Vaadin是

额外说明

《Leaflet 基础知识点》- 原生控件 - 缩放控件、属性控件、图层控件、比例尺控件

官网 写此文章时,使用的 1.7.1  一、缩放控件 Control.Zoom   option.zoomcontrol 在初始化 L.map 时,默认显示 true。效果在 属性控件 中有。 二、属性控件 Control.Attribution   o

额外说明

《实战:如何搭建一个完整的 Vue2.0 项目》- 1、构建项目

这是新环境下重新创建的项目 《实战:如何搭建一个完整的 Vue2.0 项目》- 1、构建项目(基于 Vue2.6.14) 环境版本 @vue/cli 4.5.12 node 14.15.4 npm 6.14.10 1、命令 vue create weba

额外说明

系统缺失mfcm120.dll文件导致游戏软件无法启动怎么办?

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个mfcm120.dll文件(

ads via 小工具