麒麟v10 上部署 TiDB v5.1.2 生产环境优化实践
655
2023-11-12
本篇内容介绍了“数据库动态认证封装用户的代码怎么写”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
代码实现
/** * 创建1个抽象类 * 将代码重复部分放到抽象类中 * 代码不同的部分,让其他类继承该抽象类重写 */ public abstract class AbstractUserDetailsService implements UserDetailsService {@Autowired private SysPermissionService sysPermissionService; /** * 这个方法交给子类去实现它,查询用户信息 *@param usernameOrMobile 用户名或者手机号 * @return */ public abstractSysUserfindSysUser(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 newUsernameNotFoundException("用户名或密码错误"); } // 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(newSimpleGrantedAuthority(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. 通过请求的用户名去数据库中查询用户信息 returnsysUserService.findByUsername(usernameOrMobile); } }@Component("mobileUserDetailsService") public class MobileUserDetailsService extends AbstractUserDetailsService { Logger logger = LoggerFactory.getLogger(getClass()); @AutowiredSysUserService sysUserService;@Override public SysUser findSysUser(String usernameOrMobile) { logger.info("请求的手机号是:" + usernameOrMobile); // 1. 通过手机号查询用户信息 returnsysUserService.findByMobile(usernameOrMobile); } }注意点
# 抽象类和子类中必须包含如下代码,不能删除,且抽象类和子类中只能有1个类包含该代码 @Autowired PasswordEncoder passwordEncoder;“数据库动态认证封装用户的代码怎么写”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。