mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-10-06 23:02:49 +03:00
Enhance user roles to limit camera access (#20024)
* update config for roles and add validator * ensure admin and viewer are never overridden * add class method to user to retrieve all allowed cameras * enforce config roles in auth api endpoints * add camera access api dependency functions * protect review endpoints * protect preview endpoints * rename param name for better fastapi injection matching * remove unneeded * protect export endpoints * protect event endpoints * protect media endpoints * update auth hook for allowed cameras * update default app view * ensure anonymous user always returns all cameras * limit cameras in explore * cameras is already a list * limit cameras in review/history * limit cameras in live view * limit cameras in camera groups * only show face library and classification in sidebar for admin * remove check in delete reviews since admin role is required, no need to check camera access. fixes failing test * pass request with camera access for tests * more async * camera access tests * fix proxy auth tests * allowed cameras for review tests * combine event tests and refactor for camera access * fix post validation for roles * don't limit roles in create user dialog * fix triggers endpoints no need to run require camera access dep since the required role is admin * fix type * create and edit role dialogs * delete role dialog * fix role change dialog * update settings view for roles * i18n changes * minor spacing tweaks * docs * use badges and camera name label component * clarify docs * display all cameras badge for admin and viewer * i18n fix * use validator to prevent reserved and empty roles from being assigned * split users and roles into separate tabs in settings * tweak docs * clarify docs * change icon * don't memoize roles always recalculate on component render
This commit is contained in:
@@ -135,6 +135,18 @@ class User(Model):
|
||||
password_hash = CharField(null=False, max_length=120)
|
||||
notification_tokens = JSONField()
|
||||
|
||||
@classmethod
|
||||
def get_allowed_cameras(
|
||||
cls, role: str, roles_dict: dict[str, list[str]], all_camera_names: set[str]
|
||||
) -> list[str]:
|
||||
if role not in roles_dict:
|
||||
return [] # Invalid role grants no access
|
||||
allowed = roles_dict[role]
|
||||
if not allowed: # Empty list means all cameras
|
||||
return list(all_camera_names)
|
||||
|
||||
return [cam for cam in allowed if cam in all_camera_names]
|
||||
|
||||
|
||||
class Trigger(Model):
|
||||
camera = CharField(max_length=20)
|
||||
|
||||
Reference in New Issue
Block a user