3 votes

Autorisation ServiceStack - Accès aux informations sur les itinéraires

Dans la documentation de ServiceStack, il est indiqué que la meilleure pratique est la suivante :

Normalement, ServiceStack appelle la méthode bool HasPermission(string permission) dans IAuthSession. Cette méthode vérifie si la liste List Permissions dans IAuthSession contient la permission requise. requise.

I remplir cette liste dans la méthode OnAuthenticated que vous avez surchargée dans la première partie de ce tutoriel.

Je suis en train d'intégrer un système existant, et j'ai mon BasicAuthProvider personnalisé qui fonctionne (hérité du BasicAuthProvider de base). L'authentification fonctionne parfaitement, maintenant je suis en train de construire la partie Autorisation. Je prévois d'utiliser la liste des permissions comme indiqué ci-dessus, mais j'ai besoin d'accéder aux informations de l'itinéraire pour déterminer si un utilisateur a accès à une ressource particulière. Je vois dans IAuthServiceBase un IRequestContext qui contient l'URL absolue, mais avant de l'analyser, je me suis dit qu'il devait y avoir un moyen d'accéder à la structure Route de ServiceStack pour me donner soit le nom de la classe du service demandé, soit le DTO auquel le service demandé est lié.

Voici la méthode OnAuthenticated de ma classe BasicAuthProvider :

public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo)
    {

        UserSession sess = (UserSession)session;

        Model.User currentUser = UserRepository.GetUserByUsername(session.UserAuthName);

        //Fill the IAuthSession with data which you want to retrieve in the app eg:
        session.FirstName = currentUser.Person.FirstName;
        session.LastName = currentUser.Person.LastName;
        session.UserName = currentUser.User1;
        sess.CurrentUser = currentUser;
        //Important: You need to save the session!
        authService.SaveSession(session, TimeSpan.FromDays(1));
    }

Sous MVC, j'ai déjà utilisé certaines des données brutes de la requête pour obtenir le nom du contrôleur et de l'action, afin de déterminer l'autorisation des ressources, mais c'est le premier projet pour lequel j'utilise ServiceStack.

2voto

mythz Points 54874

Vous pouvez trouver le [RequiredPermission] ou même l'attribut mise en œuvre Le troisième paramètre passé dans un RequestFilter est le DTO de la requête.

Et puisqu'un DTO de demande correspond à un service 1:1, vous pouvez être sûr que la demande est destinée au service IService<TRequest> (ou ses sous-classes, par exemple ServiceBase<T> , RestServiceBase<T> ). Vous pouvez accéder au type de service par programme, comme le fait la méthode FilterAttributeCache :

var serviceType = EndpointHost.Metadata.GetServiceTypeByRequest(requestDtoType);

Je ne suis pas sûr du contexte exact ou du cas d'utilisation que vous essayez de prendre en charge, mais l'utilisation de l'option [RequiredPermission] o [Rôle requis] peut contenir ce dont vous avez besoin et qui, par défaut, est validé par rapport à la liste des rôles et des permissions disponibles dans l'outil intégré UserAuth table.

En externe, vous pouvez utiliser les services web /assignroles et /unassignroles (dans le cadre du plugin AuthorizationFeature) pour attribuer des rôles et des autorisations aux utilisateurs (par défaut, un utilisateur ayant le rôle d'administrateur est nécessaire).

Pour plus d'informations, voir les pages de documentation sur Authentification/Autorisation y Validation sur le Wiki du projet GitHub ServiceStack .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X