首页 > 系统相关 >基于内存的用户名和密码认证

基于内存的用户名和密码认证

时间:2024-04-20 12:33:17浏览次数:28  
标签:username 用户名 认证 内存 Security password

代码实现

从Spring Security官网文档可以看到,我们想要实现一个基于内存的用户名密码认证,需要编写配置,如下:

在我们的项目中,建立如下项目结构:

我们将Spring Security有关配置全部放置于Security包中。

/**
 * @author 无涯子
 * @date 2024/4/20
 */
@Configuration
public class WebSecurityConfig {

    @Bean
    public UserDetailsService userDetailsService(){
        // 创建内存用户管理器
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();

        // 添加一个用户
        manager.createUser(User.withDefaultPasswordEncoder()
                .username("user").password("password").roles("USER").build());

        return manager;

    }
}

在templates目录下面新建一个index.html,内容如下:

<html xmlns:th="https://www.thymeleaf.org">
<head>
    <title>Hello Security!</title>
</head>
<body>
<h1>Hello Security</h1>
<a th:href="@{/logout}">Log Out</a>
</body>
</html>

启动项目运行:

底层代码分析

UsernamePasswordAuthenticationFilter


从这里的名字可以大概看出会读取表单中usernamepassword两个表单项的值,请求方法是POST在这个类里面有一个方法attemptAuthentication,主要进行尝试去验证。

  • 会查看请求是不是POST,不是会抛出异常
  • 读取usernamepassword,并去掉收尾空格
  • 使用usernamepassword生成一个UsernamePasswordAuthenticationToken对象,主要是用于后面从内存中读取的对象对比
  • authenticate()调用认证方法进行认证

AbstractUserDetailsAuthenticationProvider

我们先看一个继承关系:


这个接口只有一个方法authenticate就是进行认证,我们直接跳转到我们的authenticate

这个方法主要根据我们输入的用户名去查询内存中存储的所有用户信息,查看有没有与用户名匹配的,有就返回,没有则抛出异常。返回的是一个UserDetails类型

我们在我们的配置中创建基于内存管理时候就添加过一个这个类型的用户信息:

loadUserByUsername()方法非常重要,后面我们实现基于数据库的用户认证也会重写这个方法,这个方法就是根据你输入的username查询用户信息,返回一个UserDetails

从内存中找到用户信息后,我们将我们输入的密码与查询出来对象中的密码进行对比:


如果比对成功,认证流程重要的过程就结束了。

标签:username,用户名,认证,内存,Security,password
From: https://www.cnblogs.com/wyzstudy/p/18147569

相关文章

  • APP阿里云一键取号 (一键登陆)php接口-- (阿里云号码认证服务)
    #通过composer安装阿里云SDK"alibabacloud/dypnsapi-20170525":"^1.1.2","alibabacloud/darabonba-openapi":"^0.2.10","alibabacloud/tea-console":"^0.1.0","alibabacloud/tea-utils":"^0......
  • C++六种内存序详解
    前言要理解C++的六种内存序,我们首先须要明白一点,处理器读取一个数据时,可能从内存中读取,也可能从缓存中读取,还可能从寄存器读取。对于一个写操作,要考虑这个操作的结果传播到其他处理器的速度。并且,编译器的指令重排和CPU处理器的乱序执行也是我们需要考虑的因素。 我们先看......
  • [转帖]linux命令top内存显示M兆或者G
     转载自:https://zhuanlan.zhihu.com/p/42665560===============许多Linux命令现在都有使其输出更易于理解的选项。让我们了解一些可以让我们心爱的操作系统更友好的东西。不是每个人都以二进制方式思考,他们不想在大脑中给大数字插入逗号来了解文件的大小。因此,Linux命令......
  • 2024.04.18每日收获之联合体结构体内存分配
    今日学习组内前辈留下的代码,数码管动态扫描显示,发现前辈们用的是联合体定义扫描引脚,如:typedefunion{unsignedchara[2];typedefstruct{unsignedchardata0;unsignedchardata1;}data;}seg;此时数组a[2]和结构体里的data0和data1共用地址空间,修改数组或者data会产生相......
  • 信创里程碑:Tapdata 同时通过华为云 GaussDB 及鲲鹏兼容互认证,全面支持基础设施自主创
    近日,深圳钛铂数据有限公司(以下简称钛铂数据)自主研发的钛铂实时数据平台(TapdataLiveDataPlatform)分别与华为云GaussDB、华为云公有云平台(鲲鹏)完成相互兼容性测试,经功能、性能、安全三轮测试显示,TapdataLiveDataPlatform与二者兼容性良好,系统功能正常,运行稳定,顺利获得华为云......
  • 生态短讯 | Tapdata 与 TDengine 完成产品兼容性互认证,打造物联网实时数据生态
    近月,深圳钛铂数据有限公司(以下简称钛铂数据)自主研发的实时数据平台(TapdataLiveDataPlatform)与北京涛思数据科技有限公司(以下简称涛思数据)自主研发的大数据平台TDengine,已经完成了产品兼容性互认证。经双方团队共同严格测试,TapdataLiveDataPlatform与TDengine共同稳定......
  • asan/gpreftools内存调试简明用法
     启用高版本gccsource/opt/rh/devtoolset-11/enable libasan编译选项makeEXTRA_CFLAGS="-O0-g-fsanitize=address-fsanitize-recover=address-fno-omit-frame-pointer-static-libasan-DBUILD_DEBUG-UDPDK_MALLOC-DRTE_MALLOC_ASAN" gpreftools编译选项makeE......
  • 【python之DRF学习】三大方法之认证
    title:【python之DRF学习】三大方法之认证date:2024-04-1721:00:56星期三updated:2024-04-1721:01:00星期三description:cover:内置三大方法:drf之APIView内部的必须会经过的三大认证/方法:认证、权限、频率一、认证组件1、简介登录认证的限制​认证组件......
  • drf之认证、权限、频率控制、排序、过滤、分页
    【认证】models.py1fromdjango.dbimportmodels234#Createyourmodelshere.5classUser(models.Model):6username=models.CharField(max_length=50)7password=models.CharField(max_length=50)8user_type=models.IntegerFiel......
  • 05-视图类的选择以及认证
    如何选择视图类?视图类如何选择场景举例APIView不会和数据库打交道,不会用到序列化类。发送短信接口,发送邮件接口GenericAPIView需要和数据库以及序列化类打交道,就需要继承它。注册,登录5个视图扩展类单独某一个功能接口(注意:需要搭配GenericAPIView一起使用)单......