数据库动态认证,简化封装用户的代码
- 在之前的案例中,根据用户名+密码登录和根据手机短信+验证登录中有重复的代码
- 这里简化封装用户的代码
- 代码实现
/** * 创建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;
分类:
权限认证
标签:
Spring Security
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?