Comment concevoir un système d'authentification et d'autorisation pour L'application REST backend / Ajax front End

je commence un nouveau projet où nous planifions de construire une fin arrière reposante et une fin de police AJAX. J'aborde le problème en me concentrant sur L'identification de toutes les ressources que j'ai et ce que les différents verbes HTTP vont faire eux, leur URI et les représentations JSON de ces ressources.

je suis à la recherche du meilleur design pour sécuriser le support. Voici la liste des dessins que j'ai considérés. Je suis à la recherche d'autres modèles non énumérés ci-dessous, et pour, contre recommandation. Le système sera mis en œuvre avec Spring 3.0 et peut-être Spring Security 3.0, SSL sera utilisé pour de nombreuses parties du système, mais pas pour toutes, de sorte que certaines requêtes peuvent venir sur SSL et d'autres pas.

Option 1: Utilisez la session HTTP

afficher un écran de connexion standard, créer une session côté serveur et laisser tomcat renvoyer un cookie jsessionid et demander au client ajax d'inclure le cookie JSESSIONID sur chaque requête XHR. Cette option se sent juste comme c'est la mauvaise approche pour les raisons suivantes.

  • la connexion devient statefull ce qui est contraire aux règles du repos
  • je veux pouvoir diviser le bakcend en plusieurs fichiers de guerre séparés, ce qui signifie que je pourrais avoir plusieurs sessions HTTP sur le backend, si c'est le cas, alors cette approche ne fonctionne pas. Bien que je n'ai pas besoin de la capacité de diviser le backend en plusieurs applications aujourd'hui, je préférerais un design qui permet que possibilité.

Option 2: Trouver une bibliothèque de sécurité open source basée sur Java qui fait cela

en dehors de la sécurité de printemps je n'ai pas trouvé d'autres bibliothèques Java, toutes les recommandations sont très appréciées.

Option 3: Essayez d'utiliser un protocole existant comme OAuth

dans mon très bref regard sur OAuth il semble qu'il est conçu pour l'authentification à travers les sites où chaque site a sa propre base de données utilisateur. Dans ce système, je veux un mondial base de données utilisateur partagée à travers tous les services ajax backend.

Option 4: Utiliser SAML et Shiboleth

cette option semble très complexe à configurer et à maintenir.

Option 5: Envoyer le nom d'utilisateur et le mot de passe avec chaque demande

cela nécessite que l'utilisateur envoie son nom d'utilisateur et mot de passe avec chaque demande, ce qui signifie que L'application AJAX front end doit stocker le nom d'utilisateur et mot de passe comme un objet JavaScript et si l'utilisateur navigue loin de la page, puis retour le combo nom d'utilisateur/mot de passe sera disparu et l'utilisateur pourrait être forcé de se connecter à nouveau. Je ne veux pas que le front end essaye de mettre le nom d'utilisateur et le mot de passe dans le cookie car cela comprendrait la sécurité.

Option 6: implémenter mon propre protocole d'Authentification / autorisation

créer un service de repos que les utilisateurs peuvent présenter leur combinaison de nom d'utilisateur / mot de passe, puis récupérer et token de sécurité, qu'ils doivent renvoyer au service avec chaque demande. Le jeton de sécurité serait signé numériquement par le service et ont une date d'expiration. Le token ne serait valable que pour la plupart des opérations les opérations de haute sécurité nécessiteraient un nouvel écran de connexion comme port de confirmation de l'opération.

le problème avec cette approche est que je dois inventer encore un autre protocole de sécurité qui semble être une totale perte de temps.

je suis sûr que je ne suis pas la seule personne contre ce problème, j'espère que la pile débordement la communauté des outils et des options que je n'ai pas encore trouvé.

25
demandé sur ams 2011-02-13 01:30:04

3 réponses

regardez Apache Shiro. Il s'agit d'un système d'authentification doté d'une fonction de gestion de session qui peut être utilisée pour partager les sessions entre les applications. Cela peut être la meilleure chose à faire.

ou vous pouvez utiliser la sécurité de printemps (ou Shiro) avec un cookie me Se souvenir qui est partagé à travers les webapps (tant qu'ils sont dans le même domaine HTTP). Le cookie "remember me" serait analogue à votre token dans l'option 6. Vous pouvez régler l'expiration sur le cookie de sorte qu'il est de courte durée comme un cookie de session ou de longue durée comme un souvenir de moi.

9
répondu sourcedelica 2011-02-13 00:34:17

Comme je vous comprends, vous allez assurer un reste d'application, à la préface, vous devez savoir que le fournisseur de services de sécurité consisd de trois concepts (3A): -Authentication -Autorisation -Audit de l'

pour mettre en œuvre ces trois ensemble, vous devez fournir un ensemble d'outils tels que : -Fournisseur d'authentification unique - Session Store -Ouvrir le modèle d'Id -identification de l'utilisateur de l'intégration ....

j'ai utilisé ACL(printemps ACL) pour fournir des services d'autorisation et oauth2 pour l'authentification. il y a un canal pour connecter ces deux ensembles et ses portées(OAuth2) mais le problème est que les portées ne sont pas assez flexibles(pure chaîne) pour implémenter des modules d'autorisation tels que role_voter, cache_strategy, black_list ou,Role_base stratégie, autorisations exceptionnelles, white_list... (mais vous pouvez utiliser @Enableglemethodsecurity)

dans mon cas, j'ai utilisé le serveur d'autorisation comme ressource pour le serveur d'authentification oauth2(jetez un oeil à http://projects.spring.io/spring-security-oauth/docs/oauth2.html), puis j'ai considéré deux spots pour vérifier l'autorisation, le premier J'ai émis ACL à front-end et programmeur forcé pour concevoir sa page dynamiquement jusqu'au concept ACL, le second est dans back-end sur couche de service(BLL) en utilisant L'Aspect quand un repos va être appelé. J'ai envoyé la clé de service en tant qu'actee pour vérifier si l'utilisateur actuel a suffisamment de contrôle d'accès pour le faire. et pour l'audit vous devez contrôler toutes les demandes je veux dire vous doit utiliser un écouteur dans votre passerelle ou courtier...

2
répondu Pasha Gharibi 2016-07-12 10:46:03

vous pouvez aussi jeter un coup d'oeil à Jasig CAS - Single Sign-On pour le Web. Il dispose d'une API REST et d'un protocole (Proxy Tickets) qui permet aux services de proxy user AuthN de sauvegarder des services tels que ceux décrits dans l'option 6. http://www.jasig.org/cas

Brièvement...L'application qui sert le client AJAX est protégée avec la sécurité de ressort (prend en charge CAS hors de la boîte) et obtient un billet de concession de procuration que vous avez intégré dans le client AJAX. Le client AJAX utilisez le PGT pour obtenir des billets Proxy pour vos services de repos...protégé avec la sécurité de ressort aussi. Les services de repos obtiennent un userId authentifié sans toutes les références primaires touchant.

Alternative, vous pouvez garder le PGT sur le serveur et utiliser les appels AJAX pour récupérer les billets Proxy qui sont ensuite utilisés par le client AJAX pour vous appeler des services de repos.

1
répondu wgthom 2011-05-20 14:21:12