数据库动态认证封装用户的代码怎么写
短信预约 -IT技能 免费直播动态提醒
本篇内容介绍了“数据库动态认证封装用户的代码怎么写”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
代码实现
public abstract class AbstractUserDetailsService implements UserDetailsService {
@Autowired
private SysPermissionService sysPermissionService;
public abstract SysUser findSysUser(String usernameOrMobile);
@Override
public UserDetails loadUserByUsername(String usernameOrMobile) throws UsernameNotFoundException {
// 1. 通过请求的用户名去数据库中查询用户信息
SysUser sysUser = findSysUser(usernameOrMobile);
// 通过用户id去获取权限信息
findSysPermission(sysUser);
return sysUser;
}
// 私有的方法,里面放到时重复的代码
private void findSysPermission(SysUser sysUser) {
// 判断该用户是否存在
if(sysUser == null) {
throw new UsernameNotFoundException("用户名或密码错误");
}
// 2. 查询该用户有哪一些权限
List<SysPermission> permissions = sysPermissionService.findByUserId(sysUser.getId());
// 判断该用户拥有的权限是否为空
if(CollectionUtils.isEmpty(permissions)) {
return ;
}
// 将权限设置到该对象中
sysUser.setPermissions(permissions);
// 3. 封装权限信息
List<GrantedAuthority> authorities = Lists.newArrayList();
for(SysPermission sp: permissions) {
// 获取权限标识
String code = sp.getCode();
authorities.add(new SimpleGrantedAuthority(code));
}
// 不需要return,因为是同一个对象
sysUser.setAuthorities(authorities);
}
}
@Component("customUserDetailsService")
//public class CustomUserDetailsService implements UserDetailsService {
public class CustomUserDetailsService extends AbstractUserDetailsService {
Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
PasswordEncoder passwordEncoder;
@Autowired
SysUserService sysUserService;
@Override
public SysUser findSysUser(String usernameOrMobile) {
logger.info("请求认证的用户名: " + usernameOrMobile);
// 1. 通过请求的用户名去数据库中查询用户信息
return sysUserService.findByUsername(usernameOrMobile);
}
}
@Component("mobileUserDetailsService")
public class MobileUserDetailsService extends AbstractUserDetailsService {
Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
SysUserService sysUserService;
@Override
public SysUser findSysUser(String usernameOrMobile) {
logger.info("请求的手机号是:" + usernameOrMobile);
// 1. 通过手机号查询用户信息
return sysUserService.findByMobile(usernameOrMobile);
}
}
注意点
# 抽象类和子类中必须包含如下代码,不能删除,且抽象类和子类中只能有1个类包含该代码
@Autowired
PasswordEncoder passwordEncoder;
“数据库动态认证封装用户的代码怎么写”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341