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("");
log.info("数据库密码:{}", dbPassword);
MyUser user = new MyUser(username, dbPassword);
return user;
} }

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

Spring Security认证配置(一)

Spring Security认证配置(一)

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

Spring Security认证配置(一)

用户名随便输,密码为1234

上一篇:三、CSS样式——字体


下一篇:iOS端项目注释规范附统一代码块