SpringSecurity中的UserDetails和UserDetailsService接口详解
作者:杜小舟
这篇文章主要介绍了SpringSecurity中的UserDetails和UserDetailsService接口详解,UserDetailsService 在 Spring Security 中主要承担查询系统内用户、验证密码、封装用户信息和角色权限,需要的朋友可以参考下
UserDetails
UserDetails 在 Spring Security 框架中主要担任获取用户信息的接口,通过该接口就能拿到用户的信息和验证用户的信息,这些信息在下面的方法中会有讲述。
UserDetails 接口中各个方法详解
| 方法名 | 作用 | 
| Collection<? extends GrantedAuthority> getAuthorities() | 授予用户的权限 | 
| String getPassword() | 用户的密码(当前密码是经过加密后的) | 
| String getUsername() | 用户名 | 
| boolean isAccountNonExpired() | 用户的账号是否过期 true 未过期 false 已过期  | 
| boolean isAccountNonLocked() | 用户的账号是否被锁定 true 未被锁定 false 被锁定  | 
| boolean isCredentialsNonExpired() | 用户的凭据(密码)是否已过期 true 未过期 false 已过期  | 
| boolean isAccountNonExpired() | 用户是否启用 true 启用 false 禁用  | 
UserDetailsService
UserDetailsService 在 Spring Security 中主要承担查询系统内用户、验证密码、封装用户信息和角色权限。
大白话就是你写一个实现类实现 UserDetailsService 接口,在这个实现类中去查询数据库中的用户,并封装成一个实现了 UserDetails 接口的实体类模型。
UserDetailsService 具体操作
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.security.mysql.dao.UserDao;
import com.security.mysql.entity.UserEntity;
import com.security.user.UserDetailsInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class UserDetailsServiceImpl implements UserDetailsService {
	// TODO 这里改成你自己的服务或者Dao查询
    @Autowired
    private UserDao userDao;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        log.info("进入 loadUserByUsername ...");
        // TODO 查询系统内的用户
        LambdaQueryWrapper<UserEntity> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserEntity::getUsername, username);
        UserEntity userEntity = userDao.selectOne(wrapper);
        if (userEntity == null) {
            // 未查询到用户
            throw new RuntimeException("not find user");
        }
		// TODO 封装成实现了 UserDetails 接口的实体类模型
        return UserDetailsInfo.builder()
                .id(userEntity.getId())
                .username(userEntity.getUsername())
                .password(userEntity.getPassword())
                .build();
    }
}
UserDetailsService 方法介绍
| 方法名 | 作用 | 
| UserDetails loadUserByUsername(String username) | 根据用户名加载用户信息 | 
到此这篇关于SpringSecurity中的UserDetails和UserDetailsService接口详解的文章就介绍到这了,更多相关UserDetails和UserDetailsService接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
