Spaces:
Running
Running
Commit ·
7e4a9fd
1
Parent(s): ba29303
refactor: update user role handling to use string identifiers instead of enum values
Browse files
app/auth/controllers/router.py
CHANGED
|
@@ -141,20 +141,20 @@ async def login(
|
|
| 141 |
headers={"WWW-Authenticate": "Bearer"}
|
| 142 |
)
|
| 143 |
|
| 144 |
-
logger.info(f"User authenticated: {user.username}, role: {user.role
|
| 145 |
|
| 146 |
# Fetch permissions from SCM access roles collection based on user role
|
| 147 |
-
scm_permissions = await user_service.get_scm_permissions_by_role(user.role
|
| 148 |
|
| 149 |
if scm_permissions:
|
| 150 |
logger.info(f"SCM permissions loaded: {list(scm_permissions.keys())}")
|
| 151 |
else:
|
| 152 |
-
logger.warning(f"No SCM permissions found for role: {user.role
|
| 153 |
|
| 154 |
# Create tokens
|
| 155 |
access_token_expires = timedelta(minutes=30)
|
| 156 |
access_token = user_service.create_access_token(
|
| 157 |
-
data={"sub": user.user_id, "username": user.username, "role": user.role
|
| 158 |
expires_delta=access_token_expires
|
| 159 |
)
|
| 160 |
|
|
@@ -173,7 +173,7 @@ async def login(
|
|
| 173 |
"email": user.email,
|
| 174 |
"first_name": user.first_name,
|
| 175 |
"last_name": user.last_name,
|
| 176 |
-
"role": user.role
|
| 177 |
"status": user.status.value,
|
| 178 |
"last_login_at": user.last_login_at,
|
| 179 |
"metadata": user.metadata
|
|
@@ -243,8 +243,8 @@ async def refresh_token(
|
|
| 243 |
|
| 244 |
# Create new access token
|
| 245 |
access_token_expires = timedelta(minutes=30)
|
| 246 |
-
|
| 247 |
-
data={"sub": user_id, "username": username, "role": user.role
|
| 248 |
expires_delta=access_token_expires
|
| 249 |
)
|
| 250 |
|
|
@@ -277,7 +277,7 @@ async def get_current_user_info(
|
|
| 277 |
"email": current_user.email,
|
| 278 |
"first_name": current_user.first_name,
|
| 279 |
"last_name": current_user.last_name,
|
| 280 |
-
"role": current_user.role
|
| 281 |
"permissions": current_user.permissions,
|
| 282 |
"status": current_user.status.value,
|
| 283 |
"last_login_at": current_user.last_login_at,
|
|
|
|
| 141 |
headers={"WWW-Authenticate": "Bearer"}
|
| 142 |
)
|
| 143 |
|
| 144 |
+
logger.info(f"User authenticated: {user.username}, role: {user.role}")
|
| 145 |
|
| 146 |
# Fetch permissions from SCM access roles collection based on user role
|
| 147 |
+
scm_permissions = await user_service.get_scm_permissions_by_role(user.role)
|
| 148 |
|
| 149 |
if scm_permissions:
|
| 150 |
logger.info(f"SCM permissions loaded: {list(scm_permissions.keys())}")
|
| 151 |
else:
|
| 152 |
+
logger.warning(f"No SCM permissions found for role: {user.role}")
|
| 153 |
|
| 154 |
# Create tokens
|
| 155 |
access_token_expires = timedelta(minutes=30)
|
| 156 |
access_token = user_service.create_access_token(
|
| 157 |
+
data={"sub": user.user_id, "username": user.username, "role": user.role},
|
| 158 |
expires_delta=access_token_expires
|
| 159 |
)
|
| 160 |
|
|
|
|
| 173 |
"email": user.email,
|
| 174 |
"first_name": user.first_name,
|
| 175 |
"last_name": user.last_name,
|
| 176 |
+
"role": user.role,
|
| 177 |
"status": user.status.value,
|
| 178 |
"last_login_at": user.last_login_at,
|
| 179 |
"metadata": user.metadata
|
|
|
|
| 243 |
|
| 244 |
# Create new access token
|
| 245 |
access_token_expires = timedelta(minutes=30)
|
| 246 |
+
new_access_token = user_service.create_access_token(
|
| 247 |
+
data={"sub": user_id, "username": username, "role": user.role},
|
| 248 |
expires_delta=access_token_expires
|
| 249 |
)
|
| 250 |
|
|
|
|
| 277 |
"email": current_user.email,
|
| 278 |
"first_name": current_user.first_name,
|
| 279 |
"last_name": current_user.last_name,
|
| 280 |
+
"role": current_user.role,
|
| 281 |
"permissions": current_user.permissions,
|
| 282 |
"status": current_user.status.value,
|
| 283 |
"last_login_at": current_user.last_login_at,
|
app/core/db_init.py
CHANGED
|
@@ -100,8 +100,8 @@ async def create_initial_users(db):
|
|
| 100 |
{
|
| 101 |
"user_id": "usr_superadmin_001",
|
| 102 |
"username": "superadmin",
|
| 103 |
-
"email": "superadmin@
|
| 104 |
-
"password_hash": pwd_context.hash("SuperAdmin@123"),
|
| 105 |
"first_name": "Super",
|
| 106 |
"last_name": "Admin",
|
| 107 |
"phone": "+919999999999",
|
|
@@ -127,8 +127,8 @@ async def create_initial_users(db):
|
|
| 127 |
{
|
| 128 |
"user_id": "usr_admin_001",
|
| 129 |
"username": "admin",
|
| 130 |
-
"email": "admin@
|
| 131 |
-
"password_hash": pwd_context.hash("CompanyAdmin@123"),
|
| 132 |
"first_name": "Company",
|
| 133 |
"last_name": "Admin",
|
| 134 |
"phone": "+919999999998",
|
|
@@ -161,5 +161,5 @@ async def create_initial_users(db):
|
|
| 161 |
logger.info(f" ⊳ User exists: {user['email']}")
|
| 162 |
|
| 163 |
logger.info("\n📝 Default Credentials:")
|
| 164 |
-
logger.info(" superadmin@
|
| 165 |
-
logger.info(" admin@
|
|
|
|
| 100 |
{
|
| 101 |
"user_id": "usr_superadmin_001",
|
| 102 |
"username": "superadmin",
|
| 103 |
+
"email": "superadmin@cuatrolabs.com",
|
| 104 |
+
"password_hash": pwd_context.hash("SuperAdmin@123!"),
|
| 105 |
"first_name": "Super",
|
| 106 |
"last_name": "Admin",
|
| 107 |
"phone": "+919999999999",
|
|
|
|
| 127 |
{
|
| 128 |
"user_id": "usr_admin_001",
|
| 129 |
"username": "admin",
|
| 130 |
+
"email": "admin@cuatrolabs.com",
|
| 131 |
+
"password_hash": pwd_context.hash("CompanyAdmin@123!"),
|
| 132 |
"first_name": "Company",
|
| 133 |
"last_name": "Admin",
|
| 134 |
"phone": "+919999999998",
|
|
|
|
| 161 |
logger.info(f" ⊳ User exists: {user['email']}")
|
| 162 |
|
| 163 |
logger.info("\n📝 Default Credentials:")
|
| 164 |
+
logger.info(" superadmin@cuatrolabs.com / SuperAdmin@123")
|
| 165 |
+
logger.info(" admin@cuatrolabs.com / CompanyAdmin@123")
|
app/dependencies/auth.py
CHANGED
|
@@ -75,7 +75,7 @@ async def require_admin_role(
|
|
| 75 |
current_user: SystemUserModel = Depends(get_current_user)
|
| 76 |
) -> SystemUserModel:
|
| 77 |
"""Require admin or super_admin role."""
|
| 78 |
-
if current_user.role not in [
|
| 79 |
raise HTTPException(
|
| 80 |
status_code=status.HTTP_403_FORBIDDEN,
|
| 81 |
detail="Admin privileges required"
|
|
@@ -87,7 +87,7 @@ async def require_super_admin_role(
|
|
| 87 |
current_user: SystemUserModel = Depends(get_current_user)
|
| 88 |
) -> SystemUserModel:
|
| 89 |
"""Require super_admin role."""
|
| 90 |
-
if current_user.role !=
|
| 91 |
raise HTTPException(
|
| 92 |
status_code=status.HTTP_403_FORBIDDEN,
|
| 93 |
detail="Super admin privileges required"
|
|
@@ -101,7 +101,7 @@ def require_permission(permission: str):
|
|
| 101 |
current_user: SystemUserModel = Depends(get_current_user)
|
| 102 |
) -> SystemUserModel:
|
| 103 |
if (permission not in current_user.permissions and
|
| 104 |
-
current_user.role not in [
|
| 105 |
raise HTTPException(
|
| 106 |
status_code=status.HTTP_403_FORBIDDEN,
|
| 107 |
detail=f"Permission '{permission}' required"
|
|
|
|
| 75 |
current_user: SystemUserModel = Depends(get_current_user)
|
| 76 |
) -> SystemUserModel:
|
| 77 |
"""Require admin or super_admin role."""
|
| 78 |
+
if current_user.role not in ["admin", "super_admin"]:
|
| 79 |
raise HTTPException(
|
| 80 |
status_code=status.HTTP_403_FORBIDDEN,
|
| 81 |
detail="Admin privileges required"
|
|
|
|
| 87 |
current_user: SystemUserModel = Depends(get_current_user)
|
| 88 |
) -> SystemUserModel:
|
| 89 |
"""Require super_admin role."""
|
| 90 |
+
if current_user.role != "super_admin":
|
| 91 |
raise HTTPException(
|
| 92 |
status_code=status.HTTP_403_FORBIDDEN,
|
| 93 |
detail="Super admin privileges required"
|
|
|
|
| 101 |
current_user: SystemUserModel = Depends(get_current_user)
|
| 102 |
) -> SystemUserModel:
|
| 103 |
if (permission not in current_user.permissions and
|
| 104 |
+
current_user.role not in ["admin", "super_admin"]):
|
| 105 |
raise HTTPException(
|
| 106 |
status_code=status.HTTP_403_FORBIDDEN,
|
| 107 |
detail=f"Permission '{permission}' required"
|
app/system_users/controllers/router.py
CHANGED
|
@@ -69,7 +69,7 @@ async def login(
|
|
| 69 |
access_token_expires = timedelta(hours=24) # Longer expiry for remember me
|
| 70 |
|
| 71 |
access_token = user_service.create_access_token(
|
| 72 |
-
data={"sub": user.user_id, "username": user.username, "role_id": user.role
|
| 73 |
expires_delta=access_token_expires
|
| 74 |
)
|
| 75 |
|
|
|
|
| 69 |
access_token_expires = timedelta(hours=24) # Longer expiry for remember me
|
| 70 |
|
| 71 |
access_token = user_service.create_access_token(
|
| 72 |
+
data={"sub": user.user_id, "username": user.username, "role_id": user.role},
|
| 73 |
expires_delta=access_token_expires
|
| 74 |
)
|
| 75 |
|
app/system_users/models/model.py
CHANGED
|
@@ -64,7 +64,7 @@ class SystemUserModel(BaseModel):
|
|
| 64 |
phone: Optional[str] = Field(None, description="User phone number (E.164 format)")
|
| 65 |
|
| 66 |
# Authorization
|
| 67 |
-
|
| 68 |
permissions: Dict[str, List[str]] = Field(default_factory=dict, description="Grouped permissions by module")
|
| 69 |
|
| 70 |
# Status and security
|
|
|
|
| 64 |
phone: Optional[str] = Field(None, description="User phone number (E.164 format)")
|
| 65 |
|
| 66 |
# Authorization
|
| 67 |
+
role: str = Field(..., description="User role identifier")
|
| 68 |
permissions: Dict[str, List[str]] = Field(default_factory=dict, description="Grouped permissions by module")
|
| 69 |
|
| 70 |
# Status and security
|
app/system_users/schemas/schema.py
CHANGED
|
@@ -29,7 +29,7 @@ class UserInfoResponse(BaseModel):
|
|
| 29 |
email: str = Field(..., description="Email address")
|
| 30 |
first_name: str = Field(..., description="First name")
|
| 31 |
last_name: Optional[str] = Field(None, description="Last name")
|
| 32 |
-
role:
|
| 33 |
permissions: Dict[str, List[str]] = Field(default_factory=dict, description="User permissions")
|
| 34 |
status: UserStatus = Field(..., description="Account status")
|
| 35 |
last_login_at: Optional[datetime] = Field(None, description="Last login timestamp")
|
|
@@ -44,7 +44,7 @@ class CreateUserRequest(BaseModel):
|
|
| 44 |
first_name: str = Field(..., description="First name", min_length=1, max_length=50)
|
| 45 |
last_name: Optional[str] = Field(None, description="Last name", max_length=50)
|
| 46 |
phone: Optional[str] = Field(None, description="Phone number")
|
| 47 |
-
role:
|
| 48 |
permissions: Dict[str, List[str]] = Field(default_factory=dict, description="Additional permissions")
|
| 49 |
|
| 50 |
@validator('username')
|
|
@@ -71,7 +71,7 @@ class UpdateUserRequest(BaseModel):
|
|
| 71 |
first_name: Optional[str] = Field(None, description="First name", min_length=1, max_length=50)
|
| 72 |
last_name: Optional[str] = Field(None, description="Last name", max_length=50)
|
| 73 |
phone: Optional[str] = Field(None, description="Phone number")
|
| 74 |
-
role: Optional[
|
| 75 |
permissions: Optional[Dict[str, List[str]]] = Field(None, description="User permissions")
|
| 76 |
status: Optional[UserStatus] = Field(None, description="Account status")
|
| 77 |
timezone: Optional[str] = Field(None, description="User timezone")
|
|
|
|
| 29 |
email: str = Field(..., description="Email address")
|
| 30 |
first_name: str = Field(..., description="First name")
|
| 31 |
last_name: Optional[str] = Field(None, description="Last name")
|
| 32 |
+
role: str = Field(..., description="User role")
|
| 33 |
permissions: Dict[str, List[str]] = Field(default_factory=dict, description="User permissions")
|
| 34 |
status: UserStatus = Field(..., description="Account status")
|
| 35 |
last_login_at: Optional[datetime] = Field(None, description="Last login timestamp")
|
|
|
|
| 44 |
first_name: str = Field(..., description="First name", min_length=1, max_length=50)
|
| 45 |
last_name: Optional[str] = Field(None, description="Last name", max_length=50)
|
| 46 |
phone: Optional[str] = Field(None, description="Phone number")
|
| 47 |
+
role: str = Field(default="user", description="User role")
|
| 48 |
permissions: Dict[str, List[str]] = Field(default_factory=dict, description="Additional permissions")
|
| 49 |
|
| 50 |
@validator('username')
|
|
|
|
| 71 |
first_name: Optional[str] = Field(None, description="First name", min_length=1, max_length=50)
|
| 72 |
last_name: Optional[str] = Field(None, description="Last name", max_length=50)
|
| 73 |
phone: Optional[str] = Field(None, description="Phone number")
|
| 74 |
+
role: Optional[str] = Field(None, description="User role")
|
| 75 |
permissions: Optional[Dict[str, List[str]]] = Field(None, description="User permissions")
|
| 76 |
status: Optional[UserStatus] = Field(None, description="Account status")
|
| 77 |
timezone: Optional[str] = Field(None, description="User timezone")
|