展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

数据库动态认证,简化封装用户的代码

  • 在之前的案例中,根据用户名+密码登录和根据手机短信+验证登录中有重复的代码
  • 这里简化封装用户的代码
  • 代码实现
/**
* 创建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;
posted @   DogLeftover  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示