数据库动态认证封装用户的代码怎么写

59次阅读
没有评论

共计 2423 个字符,预计需要花费 7 分钟才能阅读完成。

本篇内容介绍了“数据库动态认证封装用户的代码怎么写”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

代码实现

/**
 *  创建 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;

“数据库动态认证封装用户的代码怎么写”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-13发表,共计2423字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)