我的用户模型有一个字段 is_active。如果为假,则说明该用户的账户被封锁。在这种情况下如何实施访问限制?我应该拒绝用户访问某些端点吗?执行此检查的最佳地点在哪里?如果 is_active = False,它是否应该在 get_current_user 依赖项中?
我的依赖项函数 get_current_user
async def get_current_user(
db: SessionDep, token: Annotated[str, Depends(oauth2_scheme)]
) -> User:
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials",
headers={"WWW-Authenticate": "Bearer"},
)
token_data = await verify_access_token(token, credentials_exception)
result = await db.execute(select(User).where(User.id == token_data.id))
user = result.scalar_one_or_none()
if user is None:
raise credentials_exception
return user
你思路正确,在
get_current_user
依赖项中检查
is_active
是最佳实践。这样可以集中处理所有身份验证和授权逻辑,并在用户未激活时阻止对所有受保护路由的访问。
以下是改进后的代码示例:
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from sqlalchemy.orm import Session
from jose import JWTError, jwt
# ... 其他导入 ...
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
async def get_current_user(
db: Session, token: str = Depends(oauth2_scheme)
) -> User:
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials",
headers={"WWW-Authenticate": "Bearer"},
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
user_id: str = payload.get("sub")
if user_id is None:
raise credentials_exception
except JWTError:
raise credentials_exception
user = db.query(User).filter(User.id == user_id).first()
if user is None:
raise credentials_exception
# 检查用户是否激活
if not user.is_active:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Inactive user")
return user
# 使用依赖项保护路由
@app.get("/items/", response_model=List[Item])
async def read_items(current_user: User = Depends(get_current_user)):
# current_user 将始终是激活的用户
# ... 路由逻辑 ...
在这个改进版本中:
-
在
get_current_user
中检查is_active
: 在成功获取用户后,我们添加了一个检查user.is_active
的条件。如果用户未激活 (False
),则抛出一个403 Forbidden
错误。 -
集中处理错误
: 我们使用
HTTPException
来处理未经授权和禁止访问的错误,提供清晰的错误信息。 -
受保护的路由
: 所有需要身份验证和授权的路由都应该使用
Depends(get_current_user)
来获取当前用户。这确保只有激活的用户才能访问这些路由。
通过这种方式,你可以有效地限制未激活用户的访问,并在尝试访问受保护资源时提供明确的错误信息。
标签:python,jwt,fastapi From: 78802976