Décrivant l'université via un logiciel, j'ai été confronté à un problème d'authentification.
Auparavant, je n'avais qu'un Headmaster
qui peut faire et accéder à tout. Mais pour l'instant, j'ai besoin d'intégrer une Teacher
rôle.
En Teacher
devrait avoir la possibilité d'accéder à certaines fonctions, qui pourraient être facilement restreintes par les personnes suivantes Authorize
attribut. Mais dans certains cas, je veux réduire le nombre de données auxquelles ce rôle est autorisé à accéder, par exemple, pas tous les étudiants de l'univers, mais ceux qui étudient Teacher's
Subject
.
Tout ceci est déjà décrit dans EF, (par exemple, les relations professeur-sujet, sujet-étudiants). Mais maintenant, j'ai du mal à refuser (retour 403) les demandes pour les sujets ou les étudiants qui ne sont pas autorisés à accéder par Teacher
.
J'ai pensé à l'utilisation d'un modèle de spécification pour mes services, de sorte que les données résultantes seront réduites avec le filtre d'une spécification, car il aide à réduire la quantité de données, parfois à aucune donnée, mais n'a pas aidé à refuser complètement une demande.
Pourriez-vous me fournir un lien ou une idée d'architecture permettant de répondre aux attentes pour les deux cas d'utilisation spécifiés ci-dessus ?
// entity models
class Subject {
...
public Teacher Teacher { get; set; }
public List<Students> { get; set; }
...
}
class Teacher {
...
public List<Subject> Subjects { get; set; }
...
}
class Student {
...
public List<Subject> StudiedSubjects {get; set; }
...
}
// first use-case I want to solve
public ActionResult<List<Student>> GetStudent()
{
// previously I just did
return Ok(_studentsService.GetStudents());
// but as for now in case of Teacher role accessed the method I want to
// reduce the number of returned students
}
// second use-case I want to solve
public ActionResult<Subject> GetSubjectDetails(int subjectId)
{
// previously I just did
return Ok(_subjectService.GetSubject(subjectId);
// but as for now in case of Teacher role I need to check whether its
// allowed to get the subject and return Access denied in case its not
}