本篇内容介绍了“数据库动态认证封装用户的代码怎么写”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
代码实现
/** * 创建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. 查询该用户有哪一些权限 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;
“数据库动态认证封装用户的代码怎么写”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。