|
|
|
|
@ -25,10 +25,13 @@ |
|
|
|
|
*/ |
|
|
|
|
package org.springblade.auth.handler; |
|
|
|
|
|
|
|
|
|
import jakarta.annotation.Resource; |
|
|
|
|
import jakarta.servlet.http.HttpServletRequest; |
|
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
import org.springblade.common.constant.TenantConstant; |
|
|
|
|
import org.springblade.core.launch.props.BladeProperties; |
|
|
|
|
import org.springblade.core.log.logger.BladeLogger; |
|
|
|
|
import org.springblade.core.oauth2.exception.ExceptionCode; |
|
|
|
|
import org.springblade.core.oauth2.handler.AbstractAuthorizationHandler; |
|
|
|
|
import org.springblade.core.oauth2.props.OAuth2Properties; |
|
|
|
|
@ -42,6 +45,10 @@ import org.springblade.core.tool.utils.DesUtil; |
|
|
|
|
import org.springblade.core.tool.utils.SM2Util; |
|
|
|
|
import org.springblade.system.cache.SysCache; |
|
|
|
|
import org.springblade.system.pojo.entity.Tenant; |
|
|
|
|
import org.springframework.data.redis.core.HashOperations; |
|
|
|
|
import org.springframework.data.redis.core.RedisTemplate; |
|
|
|
|
import org.springframework.web.context.request.RequestContextHolder; |
|
|
|
|
import org.springframework.web.context.request.ServletRequestAttributes; |
|
|
|
|
|
|
|
|
|
import java.util.Date; |
|
|
|
|
import java.util.List; |
|
|
|
|
@ -59,6 +66,8 @@ public class BladeAuthorizationHandler extends AbstractAuthorizationHandler { |
|
|
|
|
private final BladeTenantProperties tenantProperties; |
|
|
|
|
private final OAuth2Properties oAuth2Properties; |
|
|
|
|
private final BladeLockHandler lockHandler; |
|
|
|
|
@Resource |
|
|
|
|
private RedisTemplate<String, Object> redisTemplate; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 自定义弱密码列表 |
|
|
|
|
@ -134,10 +143,36 @@ public class BladeAuthorizationHandler extends AbstractAuthorizationHandler { |
|
|
|
|
public void authSuccessful(OAuth2User user, OAuth2Request request) { |
|
|
|
|
// 处理认证成功,清空错误次数
|
|
|
|
|
lockHandler.handleAuthSuccess(user.getTenantId(), user.getAccount()); |
|
|
|
|
|
|
|
|
|
// 更新 Redis 登录统计
|
|
|
|
|
updateUserLoginStats(user); |
|
|
|
|
log.info("用户:{},认证成功", user.getAccount()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 更新用户登录统计信息到 Redis |
|
|
|
|
*/ |
|
|
|
|
private void updateUserLoginStats(OAuth2User user) { |
|
|
|
|
// 获取用户ID
|
|
|
|
|
String userId = user.getUserId(); |
|
|
|
|
// 获取用户名
|
|
|
|
|
String username = user.getName(); |
|
|
|
|
String key = "user:login:" + userId; |
|
|
|
|
// 获取登录IP
|
|
|
|
|
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); |
|
|
|
|
String loginIp = request.getRemoteAddr(); |
|
|
|
|
// 获取部门ID(假设 user 对象提供 getDeptId 方法)
|
|
|
|
|
String deptId = user.getDeptId(); |
|
|
|
|
// 获取 Redis 操作对象
|
|
|
|
|
HashOperations<String, String, Object> hashOps = redisTemplate.opsForHash(); |
|
|
|
|
// 1. 更新用户名(可选,若用户名可能变更)
|
|
|
|
|
hashOps.put(key, "username", username); |
|
|
|
|
// 2. 存储登录IP
|
|
|
|
|
hashOps.put(key, "loginIp", loginIp); |
|
|
|
|
// 3. 存储部门ID
|
|
|
|
|
hashOps.put(key, "deptId", deptId); |
|
|
|
|
// 4. 更新最后一次登录时间
|
|
|
|
|
long lastLoginTime = System.currentTimeMillis(); |
|
|
|
|
hashOps.put(key, "lastLoginTime", lastLoginTime); |
|
|
|
|
} |
|
|
|
|
/** |
|
|
|
|
* 认证失败回调 |
|
|
|
|
* |
|
|
|
|
|