|
|
@@ -28,6 +28,7 @@ import org.dromara.system.domain.SysClient;
|
|
|
import org.dromara.system.domain.SysUser;
|
|
|
import org.dromara.system.domain.vo.SysUserVo;
|
|
|
import org.dromara.system.mapper.SysUserMapper;
|
|
|
+import org.dromara.system.service.ISysClientService;
|
|
|
import org.dromara.web.domain.vo.LoginVo;
|
|
|
import org.dromara.web.service.IAuthStrategy;
|
|
|
import org.dromara.web.service.SysLoginService;
|
|
|
@@ -46,6 +47,10 @@ public class PasswordAuthStrategy implements IAuthStrategy {
|
|
|
private final CaptchaProperties captchaProperties;
|
|
|
private final SysLoginService loginService;
|
|
|
private final SysUserMapper userMapper;
|
|
|
+ private final ISysClientService clientService;
|
|
|
+
|
|
|
+ public static final String LOGIN_USER_KEY = "loginUser";
|
|
|
+ public static final String LOGIN_USER_APP_KEY = "loginUserApp";
|
|
|
|
|
|
@Override
|
|
|
public void validate(LoginBody loginBody) {
|
|
|
@@ -90,6 +95,34 @@ public class PasswordAuthStrategy implements IAuthStrategy {
|
|
|
return loginVo;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public String appLogin(LoginBody loginBody) {
|
|
|
+ String username = loginBody.getUsername();
|
|
|
+ String password = loginBody.getPassword();
|
|
|
+ String clientId = loginBody.getClientId();
|
|
|
+
|
|
|
+ SysUserVo user = loadUserByUsername(username);
|
|
|
+
|
|
|
+ loginService.checkLogin(LoginType.PASSWORD, null, username, () -> !BCrypt.checkpw(password, user.getPassword()));
|
|
|
+ // 此处可根据登录用户的数据不同 自行创建 loginUser
|
|
|
+ LoginUser loginUser = loginService.buildLoginUser(user);
|
|
|
+ SysClient client = clientService.queryByClientId(clientId);
|
|
|
+ SaLoginModel model = new SaLoginModel();
|
|
|
+ model.setDevice(client.getDeviceType());
|
|
|
+ // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
|
|
|
+ // 例如: 后台用户30分钟过期 app用户1天过期
|
|
|
+ model.setTimeout(client.getTimeout());
|
|
|
+ model.setActiveTimeout(client.getActiveTimeout());
|
|
|
+ model.setExtra(LoginHelper.CLIENT_KEY, clientId);
|
|
|
+ // 生成token
|
|
|
+ LoginHelper.login(loginUser, model);
|
|
|
+
|
|
|
+ //RedisUtils.deleteObject(errorKey);
|
|
|
+ StpUtil.getSession().set(LOGIN_USER_KEY, loginUser);
|
|
|
+ RedisUtils.setCacheObject("LOGIN_USER_APP_KEY", StpUtil.getTokenValue());
|
|
|
+ return RedisUtils.getCacheObject("LOGIN_USER_APP_KEY");
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 校验验证码
|
|
|
*
|
|
|
@@ -129,4 +162,20 @@ public class PasswordAuthStrategy implements IAuthStrategy {
|
|
|
return userMapper.selectUserByUserName(username);
|
|
|
}
|
|
|
|
|
|
+ private SysUserVo loadUserByUsername(String username) {
|
|
|
+ SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
|
|
|
+ .select(SysUser::getUserName, SysUser::getStatus)
|
|
|
+ .eq(SysUser::getUserName, username));
|
|
|
+ if (ObjectUtil.isNull(user)) {
|
|
|
+ log.info("登录用户:{} 不存在.", username);
|
|
|
+ throw new UserException("user.not.exists", username);
|
|
|
+ } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
|
|
|
+ log.info("登录用户:{} 已被停用.", username);
|
|
|
+ throw new UserException("user.blocked", username);
|
|
|
+ }
|
|
|
+ return userMapper.selectUserByUserName(username);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|