SpringSecurity---内存认证和数据库认证

目录

一、内存认证

二、认证逻辑

三、数据库认证(也就是用户名和密码在数据库中寻找)

(1)mapper层

(2)启动类添加扫描注解

(3)编写UserDetailsService实现类


一、内存认证

java 复制代码
@Configuration
public class SecurityConfig {
    //定义认证逻辑
    @Bean
    public UserDetailsService userDetailsService(){
        //使用内存数据进行认证
        InMemoryUserDetailsManager manager=new InMemoryUserDetailsManager();
        //创建两个用户
        UserDetails u1= User.withUsername("root").password("1234").authorities("admin").build();
        UserDetails u2=User.withUsername("gq").password("2222").authorities("admin").build();
        //将这两个用户添加到内存中
        manager.createUser(u1);
        manager.createUser(u2);
        return manager;
    }
    //密码编译器,不解析密码,也就是不加密
    @Bean
    public PasswordEncoder passwordEncoder(){
        return NoOpPasswordEncoder.getInstance();
    }
}

二、认证逻辑

在实际项目中,认证逻辑是需要自定义控制的。将UserDetailsService接口的实现类放入Spring容器即可自定义认证逻辑。InMemoryUserDetailsManager就是UserDetailsService接口的一个实现类,它将登录页传来的用户名密码和内存中用户名密码做匹配认证。当然我们也可以自定义UserDetailsService接口的实现类。

UserDetailsService的实现类必须重写loadUserByUsername方法,该方法定义了具体的认证逻辑,参数username是前端传来的用户名,我们需要根据传来的用户名查询到该用户(一般是从数据库查询),并将查询到的用户封装成一个UserDetails对象,该对象是Spring Security提供的用户对象,包含用户名、密码、权限。Spring Security会根据UserDetails对象中的密码和客户端提供密码进行比较。相同则认证通过,不相同则认证失败。

三、数据库认证(也就是用户名和密码在数据库中寻找)

(1)mapper层

java 复制代码
public interface UserMapper extends BaseMapper<users> {
}

(2)启动类添加扫描注解

java 复制代码
@SpringBootApplication
@MapperScan("com.gq.springsecurity.mapper")
public class SpringsecurityApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringsecurityApplication.class, args);
    }

}

(3)编写UserDetailsService实现类

java 复制代码
@Service
public class UserMapperService implements UserDetailsService {
    @Autowired
    private UserMapper userMapper;
    //自定义认证逻辑
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //构造查询条件
        QueryWrapper<users> wrapper=new QueryWrapper<users>().eq("username",username);
        //查询用户
        users users=userMapper.selectOne(wrapper);
        //封装为UserDetails对象
        UserDetails userDetails= User.withUsername(users.getUsername()).password(users.getPassword()).authorities("admin").build();
        //返回封装好的UserDeatails对象
        return userDetails;
    }
}
相关推荐
某个默默无闻奋斗的人3 分钟前
高性能 MySQL 进阶:索引核心原理、失效场景与底层优化全解
数据库·mysql
极限实验室2 小时前
INFINI Labs 产品更新 - Easysearch 2.1.0 新增高性能 Rules 规则引擎插件,数据探索 Discover 等
数据库·产品
鹿角片ljp4 小时前
苍穹外卖 day05:店铺营业状态设置与Redis入门实战
数据库·redis·缓存
m0_743470375 小时前
使用Python进行PDF文件的处理与操作
jvm·数据库·python
Demon_Hao5 小时前
JAVA通过Redis实现Key分区分片聚合点赞、收藏等计数同步数据库,并且通过布隆过滤器防重复点赞
java·数据库·redis
掘根5 小时前
【微服务即时通讯】消息转发子服务
数据库·oracle
喜欢喝果茶.5 小时前
SQL 预处理
数据库·sql
数据科学小丫6 小时前
Python 数据存储操作_数据存储、补充知识点:Python 与 MySQL交互
数据库·python·mysql
Knight_AL6 小时前
Nacos 启动问题 Failed to create database ’D:\nacos\nacos\data\derby-data’
开发语言·数据库·python
xianjian09128 小时前
MySQL 的 INSERT(插入数据)详解
android·数据库·mysql