user.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. import uuid
  2. import logging
  3. import hashlib
  4. from typing import Optional
  5. def hash_pwd(password):
  6. return hashlib.sha256(password.encode()).hexdigest()
  7. logger = logging.getLogger(__name__)
  8. from datetime import datetime,timedelta
  9. from agent.models.db.user import User,Session,Role,Permission, user_roles, role_permissions
  10. from agent.models.db.sys import SysUserRoleOrgan
  11. class UserBusiness:
  12. def __init__(self, db):
  13. self.db = db
  14. def get_user(self, user_id):
  15. return self.db.query(User).filter(User.id == user_id).first()
  16. def get_user_by_username(self, username):
  17. return self.db.query(User).filter(User.username == username).first()
  18. def get_all_users(self):
  19. return self.db.query(User).all()
  20. def get_users_paginated(self, username: Optional[str], page_no: int, page_size: int):
  21. query = self.db.query(User)
  22. if username:
  23. query = query.filter(User.username.ilike(f"%{username}%"))
  24. total_count = query.count()
  25. users = query.offset((page_no - 1) * page_size).limit(page_size).all()
  26. return users, total_count
  27. def create_user(self, username, password, fullname, email=""):
  28. password = hash_pwd(password)
  29. user = User(username=username, hashed_password=password, full_name=fullname, email=email)
  30. self.db.add(user)
  31. self.db.commit()
  32. self.db.refresh(user)
  33. return user
  34. def update_user(self, user_id, username=None, password=None):
  35. user = self.get_user(user_id)
  36. if user:
  37. if username:
  38. user.username = username
  39. if password:
  40. password = hash_pwd(password)
  41. user.hashed_password = password
  42. self.db.commit()
  43. self.db.refresh(user)
  44. return user
  45. def delete_user(self, user_id):
  46. user = self.get_user(user_id)
  47. if user:
  48. self.db.delete(user)
  49. self.db.commit()
  50. return user
  51. def verify_password(self, request_password, user_hashed_password):
  52. hashed_password = hash_pwd(request_password)
  53. logger.info(f"verify password: {hashed_password} == {user_hashed_password}")
  54. return hashed_password == user_hashed_password
  55. class SessionBusiness:
  56. def __init__(self, db):
  57. self.db = db
  58. def create_session(self, user:User,sysUserRoleOrgan:SysUserRoleOrgan):
  59. session_id = str(uuid.uuid4())
  60. session = Session(session_id=session_id,user_role_organ_id=sysUserRoleOrgan.id, user_id=user.id, username=user.username, full_name=user.full_name, created=datetime.now(), updated=datetime.now())
  61. self.db.add(session)
  62. self.db.commit()
  63. self.db.refresh(session)
  64. return session
  65. def get_session(self, session_id):
  66. return self.db.query(Session).filter(Session.session_id == session_id).first()
  67. def delete_session(self, session_id):
  68. session = self.get_session(session_id)
  69. if session:
  70. self.db.delete(session)
  71. self.db.commit()
  72. return True
  73. def update_session(self, session_id):
  74. session = self.get_session(session_id)
  75. if session:
  76. session.updated = datetime.now()
  77. self.db.commit()
  78. self.db.refresh(session)
  79. def update_session_SURO(self, sess:Session):
  80. self.db.query(Session).filter(Session.id == sess.id).update({
  81. Session.user_role_organ_id : sess.user_role_organ_id,
  82. Session.updated : datetime.now()
  83. })
  84. def get_session_by_user_id(self, user_id):
  85. return self.db.query(Session).filter(Session.user_id == user_id).first()
  86. def validate_session(self, username, session_id):
  87. session = self.get_session(session_id)
  88. if session:
  89. if session.username != username:
  90. return None
  91. expired:timedelta = datetime.now() - session.updated
  92. if expired.seconds > 1800 : # 30 minutes
  93. logger.info(f"session expired: {session_id}")
  94. #self.delete_session(session_id)
  95. return None
  96. else:
  97. self.update_session(session_id)
  98. return session
  99. class RoleBusiness:
  100. def __init__(self, db):
  101. self.db = db
  102. def create_role(self, name, description=""):
  103. role = Role(name=name, description=description)
  104. self.db.add(role)
  105. self.db.commit()
  106. self.db.refresh(role)
  107. return role
  108. def get_role_by_name(self, name):
  109. return self.db.query(Role).filter(Role.name == name).first()
  110. def get_role(self, role_id):
  111. return self.db.query(Role).filter(Role.id == role_id).first()
  112. def get_all_roles(self):
  113. return self.db.query(Role).all()
  114. def delete_role(self, role_id):
  115. role = self.get_role(role_id)
  116. if role:
  117. self.db.delete(role)
  118. self.db.commit()
  119. return role
  120. def update_role(self, role_id, name=None, description=None):
  121. role = self.get_role(role_id)
  122. if role:
  123. if name:
  124. role.name = name
  125. if description:
  126. role.description = description
  127. self.db.commit()
  128. self.db.refresh(role)
  129. return role
  130. def assign_permission_to_role(self, role_id, permission_id):
  131. role = self.get_role(role_id)
  132. permission = self.db.query(Permission).filter(Permission.id == permission_id).first()
  133. if role and permission:
  134. role.permissions.append(permission)
  135. self.db.commit()
  136. return True
  137. return False
  138. def revoke_permission_from_role(self, role_id, permission_id):
  139. role = self.get_role(role_id)
  140. permission = self.db.query(Permission).filter(Permission.id == permission_id).first()
  141. if role and permission and permission in role.permissions:
  142. role.permissions.remove(permission)
  143. self.db.commit()
  144. return True
  145. return False
  146. def revoke_all_permissions_from_role(self, role_id):
  147. role = self.get_role(role_id)
  148. if role:
  149. role.permissions.clear()
  150. self.db.commit()
  151. return True
  152. return False
  153. def get_role_permissions(self, role_id):
  154. role = self.get_role(role_id)
  155. if role:
  156. return role.permissions
  157. return []
  158. class PermissionBusiness:
  159. def __init__(self, db):
  160. self.db = db
  161. def create_permission(self, name, description="", menu_name=None, menu_route=None, menu_icon=None, parent_id=None):
  162. permission = Permission(
  163. name=name,
  164. description=description,
  165. menu_name=menu_name,
  166. menu_route=menu_route,
  167. menu_icon=menu_icon,
  168. parent_id=parent_id
  169. )
  170. self.db.add(permission)
  171. self.db.commit()
  172. self.db.refresh(permission)
  173. return permission
  174. def get_permission_by_name(self, name):
  175. return self.db.query(Permission).filter(Permission.name == name).first()
  176. def get_permission(self, permission_id):
  177. return self.db.query(Permission).filter(Permission.id == permission_id).first()
  178. def get_all_permissions(self):
  179. return self.db.query(Permission).all()
  180. def delete_permission(self, permission_id):
  181. permission = self.get_permission(permission_id)
  182. if permission:
  183. self.db.delete(permission)
  184. self.db.commit()
  185. return permission
  186. class UserRoleBusiness:
  187. def __init__(self, db):
  188. self.db = db
  189. self.user_biz = UserBusiness(db)
  190. self.role_biz = RoleBusiness(db)
  191. def assign_role_to_user(self, user_id, role_id):
  192. user = self.user_biz.get_user(user_id)
  193. role = self.role_biz.get_role(role_id)
  194. if user and role:
  195. user.roles.append(role)
  196. self.db.commit()
  197. return True
  198. return False
  199. def revoke_role_from_user(self, user_id, role_id):
  200. user = self.user_biz.get_user(user_id)
  201. role = self.role_biz.get_role(role_id)
  202. if user and role and role in user.roles:
  203. user.roles.remove(role)
  204. self.db.commit()
  205. return True
  206. return False
  207. def get_user_roles(self, user_id):
  208. user = self.user_biz.get_user(user_id)
  209. if user:
  210. return user.roles
  211. return []
  212. def get_user_permissions(self, user_id):
  213. user = self.user_biz.get_user(user_id)
  214. if not user:
  215. return []
  216. permissions = set()
  217. for role in user.roles:
  218. for perm in role.permissions:
  219. permissions.add(perm)
  220. return list(permissions)
  221. def get_user_menu_permissions(self, user_id):
  222. user_permissions = self.get_user_permissions(user_id)
  223. menu_permissions = [p for p in user_permissions if p.menu_name is not None]
  224. # You might want to structure this hierarchically if you have parent_id relationships
  225. return menu_permissions
  226. def get_role_menu_permissions(self, role_id):
  227. permissions = self.role_biz.get_role_permissions(role_id)
  228. menu_permissions = [p for p in permissions if p.menu_name is not None]
  229. # You might want to structure this hierarchically if you have parent_id relationships
  230. return menu_permissions
  231. if __name__ == "__main__":
  232. print("hello world")