加入用户登录体系,session cookie 鉴权,默认账号 admin/admin123
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import hashlib
|
||||
import os
|
||||
from datetime import date
|
||||
from sqlalchemy import String, Integer, Float, Date, ForeignKey, Boolean, UniqueConstraint
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
@@ -60,3 +62,28 @@ class PositionSnapshot(Base):
|
||||
position: Mapped[int] = mapped_column(Integer)
|
||||
delta: Mapped[int] = mapped_column(Integer, default=0)
|
||||
avg_cost: Mapped[float] = mapped_column(Float)
|
||||
|
||||
|
||||
|
||||
class User(Base):
|
||||
__tablename__ = "users"
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
username: Mapped[str] = mapped_column(String(50), unique=True)
|
||||
password_hash: Mapped[str] = mapped_column(String(128))
|
||||
role: Mapped[str] = mapped_column(String(20), default="user")
|
||||
|
||||
@staticmethod
|
||||
def hash_password(password: str) -> str:
|
||||
salt = os.urandom(16)
|
||||
dk = hashlib.pbkdf2_hmac("sha256", password.encode(), salt, 100000)
|
||||
return salt.hex() + ":" + dk.hex()
|
||||
|
||||
def check_password(self, password: str) -> bool:
|
||||
try:
|
||||
salt_hex, dk_hex = self.password_hash.split(":")
|
||||
salt = bytes.fromhex(salt_hex)
|
||||
dk = hashlib.pbkdf2_hmac("sha256", password.encode(), salt, 100000)
|
||||
return dk.hex() == dk_hex
|
||||
except (ValueError, AttributeError):
|
||||
return False
|
||||
Reference in New Issue
Block a user