| | |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.dromara.common.core.constant.Constants; |
| | | import org.dromara.common.core.domain.model.LoginBody; |
| | | import me.zhyd.oauth.config.AuthConfig; |
| | | import me.zhyd.oauth.model.AuthCallback; |
| | | import me.zhyd.oauth.model.AuthResponse; |
| | | import me.zhyd.oauth.model.AuthToken; |
| | | import me.zhyd.oauth.model.AuthUser; |
| | | import me.zhyd.oauth.request.AuthRequest; |
| | | import me.zhyd.oauth.request.AuthWechatMiniProgramRequest; |
| | | import org.dromara.common.core.constant.SystemConstants; |
| | | import org.dromara.common.core.domain.model.XcxLoginBody; |
| | | import org.dromara.common.core.domain.model.XcxLoginUser; |
| | | import org.dromara.common.core.enums.UserStatus; |
| | | import org.dromara.common.core.utils.MessageUtils; |
| | | import org.dromara.common.core.exception.ServiceException; |
| | | import org.dromara.common.core.utils.ValidatorUtils; |
| | | import org.dromara.common.core.validate.auth.WechatGroup; |
| | | import org.dromara.common.json.utils.JsonUtils; |
| | | import org.dromara.common.satoken.utils.LoginHelper; |
| | | import org.dromara.system.domain.SysClient; |
| | | import org.dromara.system.domain.vo.SysClientVo; |
| | | import org.dromara.system.domain.vo.SysUserVo; |
| | | import org.dromara.web.domain.vo.LoginVo; |
| | | import org.dromara.web.service.IAuthStrategy; |
| | |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | /** |
| | | * 邮件认证策略 |
| | | * 小程序认证策略 |
| | | * |
| | | * @author Michelle.Chung |
| | | */ |
| | |
| | | private final SysLoginService loginService; |
| | | |
| | | @Override |
| | | public void validate(LoginBody loginBody) { |
| | | ValidatorUtils.validate(loginBody, WechatGroup.class); |
| | | } |
| | | |
| | | @Override |
| | | public LoginVo login(String clientId, LoginBody loginBody, SysClient client) { |
| | | public LoginVo login(String body, SysClientVo client) { |
| | | XcxLoginBody loginBody = JsonUtils.parseObject(body, XcxLoginBody.class); |
| | | ValidatorUtils.validate(loginBody); |
| | | // xcxCode 为 小程序调用 wx.login 授权后获取 |
| | | String xcxCode = loginBody.getXcxCode(); |
| | | // todo 以下自行实现 |
| | | // 多个小程序识别使用 |
| | | String appid = loginBody.getAppid(); |
| | | |
| | | // 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid |
| | | String openid = ""; |
| | | AuthRequest authRequest = new AuthWechatMiniProgramRequest(AuthConfig.builder() |
| | | .clientId(appid).clientSecret("自行填写密钥 可根据不同appid填入不同密钥") |
| | | .ignoreCheckRedirectUri(true).ignoreCheckState(true).build()); |
| | | AuthCallback authCallback = new AuthCallback(); |
| | | authCallback.setCode(xcxCode); |
| | | AuthResponse<AuthUser> resp = authRequest.login(authCallback); |
| | | String openid, unionId; |
| | | if (resp.ok()) { |
| | | AuthToken token = resp.getData().getToken(); |
| | | openid = token.getOpenId(); |
| | | // 微信小程序只有关联到微信开放平台下之后才能获取到 unionId,因此unionId不一定能返回。 |
| | | unionId = token.getUnionId(); |
| | | } else { |
| | | throw new ServiceException(resp.getMsg()); |
| | | } |
| | | // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 |
| | | SysUserVo user = loadUserByOpenid(openid); |
| | | |
| | | // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 |
| | | XcxLoginUser loginUser = new XcxLoginUser(); |
| | | loginUser.setTenantId(user.getTenantId()); |
| | | loginUser.setUserId(user.getUserId()); |
| | | loginUser.setUsername(user.getUserName()); |
| | | loginUser.setNickname(user.getNickName()); |
| | | loginUser.setUserType(user.getUserType()); |
| | | loginUser.setClientKey(client.getClientKey()); |
| | | loginUser.setDeviceType(client.getDeviceType()); |
| | | loginUser.setOpenid(openid); |
| | | |
| | | SaLoginModel model = new SaLoginModel(); |
| | |
| | | // 例如: 后台用户30分钟过期 app用户1天过期 |
| | | model.setTimeout(client.getTimeout()); |
| | | model.setActiveTimeout(client.getActiveTimeout()); |
| | | model.setExtra(LoginHelper.CLIENT_KEY, clientId); |
| | | model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); |
| | | // 生成token |
| | | LoginHelper.login(loginUser, model); |
| | | |
| | | loginService.recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); |
| | | loginService.recordLoginInfo(user.getUserId()); |
| | | |
| | | LoginVo loginVo = new LoginVo(); |
| | | loginVo.setAccessToken(StpUtil.getTokenValue()); |
| | | loginVo.setExpireIn(StpUtil.getTokenTimeout()); |
| | | loginVo.setClientId(clientId); |
| | | loginVo.setClientId(client.getClientId()); |
| | | loginVo.setOpenid(openid); |
| | | return loginVo; |
| | | } |
| | |
| | | if (ObjectUtil.isNull(user)) { |
| | | log.info("登录用户:{} 不存在.", openid); |
| | | // todo 用户不存在 业务逻辑自行实现 |
| | | } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { |
| | | } else if (SystemConstants.DISABLE.equals(user.getStatus())) { |
| | | log.info("登录用户:{} 已被停用.", openid); |
| | | // todo 用户已被停用 业务逻辑自行实现 |
| | | } |