feat: add computer name-based silent login (无感登录)
Implement automatic authentication based on computer name to enable passwordless login for registered computers with fallback to manual authentication. Changes: - Add SessionManager.login_by_computer_name() for silent login attempt - Add BIPUsersDAO.authenticate_by_computer_name() for computer name lookup - Update BIPUsersDAO.create_user() to support optional computer_name parameter - Update main_ui.py to try silent login before showing login dialog - Display current computer name in login dialog for user reference Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -49,6 +49,44 @@ class BIPUsersDAO(BaseDAO):
|
||||
}
|
||||
return None
|
||||
|
||||
def authenticate_by_computer_name(self, computer_name: str) -> Optional[Dict[str, Any]]:
|
||||
"""
|
||||
Authenticate a user using computer name (silent login)
|
||||
|
||||
Args:
|
||||
computer_name: The computer name to authenticate
|
||||
|
||||
Returns:
|
||||
Dict with user info if authentication successful, None otherwise
|
||||
Returns: {id, username, user_type}
|
||||
"""
|
||||
table_name = self._convert_sql('[dbo].[BIPUsers]')
|
||||
placeholder = self._get_placeholder()
|
||||
|
||||
# Note: Column name is 'ComputerNmae' (typo in database schema)
|
||||
if self._db_type == DatabaseType.MYSQL:
|
||||
sql = f"""
|
||||
SELECT ID, UserName, UserType
|
||||
FROM {table_name}
|
||||
WHERE ComputerNmae = {placeholder}
|
||||
"""
|
||||
else:
|
||||
sql = f"""
|
||||
SELECT [ID], [UserName], [UserType]
|
||||
FROM {table_name}
|
||||
WHERE [ComputerNmae] = {placeholder}
|
||||
"""
|
||||
|
||||
with get_connection() as db:
|
||||
results = db.execute_query(sql, (computer_name,))
|
||||
if results:
|
||||
return {
|
||||
'id': results[0]['ID'],
|
||||
'username': results[0]['UserName'],
|
||||
'user_type': results[0]['UserType']
|
||||
}
|
||||
return None
|
||||
|
||||
def get_all_users(self) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
Get all users from the database
|
||||
@@ -84,14 +122,15 @@ class BIPUsersDAO(BaseDAO):
|
||||
for row in results
|
||||
]
|
||||
|
||||
def create_user(self, username: str, password: str, user_type: str) -> bool:
|
||||
def create_user(self, username: str, password: str, user_type: str, computer_name: str = '') -> bool:
|
||||
"""
|
||||
Create a new user
|
||||
Create a new user with optional computer name for silent login
|
||||
|
||||
Args:
|
||||
username: The username (must be unique)
|
||||
password: The password (plain text for internal tool)
|
||||
user_type: User type ('Admin', 'User', or 'Guest')
|
||||
computer_name: Optional computer name for silent login (default: '')
|
||||
|
||||
Returns:
|
||||
True if successful, False otherwise
|
||||
@@ -101,19 +140,35 @@ class BIPUsersDAO(BaseDAO):
|
||||
|
||||
# 根据数据库类型选择列名格式
|
||||
if self._db_type == DatabaseType.MYSQL:
|
||||
sql = f"""
|
||||
INSERT INTO {table_name} (UserName, Password, UserType)
|
||||
VALUES ({placeholder}, {placeholder}, {placeholder})
|
||||
"""
|
||||
if computer_name:
|
||||
sql = f"""
|
||||
INSERT INTO {table_name} (UserName, Password, UserType, ComputerNmae)
|
||||
VALUES ({placeholder}, {placeholder}, {placeholder}, {placeholder})
|
||||
"""
|
||||
params = (username, password, user_type, computer_name)
|
||||
else:
|
||||
sql = f"""
|
||||
INSERT INTO {table_name} (UserName, Password, UserType)
|
||||
VALUES ({placeholder}, {placeholder}, {placeholder})
|
||||
"""
|
||||
params = (username, password, user_type)
|
||||
else:
|
||||
sql = f"""
|
||||
INSERT INTO {table_name} ([UserName], [Password], [UserType])
|
||||
VALUES ({placeholder}, {placeholder}, {placeholder})
|
||||
"""
|
||||
if computer_name:
|
||||
sql = f"""
|
||||
INSERT INTO {table_name} ([UserName], [Password], [UserType], [ComputerNmae])
|
||||
VALUES ({placeholder}, {placeholder}, {placeholder}, {placeholder})
|
||||
"""
|
||||
params = (username, password, user_type, computer_name)
|
||||
else:
|
||||
sql = f"""
|
||||
INSERT INTO {table_name} ([UserName], [Password], [UserType])
|
||||
VALUES ({placeholder}, {placeholder}, {placeholder})
|
||||
"""
|
||||
params = (username, password, user_type)
|
||||
|
||||
try:
|
||||
with get_connection() as db:
|
||||
db.execute_update(sql, (username, password, user_type))
|
||||
db.execute_update(sql, params)
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"Error creating user: {e}")
|
||||
|
||||
Reference in New Issue
Block a user