Spring Security认证配置(一)

学习本章之前,可以先了解下上篇 Spring Security基本配置

本篇主要讲述Spring Security基于表单,自定义用户认证配置(上篇中的配置,本篇将不再阐述)。一共分为三步:

  1、处理用户信息获取

  2、处理用户校验

  3、处理密码加密解密

 

在配置之前,先熟悉下两个接口:

UserDetailsService

UserDetailsService接口用户返回用户相关数据。它有loadUserByUsername方法,根据用户名查询用户实体,可以实现该接口覆盖该方法,实现

自定义获取用户过程。该接口实现类被DaoAuthenticationProvider类使用,用于认证过程中载入用户信息

UserDetails与DaoAuthenticationProvider类的介绍可以查看AuthenticationManager、ProviderManager

public interface UserDetailsService {
    
    //通过用户名查询user
    UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
    
}

PasswordEncoder

PasswordEncoder是一个关于密码操作的接口,常用的实现类为BCryptPasswordEncoder

复制代码
public interface PasswordEncoder {

    //对rawPassword加密
    String encode(CharSequence rawPassword);

    //判断rawPassword与encodedPassword是否匹配
    boolean matches(CharSequence rawPassword, String encodedPassword);

}
复制代码

 

接下来开始Spring Security自定义用户认证配置:

在SecurityConfig中配置PasswordEncoder

    /**
     * 密码加密(可自定义加密方式)
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

自定义UserDetails的实现类(也可使用UserDetails的默认实现类User)

复制代码
@Getter
@Setter
@AllArgsConstructor
public class MyUser implements UserDetails {

    private static final long serialVersionUID = 1L;

    private String username;

    private String password;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

    @Override
    public boolean isAccountNonExpired() {
        // 账户是否没有过期,默认true
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        // 账户是否没有锁定,默认true
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        // 密码是否没有过期,默认true
        return true;
    }

    @Override
    public boolean isEnabled() {
        // 账户是否可用,默认true
        return true;
    }

}
复制代码

自定义UserDetailsService的实现类

复制代码
@Slf4j
@Service
public class MyUserDetailServiceImpl implements UserDetailsService {

    @Autowired
    private PasswordEncoder passwordEncoder;

    /**
     * 根据username查询用户实体
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        log.info("进来了~");
        
        //密码加密(这里是将密码写死的,真实情况应该是查询数据库)
        String dbPassword = passwordEncoder.encode("1234");
        log.info("数据库密码:{}", dbPassword);
        MyUser user = new MyUser(username, dbPassword);
        return user;
    }

}
复制代码

 

在DaoAuthenticationProvider中设置两个断点,然后启动服务,可以看到Spring Security自动将我们的实现类注入到DaoAuthenticationProvider中:

 

 访问http://localhost:18081/user,跳转到登录页

 用户名随便输,密码为1234

 

 

 

posted @   仅此而已-远方  阅读(4700)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示