In Spring Security 5.7.0-M2 we deprecated the WebSecurityConfigurerAdapter, as we encourage users to move towards a component-based security configuration.
——转自 Spring Security without the WebSecurityConfigurerAdapter
上面说明了新版本中已经删除了`WebSecurityConfigurerAdapter`,我们进行相关配置可以使用`HttpSecurity`创建。具体操作如下,自定义`UserDetailsService(框架内置的)` 后,自定义的过程中只需要重写`loadByUsername`方法即可,我们需要在自定义数据源(比如说mysql的某个database)中存储认证信息,认证的时候数据源中寻找就好。在`httpSecurity`中的完成UserDetailServiceFromDB的配置后,框架会自动帮助我们注册一个`DaoAuthenticationProvider`,然后就可以正常的走认证流程了,这点可以从源码中看出来,也可以调试看出来。
具体操作如下图,其实就是一步,下图中的第70行:
![](https://img-blog.csdnimg.cn/img_convert/e1dfe6b6104651ffa211082af6384ee6.jpeg)
UserDetailServiceFromDB类的参考实现如下:
@Service
@Primary
@Slf4j
public class DBUserDetailService implements UserDetailsService {
UserMapper userMapper;
@Autowired
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userMapper.loadUserByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("无法找到用户名");
}
List<Role> roleList = userMapper.getUserRoleByUid(user.getId());
user.setRoles(roleList);
return user;
}
}
userMapper的写法参考如下:
@Mapper
public interface UserMapper {
User loadUserByUsername(String username);
// 你可能需要写其他sql的crud方法,
//但是上面的那个loadUserByUsername方法是我之前参考代码中调用的,所以我写上了。
//大家可以根据需要更改方法名。
}
这个Mapper对应的SQL语句我就不写了。
需要注意的点:上图中User.java类需要实现框架中的自带类UserDetails
public class User implements UserDetails {
// 省略getter和setter方法
Integer id;
String username;
String password;
Boolean enabled;
Boolean accountNonExpired;
Boolean accountNonLocked;
Boolean credentialsNonExpired;
List<Role> roles = new ArrayList<>();
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
// 将查询到List结果转化为Set返回出去。这里采用stream,也可以使用传统的forEach转换
return roles.stream()
.map(role -> new SimpleGrantedAuthority(role.getName()))
.collect(Collectors.toSet());
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
@Override
public boolean isAccountNonExpired() {
return accountNonExpired;
}
@Override
public boolean isAccountNonLocked() {
return accountNonLocked;
}
@Override
public boolean isCredentialsNonExpired() {
return credentialsNonExpired;
}
@Override
public boolean isEnabled() {
return enabled;
}
}