01-springsecurity数据库登录

01 - SpringSecurity实现数据库登录

环境: springboot 3.4.2, springsecurity 6.4.2, mybatis 3.0.4

  • springsecurity中的UserDetails接口用于表示用户信息, 包含用户名、密码等信息。

  • UserDetailsService接口用于加载用户信息, 里边就这一个方法

    public interface UserDetailsService {
        UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
    }
    

    SpringSecurity的过滤器链(FilterChainProxy)会拦截请求。登陆时主要的过滤器是UsernamePasswordAuthenticationFilter, 它负责处理用户名和密码的认证(从请求中提取用户名和密码,并将其封装为一个 UsernamePasswordAuthenticationToken 对象, 然后交由security内其他filter使用)。

    具体内部过程还是挺长的, 那我们能为springsecurity做什么呢?

    能做的不多, 主要是自定义一个类实现UserDetailsService接口, 重写它的loadUserByUsername方法, 我这里的UserService接口继承了UserDetailsService

该方法根据name从数据库中找到对应用户, 将其封装成一个User对象(注意这里的User类不是自己定义的, 而是SpringSecurity的User类, 它是UserDetails的实现类), 最后将这个对象返回给SpringSecurity。

SpringSecurity内部根据我们返回的userDetails对象和用户输入的用户名密码比对(当然中间也会有用户权限的审查, 也就是UserDetails里那些boolean方法的调用), 如果都通过了, 返回响应成功。

这里还要写一个SecurityConfig配置类, 注入PasswordEncoderBean, springsecurity内部会调用passwordEncoder将用户输入的密码进行加密, 将加密后的密码与我们返回的userDetails对象的密码比较(数据库中密码存的是密文, 密文和密文比较, 没毛病)。


总之, springsecurity有自己的一套用户概念, 自己的规则, 我们也可以自定义UserDetails的实现类, 将自己定义的User对象聚合进去。

然后loadUserByUsername方法返回自定义的类的对象


问题:

loadUserByUsername方法是根据用户输入的用户名从数据库中找对应的用户的, 如果重名怎么办?

  1. 不允许用户名重名, 注册时规定好。
  2. 允许重名, 但该方法的参数采用唯一标识如email、phone, 根据唯一标志从数据库中查找对应用户。
posted @ 2025-02-22 19:26  LH寒酥  阅读(46)  评论(0)    收藏  举报