增加会员登录事件,对token处理优化

This commit is contained in:
Chopper 2022-01-11 11:12:19 +08:00
parent cc7d2c0c82
commit eddcbc2ecb
14 changed files with 136 additions and 59 deletions

View File

@ -113,7 +113,7 @@ spring:
props: props:
#是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭 #是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭
sql: sql:
show: false show: true
# 忽略鉴权url # 忽略鉴权url
ignored: ignored:

View File

@ -0,0 +1,19 @@
package cn.lili.event;
import cn.lili.modules.member.entity.dos.Member;
/**
* 会员登录消息
*
* @author Chopper
* @since 2020/11/17 7:13 下午
*/
public interface MemberLoginEvent {
/**
* 会员登录
*
* @param member 会员
*/
void memberLogin(Member member);
}

View File

@ -11,7 +11,7 @@ import cn.lili.modules.member.entity.dos.Member;
public interface MemberRegisterEvent { public interface MemberRegisterEvent {
/** /**
* 会员登录 * 会员注册
* *
* @param member 会员 * @param member 会员
*/ */

View File

@ -0,0 +1,25 @@
package cn.lili.event.impl;
import cn.lili.event.MemberLoginEvent;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 会员自身业务
*
* @author Chopper
* @version v1.0
* 2022-01-11 11:08
*/
@Service
public class MemberExecute implements MemberLoginEvent {
@Autowired
private MemberService memberService;
@Override
public void memberLogin(Member member) {
memberService.updateById(member);
}
}

View File

@ -1,6 +1,7 @@
package cn.lili.listener; package cn.lili.listener;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.event.MemberLoginEvent;
import cn.lili.event.MemberPointChangeEvent; import cn.lili.event.MemberPointChangeEvent;
import cn.lili.event.MemberRegisterEvent; import cn.lili.event.MemberRegisterEvent;
import cn.lili.event.MemberWithdrawalEvent; import cn.lili.event.MemberWithdrawalEvent;
@ -51,6 +52,12 @@ public class MemberMessageListener implements RocketMQListener<MessageExt> {
@Autowired @Autowired
private List<MemberRegisterEvent> memberSignEvents; private List<MemberRegisterEvent> memberSignEvents;
/**
* 会员注册
*/
@Autowired
private List<MemberLoginEvent> memberLoginEvents;
@Override @Override
public void onMessage(MessageExt messageExt) { public void onMessage(MessageExt messageExt) {
@ -69,6 +76,21 @@ public class MemberMessageListener implements RocketMQListener<MessageExt> {
} }
} }
break; break;
case MEMBER_LOGIN:
for (MemberLoginEvent memberLoginEvent : memberLoginEvents) {
try {
Member member = JSONUtil.toBean(new String(messageExt.getBody()), Member.class);
memberLoginEvent.memberLogin(member);
} catch (Exception e) {
log.error("会员{},在{}业务中,状态修改事件执行异常",
new String(messageExt.getBody()),
memberLoginEvent.getClass().getName(),
e);
}
}
break;
//会员签到 //会员签到
case MEMBER_SING: case MEMBER_SING:
MemberSign memberSign = JSONUtil.toBean(new String(messageExt.getBody()), MemberSign.class); MemberSign memberSign = JSONUtil.toBean(new String(messageExt.getBody()), MemberSign.class);

View File

@ -115,8 +115,7 @@ public enum ResultCode {
USER_AUTH_EXPIRED(20004, "用户已退出,请重新登录"), USER_AUTH_EXPIRED(20004, "用户已退出,请重新登录"),
USER_AUTHORITY_ERROR(20005, "权限不足"), USER_AUTHORITY_ERROR(20005, "权限不足"),
USER_CONNECT_LOGIN_ERROR(20006, "未找到登录信息"), USER_CONNECT_LOGIN_ERROR(20006, "未找到登录信息"),
USER_NAME_EXIST(20007, "该用户名已被注册"), USER_EXIST(20008, "该用户名或手机号已被注册"),
USER_PHONE_EXIST(20008, "该手机号已被注册"),
USER_PHONE_NOT_EXIST(20009, "手机号不存在"), USER_PHONE_NOT_EXIST(20009, "手机号不存在"),
USER_PASSWORD_ERROR(20010, "密码不正确"), USER_PASSWORD_ERROR(20010, "密码不正确"),
USER_NOT_PHONE(20011, "非当前用户的手机号"), USER_NOT_PHONE(20011, "非当前用户的手机号"),

View File

@ -16,11 +16,11 @@ public abstract class AbstractTokenGenerate {
/** /**
* 生成token * 生成token
* *
* @param username 用户名 * @param user 用户名
* @param longTerm 是否长时间有效 * @param longTerm 是否长时间有效
* @return TOKEN对象 * @return TOKEN对象
*/ */
public abstract Token createToken(String username, Boolean longTerm); public abstract Token createToken(Object user, Boolean longTerm);
/** /**
* 刷新token * 刷新token

View File

@ -87,7 +87,7 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
this.remove(queryWrapper); this.remove(queryWrapper);
throw new NoPermissionException("未绑定用户"); throw new NoPermissionException("未绑定用户");
} }
return memberTokenGenerate.createToken(member.getUsername(), longTerm); return memberTokenGenerate.createToken(member, longTerm);
} catch (NoPermissionException e) { } catch (NoPermissionException e) {
throw e; throw e;
} }
@ -222,7 +222,7 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
//如果不存在会员则进行绑定微信openid unionid并且登录 //如果不存在会员则进行绑定微信openid unionid并且登录
if (member != null) { if (member != null) {
bindMpMember(openId, unionId, member); bindMpMember(openId, unionId, member);
return memberTokenGenerate.createToken(member.getUsername(), true); return memberTokenGenerate.createToken(member, true);
} }
//如果没有会员则根据手机号注册会员 //如果没有会员则根据手机号注册会员
@ -230,7 +230,7 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
memberService.save(newMember); memberService.save(newMember);
newMember = memberService.findByUsername(newMember.getUsername()); newMember = memberService.findByUsername(newMember.getUsername());
bindMpMember(openId, unionId, newMember); bindMpMember(openId, unionId, newMember);
return memberTokenGenerate.createToken(newMember.getUsername(), true); return memberTokenGenerate.createToken(newMember, true);
} }
@Override @Override

View File

@ -17,6 +17,7 @@ import cn.lili.common.security.token.Token;
import cn.lili.common.sensitive.SensitiveWordsFilter; import cn.lili.common.sensitive.SensitiveWordsFilter;
import cn.lili.common.utils.BeanUtil; import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.CookieUtil; import cn.lili.common.utils.CookieUtil;
import cn.lili.common.utils.SnowFlake;
import cn.lili.common.utils.UuidUtils; import cn.lili.common.utils.UuidUtils;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.modules.connect.config.ConnectAuthEnum; import cn.lili.modules.connect.config.ConnectAuthEnum;
@ -143,7 +144,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
// throw new ServiceException(ResultCode.USER_PASSWORD_ERROR); // throw new ServiceException(ResultCode.USER_PASSWORD_ERROR);
// } // }
// loginBindUser(member); // loginBindUser(member);
return memberTokenGenerate.createToken(member.getUsername(), false); return memberTokenGenerate.createToken(member, false);
} }
@Override @Override
@ -168,7 +169,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
throw new ServiceException(ResultCode.USER_NOT_EXIST); throw new ServiceException(ResultCode.USER_NOT_EXIST);
} }
return storeTokenGenerate.createToken(member.getUsername(), false); return storeTokenGenerate.createToken(member, false);
} }
/** /**
@ -196,12 +197,10 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
String username = UuidUtils.getUUID(); String username = UuidUtils.getUUID();
Member member = new Member(username, UuidUtils.getUUID(), authUser.getAvatar(), authUser.getNickname(), Member member = new Member(username, UuidUtils.getUUID(), authUser.getAvatar(), authUser.getNickname(),
authUser.getGender() != null ? Convert.toInt(authUser.getGender().getCode()) : 0); authUser.getGender() != null ? Convert.toInt(authUser.getGender().getCode()) : 0);
//保存会员 registerHandler(member);
this.save(member);
Member loadMember = this.findByUsername(username);
//绑定登录方式 //绑定登录方式
loginBindUser(loadMember, authUser.getUuid(), authUser.getSource()); loginBindUser(member, authUser.getUuid(), authUser.getSource());
return memberTokenGenerate.createToken(username, false); return memberTokenGenerate.createToken(member, false);
} catch (ServiceException e) { } catch (ServiceException e) {
log.error("自动注册服务泡出异常:", e); log.error("自动注册服务泡出异常:", e);
throw e; throw e;
@ -235,13 +234,23 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
//如果手机号不存在则自动注册用户 //如果手机号不存在则自动注册用户
if (member == null) { if (member == null) {
member = new Member(mobilePhone, UuidUtils.getUUID(), mobilePhone); member = new Member(mobilePhone, UuidUtils.getUUID(), mobilePhone);
//保存会员 registerHandler(member);
this.save(member);
String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name();
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
} }
loginBindUser(member); loginBindUser(member);
return memberTokenGenerate.createToken(member.getUsername(), false); return memberTokenGenerate.createToken(member, false);
}
/**
* 注册方法抽象
*
* @param member
*/
private void registerHandler(Member member) {
member.setId(SnowFlake.getIdStr());
//保存会员
this.save(member);
String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name();
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
} }
@Override @Override
@ -281,13 +290,9 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
//设置会员信息 //设置会员信息
Member member = new Member(userName, new BCryptPasswordEncoder().encode(password), mobilePhone); Member member = new Member(userName, new BCryptPasswordEncoder().encode(password), mobilePhone);
//注册成功后用户自动登录 //注册成功后用户自动登录
if (this.save(member)) { registerHandler(member);
Token token = memberTokenGenerate.createToken(member.getUsername(), false); Token token = memberTokenGenerate.createToken(member, false);
String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name(); return token;
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
return token;
}
return null;
} }
@Override @Override
@ -331,9 +336,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
//添加会员 //添加会员
Member member = new Member(memberAddDTO.getUsername(), new BCryptPasswordEncoder().encode(memberAddDTO.getPassword()), memberAddDTO.getMobile()); Member member = new Member(memberAddDTO.getUsername(), new BCryptPasswordEncoder().encode(memberAddDTO.getPassword()), memberAddDTO.getMobile());
this.save(member); registerHandler(member);
String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name();
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
return member; return member;
} }
@ -430,10 +433,11 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
* @param mobilePhone 手机号 * @param mobilePhone 手机号
* @return 会员 * @return 会员
*/ */
private Member findByPhone(String mobilePhone) { private List<Member> findMember(String mobilePhone, String userName) {
QueryWrapper<Member> queryWrapper = new QueryWrapper<>(); QueryWrapper<Member> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("mobile", mobilePhone); queryWrapper.eq("mobile", mobilePhone)
return this.baseMapper.selectOne(queryWrapper); .or().eq("username", userName);
return this.baseMapper.selectList(queryWrapper);
} }
/** /**
@ -589,13 +593,9 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
* @param mobilePhone 手机号 * @param mobilePhone 手机号
*/ */
private void checkMember(String userName, String mobilePhone) { private void checkMember(String userName, String mobilePhone) {
//判断用户名是否存在
if (findByUsername(userName) != null) {
throw new ServiceException(ResultCode.USER_NAME_EXIST);
}
//判断手机号是否存在 //判断手机号是否存在
if (findByPhone(mobilePhone) != null) { if (findMember(userName, mobilePhone) != null) {
throw new ServiceException(ResultCode.USER_PHONE_EXIST); throw new ServiceException(ResultCode.USER_EXIST);
} }
} }
} }

View File

@ -1,5 +1,6 @@
package cn.lili.modules.member.token; package cn.lili.modules.member.token;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.AuthUser; import cn.lili.common.security.AuthUser;
import cn.lili.common.security.enums.UserEnums; import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.security.token.Token; import cn.lili.common.security.token.Token;
@ -9,6 +10,9 @@ import cn.lili.common.context.ThreadContextHolder;
import cn.lili.common.enums.ClientTypeEnum; import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService; import cn.lili.modules.member.service.MemberService;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.MemberTagsEnum;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -28,11 +32,16 @@ public class MemberTokenGenerate extends AbstractTokenGenerate {
private MemberService memberService; private MemberService memberService;
@Autowired @Autowired
private TokenUtil tokenUtil; private TokenUtil tokenUtil;
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Override @Override
public Token createToken(String username, Boolean longTerm) { public Token createToken(Object user, Boolean longTerm) {
Member member = memberService.findByUsername(username); Member member = (Member) user;
//获取客户端类型 //获取客户端类型
String clientType = ThreadContextHolder.getHttpRequest().getHeader("clientType"); String clientType = ThreadContextHolder.getHttpRequest().getHeader("clientType");
@ -50,11 +59,12 @@ public class MemberTokenGenerate extends AbstractTokenGenerate {
//记录最后登录时间客户端类型 //记录最后登录时间客户端类型
member.setLastLoginDate(new Date()); member.setLastLoginDate(new Date());
member.setClientEnum(clientTypeEnum.name()); member.setClientEnum(clientTypeEnum.name());
memberService.updateById(member); String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_LOGIN.name();
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
AuthUser authUser = new AuthUser(member.getUsername(), member.getId(), member.getNickName(), member.getFace(), UserEnums.MEMBER); AuthUser authUser = new AuthUser(member.getUsername(), member.getId(), member.getNickName(), member.getFace(), UserEnums.MEMBER);
//登陆成功生成token //登陆成功生成token
return tokenUtil.createToken(username, authUser, longTerm, UserEnums.MEMBER); return tokenUtil.createToken(member.getUsername(), authUser, longTerm, UserEnums.MEMBER);
} }
@Override @Override

View File

@ -32,20 +32,20 @@ public class StoreTokenGenerate extends AbstractTokenGenerate {
private TokenUtil tokenUtil; private TokenUtil tokenUtil;
@Override @Override
public Token createToken(String username, Boolean longTerm) { public Token createToken(Object user, Boolean longTerm) {
//生成token //生成token
Member member = memberService.findByUsername(username); Member member = (Member) user;
if (!member.getHaveStore()) { if (!member.getHaveStore()) {
throw new ServiceException(ResultCode.STORE_NOT_OPEN); throw new ServiceException(ResultCode.STORE_NOT_OPEN);
} }
LambdaQueryWrapper<Store> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Store> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Store::getMemberId, member.getId()); queryWrapper.eq(Store::getMemberId, member.getId());
Store store = storeService.getOne(queryWrapper); Store store = storeService.getOne(queryWrapper);
AuthUser user = new AuthUser(member.getUsername(), member.getId(), member.getNickName(), store.getStoreLogo(), UserEnums.STORE); AuthUser authUser = new AuthUser(member.getUsername(), member.getId(), member.getNickName(), store.getStoreLogo(), UserEnums.STORE);
user.setStoreId(store.getId()); authUser.setStoreId(store.getId());
user.setStoreName(store.getStoreName()); authUser.setStoreName(store.getStoreName());
return tokenUtil.createToken(username, user, longTerm, UserEnums.STORE); return tokenUtil.createToken(member.getUsername(), authUser, longTerm, UserEnums.STORE);
} }
@Override @Override

View File

@ -119,7 +119,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
throw new ServiceException(ResultCode.USER_PASSWORD_ERROR); throw new ServiceException(ResultCode.USER_PASSWORD_ERROR);
} }
try { try {
return managerTokenGenerate.createToken(username, false); return managerTokenGenerate.createToken(adminUser, false);
} catch (Exception e) { } catch (Exception e) {
log.error("管理员登录错误", e); log.error("管理员登录错误", e);
} }

View File

@ -31,8 +31,6 @@ import java.util.Map;
@Component @Component
public class ManagerTokenGenerate extends AbstractTokenGenerate { public class ManagerTokenGenerate extends AbstractTokenGenerate {
@Autowired
private AdminUserService adminUserService;
@Autowired @Autowired
private TokenUtil tokenUtil; private TokenUtil tokenUtil;
@Autowired @Autowired
@ -42,17 +40,17 @@ public class ManagerTokenGenerate extends AbstractTokenGenerate {
@Override @Override
public Token createToken(String username, Boolean longTerm) { public Token createToken(Object user, Boolean longTerm) {
//生成token //生成token
AdminUser adminUser = adminUserService.findByUsername(username); AdminUser adminUser = (AdminUser) user;
AuthUser user = new AuthUser(adminUser.getUsername(), adminUser.getId(), adminUser.getAvatar(), UserEnums.MANAGER, adminUser.getNickName(), adminUser.getIsSuper()); AuthUser authUser = new AuthUser(adminUser.getUsername(), adminUser.getId(), adminUser.getAvatar(), UserEnums.MANAGER, adminUser.getNickName(), adminUser.getIsSuper());
List<UserMenuVO> userMenuVOList = roleMenuService.findAllMenu(user.getId()); List<UserMenuVO> userMenuVOList = roleMenuService.findAllMenu(authUser.getId());
//缓存权限列表 //缓存权限列表
cache.put(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.MANAGER) + user.getId(), this.permissionList(userMenuVOList)); cache.put(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.MANAGER) + authUser.getId(), this.permissionList(userMenuVOList));
return tokenUtil.createToken(username, user, longTerm, UserEnums.MANAGER); return tokenUtil.createToken(adminUser.getUsername(), authUser, longTerm, UserEnums.MANAGER);
} }
@Override @Override

View File

@ -11,6 +11,10 @@ public enum MemberTagsEnum {
* 会员注册 * 会员注册
*/ */
MEMBER_REGISTER("会员注册"), MEMBER_REGISTER("会员注册"),
/**
* 会员注册
*/
MEMBER_LOGIN("会员登录"),
/** /**
* 会员签到 * 会员签到
*/ */