首页 > 其他分享 >04、SpringSecurity系列,第二章:RememberMe 和 异常处理

04、SpringSecurity系列,第二章:RememberMe 和 异常处理

时间:2024-12-13 16:59:03浏览次数:8  
标签:password http 04 登录 默认 SpringSecurity RememberMe login 表单

SpringSecurity系列,第二章:RememberMe 和 异常处理

一、RememberMe

RememberMe这个功能,是为了方便用户在下次登录时直接登录。避免再次输入 用户名 和 密码。

下面我们记录下如何使用RememberMe这个功能的。

1、修改login.html页面

添加remember-me,注意:字段的name必须是remember-me

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
    <h1>登陆</h1>
    <form method="post" action="/login">
        <div>
            用户名:<input type="text" name="username">
        </div>
        <div>
            密码:<input type="password" name="password">
        </div>
        <div>
            <label><input type="checkbox" name="remember-me">记住密码</label>
        </div>
        <div>
            <button type="submit">登陆</button>
            <button type="reset">重置</button>
        </div>
    </form>
</body>
</html>

2、两种存储登录信息方式

2.1、Cookie存储

这种方式只需在配置类中的Configure()方法添加rememberMe()即可

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()

                .formLogin()
                    .loginPage("/login.html") //用户未登录时,访问资源都跳转到该页面,登录页面
                    .loginProcessingUrl("/login")//登录表单,form中的action地址,也就是处理认证请求的路径
                    .usernameParameter("username")//登录表单,form中用户名input框的name名,默认是username
                    .passwordParameter("password")//登录表单,form中密码input框的password名,默认是password
                    .defaultSuccessUrl("/")//登录成功后,默认跳转的路径
                    .permitAll()

                .and()
                .logout().permitAll()

                .and()
                .rememberMe();//记住账号和密码

        //关闭csrf跨域
        http.csrf().disable();

    }

当我们登录勾选remember-me后,会自动在Cookie中保存一个为remember-me的cookie。

默认有效期为2周,其值是一个加密字符串

在这里插入图片描述

2.2、数据库存储

使用COOKIE存储用户信息固然很方便,但是COOKIE毕竟是保存在客户端的,而且cookie的值还与用户名、密码这些敏感数据相关,虽然加密了,但是将其存在客户端,毕竟不太安全

Spring Security还提供了另一种相对安全的机制:在客户端的cookie中,进保存一个无意义的加密串(与用户名、密码等无关),然后在数据库中保存该加密串 与 用户信息的 对应关系,自动登录时,用cookie中的加密串,到数据库中验证,如果通过则自动登录。

原理:

浏览器发起表单登录请求时,当通过UsernamePasswordAuthenticationFilter认证成功后,会经过RememberMeService,在其中有一个TokenRepository,它会生成一个token,首先将token写入到浏览器的cookie中,然后将token、认证成功的用户名写入数据库。

在浏览器进行下次请求时,会经过RememberMeAuthenticationFilter,它会读取cookie中的token,交给RememberMeService从数据库中查询记录。如果存在记录,会读取用户名并去调取UserDetailsService,获取用户信息,并将用户信息放到Spring Security中,实现自动登录。

在这里插入图片描述

RememberMeAuthenticationFilter在整个SpringSecurity的过滤链中是比较靠后的,也就是说在传统的登录方式都无法通过后才会使用自动登录。

在这里插入图片描述

2.2.1、创建表存储Token
DROP TABLE IF EXISTS `persistent_logins`;
CREATE TABLE `persistent_logins` (
  `username` varchar(64) NOT NULL,
  `series` varchar(64) NOT NULL,
  `token` varchar(64) NOT NULL,
  `last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`series`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.2.2、在配置文件中注入PersistentTokenRepository

在WebSecurityConfig配置类中添加如下:

@Autowired
private DataSource dataSource;

@Bean
public PersistentTokenRepository persistentTokenRepository(){
    JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
    tokenRepository.setDataSource(dataSource);

    return tokenRepository;
}

Configure中配置自动登录

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .anyRequest().authenticated()
        .and()

        .formLogin()
        .loginPage("/login.html") //用户未登录时,访问资源都跳转到该页面,登录页面
        .loginProcessingUrl("/login")//登录表单,form中的action地址,也就是处理认证请求的路径
        .usernameParameter("username")//登录表单,form中用户名input框的name名,默认是username
        .passwordParameter("password")//登录表单,form中密码input框的password名,默认是password
        .defaultSuccessUrl("/")//登录成功后,默认跳转的路径
        .permitAll()

        .and()
        .logout().permitAll()

        .and()
        .rememberMe()//记住账号和密码
        .tokenRepository(persistentTokenRepository());//tokenRepositoryBean 去数据库中查找RememberMe信息

    //关闭csrf跨域
    http.csrf().disable();

}

在这里插入图片描述

在这里插入图片描述

二、异常处理

当我们登录失败是,Spring Security会帮我们跳转到 http://127.0.0.1:8081/login.html?error 。这是Spring Security默认的失败URL。如果我们不手动处理这个异常,这个异常是不会被处理的。

1、常见的异常

一下的异常都是AuthenticationException的子类

UsernameNotFoundException 用户不存在

DisabledException         用户被禁用

BadCredentialsException   坏的凭据

LockedException           账户被锁定

AccountExpireException    账户过期

CredentialsExpiredException凭据过期

...

在这里插入图片描述

2、异常处理内部流程

(1)在AbstractAuthenticationProcessingFilter类的doFilter方法中,我们发现,出现异常后,它会调用unsuccessfulAuthentication()方法

在这里插入图片描述

(2)在unsuccessfulAuthentication()方法中,它将异常交给了SimpleUrlAuthenticationFailureHandler类的onAuthenticationFailure()方法处理

在这里插入图片描述

(3)在onAuthenticationFailure()方法中,首先会判断defaultFailureUrl是否存在,

若果不存在,直接返回401 Unauthorized

如果存在,先存储异常saveException,然后判断forwardToDestination ,是否服务器跳转,默认为false,直接重定向到defaultFailureUrl

saveException,则默认将Exception存储到Session中

在这里插入图片描述

3、处理异常

由上分析可知,我们需要配置一下defaultFailureUrl。只要指定错误的URL即可。

(1)指定错误URL,在WebSecurityConfig中添加failureUrl

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .anyRequest().authenticated()
        .and()

        .formLogin()
        .loginPage("/login.html") //用户未登录时,访问资源都跳转到该页面,登录页面
        .loginProcessingUrl("/login")//登录表单,form中的action地址,也就是处理认证请求的路径
        .usernameParameter("username")//登录表单,form中用户名input框的name名,默认是username
        .passwordParameter("password")//登录表单,form中密码input框的password名,默认是password
        .defaultSuccessUrl("/")//登录成功后,默认跳转的路径
        .failureUrl("/login/error")//登录失败URL
        .permitAll()

        .and()
        .logout().permitAll()

        .and()
        .rememberMe()//记住账号和密码
        .tokenRepository(persistentTokenRepository());//tokenRepositoryBean 去数据库中查找RememberMe信息

    //关闭csrf跨域
    http.csrf().disable();

}

(2)Controller中处理异常

@ResponseBody
@GetMapping("/login/error")
public String loginError(HttpServletRequest req, HttpServletResponse resp){
    AuthenticationException excp = 
        (AuthenticationException) req.getSession().getAttribute("SPRING_SECURITY_LAST_EXCEPTION");
    return "异常信息为:"+excp.getMessage();
}

在这里插入图片描述

标签:password,http,04,登录,默认,SpringSecurity,RememberMe,login,表单
From: https://blog.csdn.net/pilot_speed/article/details/144454932

相关文章

  • [Ubuntu] linux之Ubuntu18.04的下载及在虚拟机中详细安装过程(附有下载链接)
     前言ubuntu链接:https://pan.quark.cn/s/283509d0d36e提取码:dfT1链接失效(可能被官方和谐)可评论或私信我重发下载压缩包后解压!!安装路径不要有中文下载后解压得到.iso文件,不要放在有中文路径的目录下,我这里是解压放在E盘下打开虚拟机,这里使用的是VMwareWorkstat......
  • 达梦DOTNET驱动DM.Provider8.3.1.30495存在空字符串插入变DBNull的问题
    达梦数据库的DOTNET驱动DM.Provider,这个版本8.3.1.30495有bug,会把空字符串改成DBNull处理,反编译代码发现Dm.DmSetValue.SetString方法中判断字符串长度==0就设置成DBNull。解决办法就是降低版本到8.3.1.28188。//Dm.DmSetValueusingSystem;usingSystem.Globalization;usi......
  • SPUtils.18604360
    importandroid.content.Context;importandroid.content.SharedPreferences;importcom.google.gson.Gson;importcom.google.gson.reflect.TypeToken;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importjava.lang.reflec......
  • 永中office 2024 9.0.5004----函数图像Office
    永中office2024是一款办公Office软件,可以解锁所有基本的功能,说一点他独有的功能,就是函数图形。可以根据函数,选择对应的曲线,在word和excel绘制函数图形,解决了数学、屋里、化学等科目的函数绘制问题,可以给自己的出轨女友安排一个。【核心功能】1.函数图像2.AI功能--需登录百......
  • Ubuntu 20.04虚拟机无法上网,无法访问主机
    查版本Ubuntu基于Debian发行版和GNOME桌面环境Xubuntu(发音为ZOO-bun-too)是一个UbuntuLinux的官方派生版,它基于桌面环境Xfce,主要运行基于GTK+的程序,面向旧式电脑的用户和寻求更快捷的桌面环境的用户。它与Ubuntu不完全相同,但使用Ubuntu的高质量软件源。/etc/netplan/文件夹下的......
  • 题解:P10423 [蓝桥杯 2024 省 B] 填空问题
    思路试题A因为每个人都要与除了自己外的每个人握手,那么每个人都会握\(49\)次手,一共\(50\times49\)次。但由于\(A\)和\(B\)都会互相主动握手,所以每两个人会握两次,最终应该是\(\dfrac{50\times49}{2}\)次。但题目说了有\(7\)个人不会相互握手,我们再减去这些人互......
  • JC4004 Computational Intelligence
    Programmingassignment–Groupworkbyateamof4-5studentsTitle:JC4004–ComputationalIntelligenceNote:Thisassignmentaccountsfor30%ofthetotalmarkofthecourse.Deadline:SubmittheassignmentinMyAberdeenby19.December2024at23:00(C......
  • AbMole| NPPB(CAS号107254-86-4;目录号M7041)
    NPPB(Hoechst144;HOE144)是一种非特异性氯离子通道(chloridechannel)阻滞剂,IC50为80nM。同时能以可逆的,剂量依赖性的方式阻断IK(Ca)电流,在HL-60和GL-15细胞中的IC(50)为39μM和125μM。此外,NPPB还能减少AFB细胞的迁移,其IC50值为53.09μM。生物活性NPPB(Hoechst144;HO......
  • 在Ubuntu 20.04系统上装Windows 10系统组成双系统
    在Ubuntu20.04系统上装Windows10系统组成双系统文章目录前言一、查看磁盘空间二、数据备份1.备份数据2.恢复数据三、划分磁盘空间1.下载Gparted2.制作Ubuntu启动盘3.划分磁盘空间四、安装Windows10系统五、重建引导前言由于工作需要,需要在一台Ubuntu20.04系......
  • Cursor安装配置经验 (Win11, Ubuntu20.04)
    一.安装1.下载去官网https://www.cursor.com/,在win打开的直接出现的是Downloadforwindows,在linux打开的直接出现的是Downloadforlinux.总之,点击下载即可.2.安装win安装:右键管理员身份运行即可,选项都选默认的选项就Ok,然后就直接使用.linux安装:参考官方......