diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/pojo/UserWithPassword.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/pojo/UserWithPassword.java
index fc5dfbd05..4da31dac0 100644
--- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/pojo/UserWithPassword.java
+++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/pojo/UserWithPassword.java
@@ -24,7 +24,7 @@ public class UserWithPassword extends User {
public UserWithPassword(Long id, String name, String displayName, String email, String password,
Integer isAdmin) {
- super(id, name, displayName, email, isAdmin);
+ super(id, name, displayName, email, isAdmin, null);
this.password = password;
}
diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/adaptor/DefaultUserAdaptor.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/adaptor/DefaultUserAdaptor.java
index fb54432a5..9e1064b50 100644
--- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/adaptor/DefaultUserAdaptor.java
+++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/adaptor/DefaultUserAdaptor.java
@@ -18,6 +18,7 @@ import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
+import java.sql.Timestamp;
import java.util.List;
import java.util.Optional;
import java.util.Set;
@@ -102,7 +103,9 @@ public class DefaultUserAdaptor implements UserAdaptor {
TokenService tokenService = ContextUtils.getBean(TokenService.class);
try {
UserWithPassword user = getUserWithPassword(userReq);
- return tokenService.generateToken(UserWithPassword.convert(user), appKey);
+ String token = tokenService.generateToken(UserWithPassword.convert(user), appKey);
+ updateLastLogin(userReq.getName());
+ return token;
} catch (Exception e) {
log.error("", e);
throw new RuntimeException("password encrypt error, please try again");
@@ -267,4 +270,11 @@ public class DefaultUserAdaptor implements UserAdaptor {
userToken.setExpireDate(userTokenDO.getExpireDateTime());
return userToken;
}
+
+ private void updateLastLogin(String userName) {
+ UserRepository userRepository = ContextUtils.getBean(UserRepository.class);
+ UserDO userDO = userRepository.getUser(userName);
+ userDO.setLastLogin(new Timestamp(System.currentTimeMillis()));
+ userRepository.updateUser(userDO);
+ }
}
diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/persistence/dataobject/UserDO.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/persistence/dataobject/UserDO.java
index 341119b59..bc5d684ad 100644
--- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/persistence/dataobject/UserDO.java
+++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/persistence/dataobject/UserDO.java
@@ -3,7 +3,11 @@ package com.tencent.supersonic.auth.authentication.persistence.dataobject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import java.sql.Timestamp;
+
+@Data
@TableName("s2_user")
public class UserDO {
@@ -27,71 +31,25 @@ public class UserDO {
/** */
private Integer isAdmin;
- /** @return id */
- public Long getId() {
- return id;
- }
-
- /** @param id */
- public void setId(Long id) {
- this.id = id;
- }
-
- /** @return name */
- public String getName() {
- return name;
- }
+ private Timestamp lastLogin;
/** @param name */
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
- /** @return password */
- public String getPassword() {
- return password;
- }
-
/** @param password */
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
- public String getSalt() {
- return salt;
- }
-
public void setSalt(String salt) {
this.salt = salt == null ? null : salt.trim();
}
- /** @return display_name */
- public String getDisplayName() {
- return displayName;
- }
-
- /** @param displayName */
- public void setDisplayName(String displayName) {
- this.displayName = displayName == null ? null : displayName.trim();
- }
-
- /** @return email */
- public String getEmail() {
- return email;
- }
-
/** @param email */
public void setEmail(String email) {
this.email = email == null ? null : email.trim();
}
- /** @return is_admin */
- public Integer getIsAdmin() {
- return isAdmin;
- }
-
- /** @param isAdmin */
- public void setIsAdmin(Integer isAdmin) {
- this.isAdmin = isAdmin;
- }
}
diff --git a/auth/authentication/src/main/resources/mapper/UserDOMapper.xml b/auth/authentication/src/main/resources/mapper/UserDOMapper.xml
index 4bb7ada14..64f9e7040 100644
--- a/auth/authentication/src/main/resources/mapper/UserDOMapper.xml
+++ b/auth/authentication/src/main/resources/mapper/UserDOMapper.xml
@@ -136,6 +136,9 @@
is_admin = #{isAdmin,jdbcType=INTEGER},
+
+ last_login = #{lastLogin,jdbcType=TIMESTAMP},
+
where id = #{id,jdbcType=BIGINT}
diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/User.java b/common/src/main/java/com/tencent/supersonic/common/pojo/User.java
index b85194984..2d947033d 100644
--- a/common/src/main/java/com/tencent/supersonic/common/pojo/User.java
+++ b/common/src/main/java/com/tencent/supersonic/common/pojo/User.java
@@ -6,6 +6,7 @@ import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
+import java.sql.Timestamp;
@Data
@NoArgsConstructor
@@ -22,26 +23,28 @@ public class User implements Serializable {
private Integer isAdmin;
+ private Timestamp lastLogin;
+
public static User get(Long id, String name, String displayName, String email,
Integer isAdmin) {
- return new User(id, name, displayName, email, isAdmin);
+ return new User(id, name, displayName, email, isAdmin, null);
}
public static User get(Long id, String name) {
- return new User(id, name, name, name, 0);
+ return new User(id, name, name, name, 0, null);
}
public static User getDefaultUser() {
- return new User(1L, "admin", "admin", "admin@email", 1);
+ return new User(1L, "admin", "admin", "admin@email", 1, null);
}
public static User getVisitUser() {
- return new User(1L, "visit", "visit", "visit@email", 0);
+ return new User(1L, "visit", "visit", "visit@email", 0, null);
}
public static User getAppUser(int appId) {
String name = String.format("app_%s", appId);
- return new User(1L, name, name, "", 1);
+ return new User(1L, name, name, "", 1, null);
}
public String getDisplayName() {
diff --git a/launchers/standalone/src/main/resources/config.update/sql-update-mysql.sql b/launchers/standalone/src/main/resources/config.update/sql-update-mysql.sql
index 8c4b195bb..b7b6c1b9b 100644
--- a/launchers/standalone/src/main/resources/config.update/sql-update-mysql.sql
+++ b/launchers/standalone/src/main/resources/config.update/sql-update-mysql.sql
@@ -417,4 +417,7 @@ ALTER TABLE s2_model_rela alter column join_condition type text;
--20250310
ALTER TABLE s2_chat_model add column is_open tinyint DEFAULT NULL COMMENT '是否公开';
-ALTER TABLE s2_database add column is_open tinyint DEFAULT NULL COMMENT '是否公开';
\ No newline at end of file
+ALTER TABLE s2_database add column is_open tinyint DEFAULT NULL COMMENT '是否公开';
+
+--20250321
+ALTER TABLE s2_user add column last_loin datetime DEFAULT NULL;
\ No newline at end of file
diff --git a/launchers/standalone/src/main/resources/db/schema-h2.sql b/launchers/standalone/src/main/resources/db/schema-h2.sql
index d5fc98c5e..13928d300 100644
--- a/launchers/standalone/src/main/resources/db/schema-h2.sql
+++ b/launchers/standalone/src/main/resources/db/schema-h2.sql
@@ -129,6 +129,7 @@ create table IF NOT EXISTS s2_user
salt varchar(256) NULL,
email varchar(100) null,
is_admin INT null,
+ last_login TIMESTAMP NULL,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_user IS 'user information table';
diff --git a/launchers/standalone/src/main/resources/db/schema-mysql.sql b/launchers/standalone/src/main/resources/db/schema-mysql.sql
index 1e40d493f..712ad6f3f 100644
--- a/launchers/standalone/src/main/resources/db/schema-mysql.sql
+++ b/launchers/standalone/src/main/resources/db/schema-mysql.sql
@@ -388,6 +388,7 @@ CREATE TABLE IF NOT EXISTS s2_user
salt varchar(256) DEFAULT NULL COMMENT 'md5密码盐',
email varchar(100) null,
is_admin tinyint null,
+ last_login datetime DEFAULT NULL,
UNIQUE (`name`),
PRIMARY KEY (`id`)
);
diff --git a/launchers/standalone/src/main/resources/db/schema-postgres.sql b/launchers/standalone/src/main/resources/db/schema-postgres.sql
index aac79316e..c5f7e96da 100644
--- a/launchers/standalone/src/main/resources/db/schema-postgres.sql
+++ b/launchers/standalone/src/main/resources/db/schema-postgres.sql
@@ -498,5 +498,6 @@ CREATE TABLE IF NOT EXISTS s2_user (
salt varchar(256) DEFAULT NULL,
email varchar(100) NULL,
is_admin smallint NULL,
+ last_login timestamp NULL,
UNIQUE(name)
);
\ No newline at end of file