spring security无WebSecurityConfigurerAdapter如何自定义数据源配置

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行:

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;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值