package com.alatus.mall.member.service.impl; import com.alatus.mall.member.entity.MemberLevelEntity; import com.alatus.mall.member.exception.PhoneExistException; import com.alatus.mall.member.exception.UsernameExistException; import com.alatus.mall.member.service.MemberLevelService; import com.alatus.mall.member.vo.MemberRegisterVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import java.util.Map; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.alatus.common.utils.PageUtils; import com.alatus.common.utils.Query; import com.alatus.mall.member.dao.MemberDao; import com.alatus.mall.member.entity.MemberEntity; import com.alatus.mall.member.service.MemberService; @Service("memberService") public class MemberServiceImpl extends ServiceImpl<MemberDao, MemberEntity> implements MemberService { @Autowired private MemberLevelService memberLevelService; @Override public PageUtils queryPage(Map<String, Object> params) { IPage<MemberEntity> page = this.page( new Query<MemberEntity>().getPage(params), new QueryWrapper<MemberEntity>() ); return new PageUtils(page); } @Override public void register(MemberRegisterVo memberRegisterVo) { // 检查用户名和手机号是否唯一(为了能让上层感知异常,我们这里抛出去)采用异常机制 checkPhoneUnique(memberRegisterVo.getPhone()); checkUsernameUnique(memberRegisterVo.getUsername()); MemberEntity memberEntity = new MemberEntity(); // 设置默认等级 MemberLevelEntity memberLevelEntity = memberLevelService.getDefaultLevel(); memberEntity.setLevelId(memberLevelEntity.getId()); // 密码绝对不能传递明文,一旦数据库泄露,就会导致所有数据曝光,我们应该存储MD5加密后的数据 // MD5任何长度大小的数据,算出的值都是固定的,源数据哪怕任何改动,得到的MD5值都会不同 // 百度网盘的秒传功能本质上就是MD5值相同,在这个情况下,不同文件就不需要再次上传,达到了秒传效果 // MD5的最大特点就说不可逆,无法通过MD5获取源数据的值 // MD5抗修改性意味着MD5的数据可以通过暴力算或者字典查的穷举法获得,网上有一大堆对应的彩虹表 // 因此MD5不能直接用来加密,必须加盐存储 // 使用Spring原生的加密器实现 BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); memberEntity.setPassword(passwordEncoder.encode(memberRegisterVo.getPassword())); // 用户名 memberEntity.setUsername(memberRegisterVo.getUsername()); // 手机号也加密 memberEntity.setMobile(passwordEncoder.encode(memberRegisterVo.getPhone())); this.baseMapper.insert(memberEntity); } @Override public void checkPhoneUnique(String phone) throws PhoneExistException{ Integer count = this.baseMapper.selectCount(new QueryWrapper<MemberEntity>().eq("mobile", phone)); if(count>0){ throw new PhoneExistException(); } } @Override public void checkUsernameUnique(String username) throws UsernameExistException{ Integer count = this.baseMapper.selectCount(new QueryWrapper<MemberEntity>().eq("username", username)); if(count>0){ throw new UsernameExistException(); } } }
package com.alatus.mall.member.service.impl; import com.alatus.mall.member.entity.MemberLevelEntity; import com.alatus.mall.member.exception.PhoneExistException; import com.alatus.mall.member.exception.UsernameExistException; import com.alatus.mall.member.service.MemberLevelService; import com.alatus.mall.member.vo.MemberRegisterVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import java.util.Map; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.alatus.common.utils.PageUtils; import com.alatus.common.utils.Query; import com.alatus.mall.member.dao.MemberDao; import com.alatus.mall.member.entity.MemberEntity; import com.alatus.mall.member.service.MemberService; @Service("memberService") public class MemberServiceImpl extends ServiceImpl<MemberDao, MemberEntity> implements MemberService { @Autowired private MemberLevelService memberLevelService; @Override public PageUtils queryPage(Map<String, Object> params) { IPage<MemberEntity> page = this.page( new Query<MemberEntity>().getPage(params), new QueryWrapper<MemberEntity>() ); return new PageUtils(page); } @Override public void register(MemberRegisterVo memberRegisterVo) { // 检查用户名和手机号是否唯一(为了能让上层感知异常,我们这里抛出去)采用异常机制 checkPhoneUnique(memberRegisterVo.getPhone()); checkUsernameUnique(memberRegisterVo.getUsername()); MemberEntity memberEntity = new MemberEntity(); // 设置默认等级 MemberLevelEntity memberLevelEntity = memberLevelService.getDefaultLevel(); memberEntity.setLevelId(memberLevelEntity.getId()); // 密码绝对不能传递明文,一旦数据库泄露,就会导致所有数据曝光,我们应该存储MD5加密后的数据 // MD5任何长度大小的数据,算出的值都是固定的,源数据哪怕任何改动,得到的MD5值都会不同 // 百度网盘的秒传功能本质上就是MD5值相同,在这个情况下,不同文件就不需要再次上传,达到了秒传效果 // MD5的最大特点就说不可逆,无法通过MD5获取源数据的值 // MD5抗修改性意味着MD5的数据可以通过暴力算或者字典查的穷举法获得,网上有一大堆对应的彩虹表 // 因此MD5不能直接用来加密,必须加盐存储 // 使用Spring原生的加密器实现 BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); memberEntity.setPassword(passwordEncoder.encode(memberRegisterVo.getPassword())); // 用户名 memberEntity.setUsername(memberRegisterVo.getUsername()); // 手机号也加密 memberEntity.setMobile(passwordEncoder.encode(memberRegisterVo.getPhone())); this.baseMapper.insert(memberEntity); } @Override public void checkPhoneUnique(String phone) throws PhoneExistException{ Integer count = this.baseMapper.selectCount(new QueryWrapper<MemberEntity>().eq("mobile", phone)); if(count>0){ throw new PhoneExistException(); } } @Override public void checkUsernameUnique(String username) throws UsernameExistException{ Integer count = this.baseMapper.selectCount(new QueryWrapper<MemberEntity>().eq("username", username)); if(count>0){ throw new UsernameExistException(); } } }
商城项目用户注册保存密码和MD5加密-----商城项目
最新推荐文章于 2024-10-09 11:13:12 发布