2024-11-19 12:08:21 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
# @Time : 2024/11/19 下午7:27
|
|
|
|
|
# @Author : 河瞬
|
|
|
|
|
# @FileName: login_reg.py
|
|
|
|
|
# @Software: PyCharm
|
|
|
|
|
from datetime import datetime, timedelta
|
2024-11-20 08:26:11 +00:00
|
|
|
from typing import Optional
|
2024-11-19 12:08:21 +00:00
|
|
|
|
2024-11-20 08:26:11 +00:00
|
|
|
from fastapi import APIRouter
|
2024-11-19 12:08:21 +00:00
|
|
|
|
|
|
|
|
from dependencies import *
|
2024-11-20 08:26:11 +00:00
|
|
|
from models import Tenant
|
2024-11-19 12:08:21 +00:00
|
|
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 生成JWT token
|
|
|
|
|
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None, settings: SettingsDep = SettingsDep):
|
|
|
|
|
to_encode = data.copy()
|
|
|
|
|
if expires_delta:
|
|
|
|
|
expire = datetime.utcnow() + expires_delta
|
|
|
|
|
else:
|
2024-11-20 14:54:43 +00:00
|
|
|
expire = datetime.utcnow() + timedelta(days=15)
|
2024-11-19 12:08:21 +00:00
|
|
|
to_encode.update({"exp": expire})
|
|
|
|
|
print(settings, type(settings))
|
|
|
|
|
encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=settings.ALGORITHM)
|
|
|
|
|
return encoded_jwt
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 登录路由
|
|
|
|
|
@router.post("/api/s1/login")
|
|
|
|
|
async def login(response: Response, user_data: dict, session: SessionDep):
|
2024-11-19 12:15:57 +00:00
|
|
|
if user_data.get('username') is None or user_data.get('password') is None:
|
|
|
|
|
raise HTTPException(status_code=401, detail="用户名或密码不能为空")
|
2024-11-19 12:08:21 +00:00
|
|
|
# 查询用户
|
|
|
|
|
user = session.exec(select(User).where(User.username == user_data['username'])).first()
|
|
|
|
|
|
|
|
|
|
# 验证用户名和密码
|
|
|
|
|
if not user or user.password != user_data['password']:
|
2024-11-19 13:23:59 +00:00
|
|
|
raise HTTPException(status_code=401, detail="登录失败,用户名或密码错误")
|
2024-11-19 12:08:21 +00:00
|
|
|
|
|
|
|
|
# 生成JWT token
|
|
|
|
|
token = create_access_token(data={"id": user.id, "role": user.role, "tanant_id": user.tenant.id})
|
|
|
|
|
|
|
|
|
|
# 设置cookie
|
2024-11-20 14:08:21 +00:00
|
|
|
response.set_cookie(
|
|
|
|
|
key="session_token",
|
|
|
|
|
value=token,
|
|
|
|
|
httponly=True,
|
|
|
|
|
# domain=".ecs2.heshunme.xyz", # 确保域正确
|
|
|
|
|
samesite="none", # 根据需要设置samesite属性
|
|
|
|
|
secure=True,
|
|
|
|
|
)
|
2024-11-19 12:08:21 +00:00
|
|
|
|
|
|
|
|
# 关闭数据库会话
|
|
|
|
|
session.close()
|
|
|
|
|
|
2024-11-20 10:15:09 +00:00
|
|
|
return {"message": f"Login successful", "role": user.role}
|
2024-11-19 13:23:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/api/s1/register")
|
|
|
|
|
async def register(data: dict, session: SessionDep):
|
2024-11-20 08:26:11 +00:00
|
|
|
if session.exec(select(Tenant).where(Tenant.name == data['name'])).first():
|
2024-11-19 13:23:59 +00:00
|
|
|
raise HTTPException(status_code=409, detail="租户名已存在")
|
2024-11-20 08:26:11 +00:00
|
|
|
if session.exec(select(User).where(User.username == data['username'])).first():
|
2024-11-19 13:23:59 +00:00
|
|
|
raise HTTPException(status_code=409, detail="用户名已存在")
|
|
|
|
|
|
|
|
|
|
tenant = Tenant(name=data['name'])
|
|
|
|
|
user = User(username=data['username'], password=data['password'], role=1, tenant=tenant)
|
|
|
|
|
session.add(tenant)
|
|
|
|
|
session.add(user)
|
2024-11-20 08:26:11 +00:00
|
|
|
session.commit()
|
2024-11-19 13:23:59 +00:00
|
|
|
session.close()
|
|
|
|
|
return {"detail": "注册成功"}
|