十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本篇内容介绍了“数据库动态认证封装用户的代码怎么写”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
创新互联公司主营辰溪网站建设的网络公司,主营网站建设方案,成都app软件开发公司,辰溪h5成都微信小程序搭建,辰溪网站营销推广欢迎辰溪等地区企业咨询
代码实现
/** * 创建1个抽象类 * 将代码重复部分放到抽象类中 * 代码不同的部分,让其他类继承该抽象类重写 */ public abstract class AbstractUserDetailsService implements UserDetailsService { @Autowired private SysPermissionService sysPermissionService; /** * 这个方法交给子类去实现它,查询用户信息 * @param usernameOrMobile 用户名或者手机号 * @return */ 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. 查询该用户有哪一些权限 Listpermissions = sysPermissionService.findByUserId(sysUser.getId()); // 判断该用户拥有的权限是否为空 if(CollectionUtils.isEmpty(permissions)) { return ; } // 将权限设置到该对象中 sysUser.setPermissions(permissions); // 3. 封装权限信息 List 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;
“数据库动态认证封装用户的代码怎么写”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!