|
@@ -86,11 +86,11 @@ public class SysLoginService
|
|
|
*/
|
|
*/
|
|
|
public String login(String username, String password, String code, String uuid, String tenantCode)
|
|
public String login(String username, String password, String code, String uuid, String tenantCode)
|
|
|
{
|
|
{
|
|
|
|
|
+ Long tenantId = resolveTenantIdQuiet(tenantCode);
|
|
|
boolean captchaOnOff = configService.selectCaptchaOnOff();
|
|
boolean captchaOnOff = configService.selectCaptchaOnOff();
|
|
|
- // 验证码开关
|
|
|
|
|
if (captchaOnOff)
|
|
if (captchaOnOff)
|
|
|
{
|
|
{
|
|
|
- validateCaptcha(username, code, uuid);
|
|
|
|
|
|
|
+ validateCaptcha(username, code, uuid, tenantId);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TenantInfo tenantInfo = null;
|
|
TenantInfo tenantInfo = null;
|
|
@@ -101,7 +101,6 @@ public class SysLoginService
|
|
|
// ===== 只有传了 tenantCode 才查询租户并切库 =====
|
|
// ===== 只有传了 tenantCode 才查询租户并切库 =====
|
|
|
if (StringUtils.isNotBlank(tenantCode))
|
|
if (StringUtils.isNotBlank(tenantCode))
|
|
|
{
|
|
{
|
|
|
- // 查询租户(主库)
|
|
|
|
|
tenantInfo = userService.getTenantInfo(tenantCode);
|
|
tenantInfo = userService.getTenantInfo(tenantCode);
|
|
|
if (BeanUtil.isEmpty(tenantInfo)) {
|
|
if (BeanUtil.isEmpty(tenantInfo)) {
|
|
|
throw new ServiceException("企业不存在");
|
|
throw new ServiceException("企业不存在");
|
|
@@ -111,27 +110,25 @@ public class SysLoginService
|
|
|
throw new ServiceException("企业已禁用");
|
|
throw new ServiceException("企业已禁用");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 切租户库
|
|
|
|
|
|
|
+ tenantId = tenantInfo.getId();
|
|
|
tenantDataSourceManager.switchTenant(tenantInfo);
|
|
tenantDataSourceManager.switchTenant(tenantInfo);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
- // 用户验证
|
|
|
|
|
Authentication authentication = null;
|
|
Authentication authentication = null;
|
|
|
try {
|
|
try {
|
|
|
- // 该方法会去调用 UserDetailsServiceImpl.loadUserByUsername
|
|
|
|
|
authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
|
|
authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
if (e instanceof BadCredentialsException) {
|
|
if (e instanceof BadCredentialsException) {
|
|
|
- AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
|
|
|
|
|
|
|
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
|
|
|
throw new UserPasswordNotMatchException();
|
|
throw new UserPasswordNotMatchException();
|
|
|
} else {
|
|
} else {
|
|
|
- AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
|
|
|
|
|
|
|
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, e.getMessage()));
|
|
|
throw new ServiceException(e.getMessage());
|
|
throw new ServiceException(e.getMessage());
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
|
|
|
|
|
|
|
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(tenantId, username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
|
|
|
|
|
|
|
|
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
|
|
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
|
|
|
|
|
|
|
@@ -165,19 +162,19 @@ public class SysLoginService
|
|
|
* @param uuid 唯一标识
|
|
* @param uuid 唯一标识
|
|
|
* @return 结果
|
|
* @return 结果
|
|
|
*/
|
|
*/
|
|
|
- public void validateCaptcha(String username, String code, String uuid)
|
|
|
|
|
|
|
+ public void validateCaptcha(String username, String code, String uuid, Long tenantId)
|
|
|
{
|
|
{
|
|
|
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
|
|
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
|
|
|
String captcha = redisCache.getCacheObject(verifyKey);
|
|
String captcha = redisCache.getCacheObject(verifyKey);
|
|
|
redisCache.deleteObject(verifyKey);
|
|
redisCache.deleteObject(verifyKey);
|
|
|
if (captcha == null)
|
|
if (captcha == null)
|
|
|
{
|
|
{
|
|
|
- AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
|
|
|
|
|
|
|
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
|
|
|
throw new CaptchaExpireException();
|
|
throw new CaptchaExpireException();
|
|
|
}
|
|
}
|
|
|
if (!code.equalsIgnoreCase(captcha))
|
|
if (!code.equalsIgnoreCase(captcha))
|
|
|
{
|
|
{
|
|
|
- AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
|
|
|
|
|
|
|
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
|
|
|
throw new CaptchaException();
|
|
throw new CaptchaException();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -207,7 +204,7 @@ public class SysLoginService
|
|
|
|
|
|
|
|
public boolean checkIsNeedCheck(String username, String password, String code, String uuid, String tenantCode)
|
|
public boolean checkIsNeedCheck(String username, String password, String code, String uuid, String tenantCode)
|
|
|
{
|
|
{
|
|
|
- // 验证码开关
|
|
|
|
|
|
|
+ Long tenantId = resolveTenantIdQuiet(tenantCode);
|
|
|
boolean captchaOnOff = configService.selectCaptchaOnOff();
|
|
boolean captchaOnOff = configService.selectCaptchaOnOff();
|
|
|
if (captchaOnOff)
|
|
if (captchaOnOff)
|
|
|
{
|
|
{
|
|
@@ -217,23 +214,21 @@ public class SysLoginService
|
|
|
|
|
|
|
|
if (captcha == null)
|
|
if (captcha == null)
|
|
|
{
|
|
{
|
|
|
- AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
|
|
|
|
|
|
|
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
|
|
|
throw new CaptchaExpireException();
|
|
throw new CaptchaExpireException();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (!code.equalsIgnoreCase(captcha))
|
|
if (!code.equalsIgnoreCase(captcha))
|
|
|
{
|
|
{
|
|
|
- AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
|
|
|
|
|
|
|
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
|
|
|
throw new CaptchaException();
|
|
throw new CaptchaException();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TenantInfo tenantInfo = null;
|
|
TenantInfo tenantInfo = null;
|
|
|
|
|
|
|
|
- // 默认使用主库
|
|
|
|
|
DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
|
|
DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
|
|
|
-
|
|
|
|
|
- // 查询租户(主库)
|
|
|
|
|
|
|
+
|
|
|
tenantInfo = userService.getTenantInfo(tenantCode);
|
|
tenantInfo = userService.getTenantInfo(tenantCode);
|
|
|
if (BeanUtil.isEmpty(tenantInfo))
|
|
if (BeanUtil.isEmpty(tenantInfo))
|
|
|
{
|
|
{
|
|
@@ -244,23 +239,21 @@ public class SysLoginService
|
|
|
throw new ServiceException("企业已禁用");
|
|
throw new ServiceException("企业已禁用");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 切到租户库
|
|
|
|
|
|
|
+ tenantId = tenantInfo.getId();
|
|
|
tenantDataSourceManager.switchTenant(tenantInfo);
|
|
tenantDataSourceManager.switchTenant(tenantInfo);
|
|
|
|
|
|
|
|
-
|
|
|
|
|
try
|
|
try
|
|
|
{
|
|
{
|
|
|
- // 用户验证
|
|
|
|
|
Authentication authentication = null;
|
|
Authentication authentication = null;
|
|
|
try {
|
|
try {
|
|
|
authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
|
|
authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
|
|
|
} catch (Exception e)
|
|
} catch (Exception e)
|
|
|
{
|
|
{
|
|
|
if (e instanceof BadCredentialsException) {
|
|
if (e instanceof BadCredentialsException) {
|
|
|
- AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
|
|
|
|
|
|
|
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
|
|
|
throw new UserPasswordNotMatchException();
|
|
throw new UserPasswordNotMatchException();
|
|
|
} else {
|
|
} else {
|
|
|
- AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
|
|
|
|
|
|
|
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, e.getMessage()));
|
|
|
throw new ServiceException(e.getMessage());
|
|
throw new ServiceException(e.getMessage());
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -415,4 +408,15 @@ public class SysLoginService
|
|
|
|
|
|
|
|
redisCache.setCacheObject("wechat:scan:" + ticket, "ok", 30, TimeUnit.SECONDS);
|
|
redisCache.setCacheObject("wechat:scan:" + ticket, "ok", 30, TimeUnit.SECONDS);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ private Long resolveTenantIdQuiet(String tenantCode)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (StringUtils.isBlank(tenantCode))
|
|
|
|
|
+ {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
|
|
|
|
|
+ TenantInfo tenantInfo = userService.getTenantInfo(tenantCode);
|
|
|
|
|
+ return BeanUtil.isEmpty(tenantInfo) ? null : tenantInfo.getId();
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|