Comment concevoir l'authentification et l'autorisation du système pour le REPOS backend / Ajax Application front-End
Je suis en train de créer un nouveau projet où nous sommes de rabotage pour construire une bonne fin et un AJAX police fin. Je suis l'approche du problème en se concentrant sur l'Identification de toutes les ressources que j'ai et ce que les différents verbes HTTP fera, leur URI et le JSON les représentations de ces ressources.
Je suis à la recherche pour le meilleur design pour la sécurisation de l'arrière-plan. Voici la liste des dessins que j'ai considéré comme. Je suis à la recherche d'autres modèles non listés ci-dessous, et les avantages, les inconvénients des recommandations. Le système sera mis en œuvre avec le Printemps 3.0 et, éventuellement, de la Sécurité Printemps 3.0, SSL sera utilisé pour de nombreuses parties du système, mais pas pour tous, de sorte que certaines demandes peuvent venir sur SSL et certains pourraient ne pas.
Option 1: Utilisation de la session HTTP
Montrer une norme de connexion de l'écran, de créer un serveur de session côté et laissez tomcat envoyer un cookie jsessionid et ont l'ajax client comprennent le cookie JSESSIONID sur chaque demande XHR. Cette option se sent juste comme elle n'est pas la bonne approche pour les raisons suivantes.
- La connexion devient statefull qui est contre les règles de RESTE
- Je veux être en mesure de diviser les bakcend en plusieurs séparée de la GUERRE des fichiers qui veut dire que je peux avoir plusieurs sessions HTTP sur le serveur principal, 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 dans plusieurs applications aujourd'hui, je préfère un design qui permet cette possibilité.
Option 2: Trouver un open source Java de sécurité de la bibliothèque qui fait cela
Autres que le Ressort de sécurité je n'ai pas trouvé d'autres bibliothèques Java, toutes les recommandations sont très appréciés.
Option 3: Essayez d'utiliser un protocole existant comme OAuth
Dans mon très bref coup d'oeil à OAuth il semble qu'il est conçu pour l'authentification dans les lieux où chaque site a sa propre base de données utilisateur. Dans ce système, je veux un mondial de l'utilisateur de la base de données partagées à l'échelle de tout le backend ajax services.
Option 4: Utilisation SAML et Shiboleth
Cette option semble plus tuer et extrêmement complexe à installer et à entretenir.
Option 5: Envoyer le nom d'utilisateur et le mot de passe à chaque requête
Cela nécessite que l'utilisateur envoie son nom d'utilisateur et le mot de passe à chaque requête, ce qui signifie que l'extrémité avant application AJAX doit stocker le nom d'utilisateur et mot de passe comme un objet JavaScript et si l'utilisateur quitte la page puis de nouveau le nom d'utilisateur/mot de passe combo aura disparu et que l'utilisateur peut être contraint de se connecter à nouveau. Je ne veux pas la fin de devant pour essayer de mettre le nom d'utilisateur et le mot de passe dans le cookie qui engloberait de sécurité.
Option 6: mettre en place mes propres authentification /Autorisation de protocole de
Créer un service REST que les utilisateurs peuvent présenter leur nom d'utilisateur/mot de passe, puis de revenir et d'émission de jeton de sécurité, qu'ils doivent renvoyer vers le service avec chaque demande. Le jeton de sécurité serait signé numériquement par le service et ont une date d'expiration. Le jeton serait bon que pour la plupart des opérations de haute sécurité des opérations aurait besoin d'un nouvel écran de connexion comme le port de la confirmation de l'opération.
Problème avec cette approche est que je dois inventer un autre protocole de sécurité, ce qui semble être un gaspillage total de temps.
Je suis sûr que je ne suis pas la seule personne à l'encontre de ce problème, j'espère que le débordement de la pile de la communauté des outils et des options que je n'ai pas encore trouvé.
Vous devez vous connecter pour publier un commentaire.
Prendre un coup d'oeil à Apache Shiro. C'est un système d'authentification qui a une session de gestion de la fonction qui peut être utilisée pour partager des sessions sur les applications. Cela peut être la meilleure chose à faire.
Ou vous pouvez utiliser le Printemps de Sécurité (ou Shiro) avec un cookie se Souvenir de Moi qui est partagée entre les webapps (tant qu'ils sont dans la même HTTP domaine). Le cookie se souvenir de moi serait analogue à votre jeton en option 6. Vous pouvez définir la date d'expiration du 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.
Vous pouvez également jeter un oeil à Jasig CAS - Single Sign-on pour le Web. Il dispose d'une API REST et un protocole (Proxy Billets) qui permet d'offrir des services de proxy de l'utilisateur AuthN à des services back-end comme vous l'avez décrit dans l'option 6. http://www.jasig.org/cas
Bref...l'application qui sert le client AJAX est protégé avec Ressort de Sécurité (prend en charge le CAS de la boîte) et obtient un Proxy de l'Octroi de Ticket que vous intégrez dans le client AJAX. Le client AJAX utilise la PGT pour obtenir Proxy Billets pour votre REPOS, de services...protégé avec le Printemps de la Sécurité. Le RESTE des services obtenir un nom d'utilisateur authentifié sans chaque toucher information d'identification primaire.
Alternative, vous pouvez garder le PGT sur le serveur et d'utiliser les appels AJAX pour récupérer Proxy Billets qui sont ensuite utilisés par le client AJAX pour appeler vous RESTE des services.
Ce que j'ai compris, 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):
-Authentification
-Autorisation
-Audit
pour mettre en œuvre ces trois ensemble, vous devez fournir un ensemble d'outils tels que :
-Fournisseur d'authentification unique
-Session Magasin
-Ouvrir le modèle d'Id
-identification de l'utilisateur de l'intégration
....
J'ai utilisé ACL de Printemps(ACL) afin de fournir des services d'autorisation et oauth2 pour l'authentification.
il y a un canal pour relier ces deux ensemble, et ses étendues(oauth2 étendues) mais le problème est que les étendues ne sont pas flexibles(pur cordes), assez pour mettre en œuvre les modules d'autorisation comme role_voter, cache_strategy, black_list ou,Role_base la stratégie, des autorisations exceptionnelles, white_list... (mais vous pouvez utiliser @EnableGlobalMethodSecurity)
Dans mon cas, j'ai utilisé le serveur d'autorisation en tant que 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 endroits à voir l'autorisation, la première j'ai publié une liste de contrôle d'accès frontal et forcé programmeur pour le design de sa page dynamiquement jusqu'à ACL concept, la seconde est dans le back-end sur la couche de service(BLL) à l'aide d'Aspect lorsque l'on reste va être appelé. J'ai envoyé la clé de service comme un actee pour vérifier si l'utilisateur courant a assez de contrôle d'accès pour le faire. et pour la vérification, vous devez contrôler toutes les demandes, je veux dire, vous devez utiliser un écouteur dans votre passerelle ou d'un courtier...