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


    目录

    一、内存认证

    二、认证逻辑

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

    (1)mapper层

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

    (3)编写UserDetailsService实现类


    一、内存认证

    1. @Configuration
    2. public class SecurityConfig {
    3. //定义认证逻辑
    4. @Bean
    5. public UserDetailsService userDetailsService(){
    6. //使用内存数据进行认证
    7. InMemoryUserDetailsManager manager=new InMemoryUserDetailsManager();
    8. //创建两个用户
    9. UserDetails u1= User.withUsername("root").password("1234").authorities("admin").build();
    10. UserDetails u2=User.withUsername("gq").password("2222").authorities("admin").build();
    11. //将这两个用户添加到内存中
    12. manager.createUser(u1);
    13. manager.createUser(u2);
    14. return manager;
    15. }
    16. //密码编译器,不解析密码,也就是不加密
    17. @Bean
    18. public PasswordEncoder passwordEncoder(){
    19. return NoOpPasswordEncoder.getInstance();
    20. }
    21. }

    二、认证逻辑

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

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

    image-20220324105909277

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

    (1)mapper

    1. public interface UserMapper extends BaseMapper {
    2. }

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

    1. @SpringBootApplication
    2. @MapperScan("com.gq.springsecurity.mapper")
    3. public class SpringsecurityApplication {
    4. public static void main(String[] args) {
    5. SpringApplication.run(SpringsecurityApplication.class, args);
    6. }
    7. }

    (3)编写UserDetailsService实现类

    1. @Service
    2. public class UserMapperService implements UserDetailsService {
    3. @Autowired
    4. private UserMapper userMapper;
    5. //自定义认证逻辑
    6. @Override
    7. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    8. //构造查询条件
    9. QueryWrapper wrapper=new QueryWrapper().eq("username",username);
    10. //查询用户
    11. users users=userMapper.selectOne(wrapper);
    12. //封装为UserDetails对象
    13. UserDetails userDetails= User.withUsername(users.getUsername()).password(users.getPassword()).authorities("admin").build();
    14. //返回封装好的UserDeatails对象
    15. return userDetails;
    16. }
    17. }

  • 相关阅读:
    一种改进的樽海鞘群算法-附代码
    CASIO虚线替换部分及切线支距法
    【Docker】Dockerfile使用技巧
    ChatGPT在电子健康记录和医疗信息查询中的应用前景如何?
    Spring 循环依赖
    开源在医疗健康领域的应用
    WKB近似
    css总结
    砥砺前行 智领未来 | 美格智能2022年半年度经营管理会议顺利召开
    Redis安装及常用配置
  • 原文地址:https://blog.csdn.net/gaoqiandr/article/details/132965196