Преглед на файлове

1.只允许大模型调用的接口不需要token 2.新增配置,可以挤号功能

王苗苗 преди 2 месеца
родител
ревизия
3fe54e481f

+ 2 - 0
slibra-admin/src/main/resources/application.yml

@@ -110,6 +110,8 @@ token:
   expireTime: 60
   # 用户自定义的端口
   port: port
+  # 是否允许账户多终端同时登录(true允许 false不允许)
+  soloLogin: false
 
 ## MyBatis配置
 #mybatis:

+ 5 - 0
slibra-common/src/main/java/com/slibra/common/constant/Constants.java

@@ -144,4 +144,9 @@ public class Constants
      */
     public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
             "org.springframework", "org.apache", "com.slibra.common.utils.file", "com.slibra.common.config" };
+
+    /**
+     * 登录用户编号 redis key
+     */
+    public static final String LOGIN_USERID_KEY = "login_userid:";
 }

+ 1 - 1
slibra-framework/src/main/java/com/slibra/framework/config/SecurityConfig.java

@@ -123,7 +123,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
                 .antMatchers("/login", "/register", "/captchaImage","/sendSmsCode/*","/smsLogin","/test/**", "/demo/**").permitAll()
                 .antMatchers("/websocket/**").permitAll()//websocket的
-                .antMatchers("/bigModel/**", "/front/**", "/**").permitAll()//2024年11月05日14:18:08 和曹永创交互的接口,不需要token即可访问
+                .antMatchers("/bigModel/**").permitAll()//2024年11月05日14:18:08 和曹永创交互的接口,不需要token即可访问
 //                .antMatchers("/front/**","/grpc/**").permitAll()//临时测试的
                 .antMatchers("/qiniuyun/**", "/out/**", "/business/daily").permitAll()//文件上传相关 外部接口等
                 // 静态资源,可匿名访问

+ 2 - 1
slibra-framework/src/main/java/com/slibra/framework/security/handle/LogoutSuccessHandlerImpl.java

@@ -43,7 +43,8 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler
         {
             String userName = loginUser.getUsername();
             // 删除用户缓存记录
-            tokenService.delLoginUser(loginUser.getToken());
+//            tokenService.delLoginUser(loginUser.getToken());
+            tokenService.delLoginUser(loginUser.getToken(), loginUser.getUser().getUserId());
             // 记录用户退出日志
             AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功"));
         }

+ 17 - 0
slibra-framework/src/main/java/com/slibra/framework/web/service/SysLoginService.java

@@ -12,6 +12,7 @@ import com.slibra.common.utils.uuid.IdUtils;
 import com.slibra.framework.security.authentication.SmsCodeAuthenticationToken;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -72,6 +73,10 @@ public class SysLoginService
     @Autowired
     private ApplicationProperties properties ;
 
+    // 是否允许账户多终端同时登录(true允许 false不允许)
+    @Value("${token.soloLogin}")
+    private boolean soloLogin;
+
     /**
      * 登录验证
      * 
@@ -121,6 +126,18 @@ public class SysLoginService
         AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
         recordLoginInfo(loginUser.getUserId());
+        //2024年12月18日16:56:45 账户不允许多终端登录
+        if (!soloLogin)
+        {
+            // 如果用户不允许多终端同时登录,清除缓存信息
+            String userIdKey = Constants.LOGIN_USERID_KEY + loginUser.getUser().getUserId();
+            String userKey = redisCache.getCacheObject(userIdKey);
+            if (StringUtils.isNotEmpty(userKey))
+            {
+                redisCache.deleteObject(userIdKey);
+                redisCache.deleteObject(userKey);
+            }
+        }
         // 生成token
         return tokenService.createToken(loginUser);
     }

+ 51 - 1
slibra-framework/src/main/java/com/slibra/framework/web/service/TokenService.java

@@ -46,6 +46,11 @@ public class TokenService
     @Value("${token.expireTime}")
     private int expireTime;
 
+    // 是否允许账户多终端同时登录(true允许 false不允许)
+    @Value("${token.soloLogin}")
+    private boolean soloLogin;
+
+
     protected static final long MILLIS_SECOND = 1000;
 
     protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
@@ -97,15 +102,38 @@ public class TokenService
     /**
      * 删除用户身份信息
      */
-    public void delLoginUser(String token)
+    /*public void delLoginUser(String token)
     {
         if (StringUtils.isNotEmpty(token))
         {
             String userKey = getTokenKey(token);
             redisCache.deleteObject(userKey);
         }
+    }*/
+
+    /**
+     * 删除用户身份信息
+     */
+    public void delLoginUser(String token, Long userId)
+    {
+        if (StringUtils.isNotEmpty(token))
+        {
+            String userKey = getTokenKey(token);
+            redisCache.deleteObject(userKey);
+        }
+        if (!soloLogin && StringUtils.isNotNull(userId))
+        {
+            String userIdKey = getUserIdKey(userId);
+            redisCache.deleteObject(userIdKey);
+        }
+    }
+
+    private String getUserIdKey(Long userId)
+    {
+        return Constants.LOGIN_USERID_KEY + userId;
     }
 
+
     /**
      * 创建令牌
      *
@@ -140,6 +168,22 @@ public class TokenService
         }
     }
 
+    /**
+     * 刷新令牌有效期
+     *
+     * @param loginUser 登录信息
+     */
+    /*public void refreshToken(LoginUser loginUser)
+    {
+        loginUser.setLoginTime(System.currentTimeMillis());
+        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
+        // 根据uuid将loginUser缓存
+        String userKey = getTokenKey(loginUser.getToken());
+        redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
+    }*/
+
+
+
     /**
      * 刷新令牌有效期
      *
@@ -152,6 +196,12 @@ public class TokenService
         // 根据uuid将loginUser缓存
         String userKey = getTokenKey(loginUser.getToken());
         redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
+        if (!soloLogin)
+        {
+            // 缓存用户唯一标识,防止同一帐号,同时登录
+            String userIdKey = getUserIdKey(loginUser.getUser().getUserId());
+            redisCache.setCacheObject(userIdKey, userKey, expireTime, TimeUnit.MINUTES);
+        }
     }
 
     /**