2009-06-16 5 views
22

Je suis novice en programmation web, je viens d'un environnement de développement de jeux vidéo (C++), et je commence vraiment à ressentir une surcharge d'information. Il y a tellement de bibliothèques concurrentes qui choisissent toutes quelque chose qu'elles n'aiment pas dans une autre bibliothèque, et qui construisent une toute nouvelle façon de faire la même chose! Je suis sûr qu'il y a de bonnes raisons à cela, et je ne veux pas me plaindre, alors je vais expliquer mon problème. Pour faciliter mon voyage, j'ai décidé de commencer à apprendre Google App Engine + GWT + Java. Je l'aime parce que c'est une architecture de serveur distribuée prête à l'emploi, et j'ai choisi Java à cause de mon arrière-plan C++. Pour commencer j'ai écrit une petite application de type Twitter car elle teste différents aspects du développement web, à savoir: REST, analyse/création JSON, communication AJAX et génération HTML. Il ne m'a pas fallu trop longtemps pour créer un petit site permettant à un utilisateur d'entrer son nom et son mot de passe dans la page du navigateur, d'envoyer les données à mon application, de me connecter en leur nom, de récupérer leur liste d'amis et d'émettre retour au client sous JSON, où je l'analyse et l'affiche.Connexion au site Web dans Java + Google App Engine

Assez simple. Donc, l'étape suivante était que je n'aimais pas envoyer le mot de passe que l'utilisateur a entré sur le réseau en texte clair (évidemment). Cela m'a fait penser à toute la plomberie dont j'avais besoin:

  1. Authentifier les utilisateurs contre ma propre base de données, pas celle de Google. (Connexion/Mot de passe perdu/Déconnexion)
  2. Entrer/quitter (suivre) une session (connecté/déconnecté).
  3. Stockez les données utilisateur dans la base de données de mon application Google.

Toutes les jolies choses standard qui existe depuis toujours. Eh bien, j'ai commencé à chercher une bibliothèque d'authentification Java et il y avait de grandes bibliothèques monolithiques avec des courbes d'apprentissage énormes, et certaines sont anciennes ou pas plus en faveur ... Je me sens comme un programmeur débutant! Je veux juste avoir une page de connexion! :)

Alors j'ai commencé à lire sur la façon dont la plomberie de l'authentification fonctionne, et il y a énormément de choses à prendre en compte. Apparemment, il est assez courant que les gens roulent (non sécurisés). Je préfère prendre une solution qui existe et qui est solide. Donc, la question devient, que font les gens à ce sujet? Twitter prend en charge HTTP et HTTPS, mais par défaut HTTP pour son API REST, est-ce que cela signifie que les mots de passe des gens volent autour de non protégés, prêts à être interceptés par des hacks de type «homme au milieu»?

J'ai également regardé OAuth, qui a l'air excellent, mais il n'a pas de cas pour juste un bon vieux "Je ne veux pas savoir ou je me soucie de ce qu'est OpenID". Les personnes non techniques que j'ai montré à OpenID sont comme "wha? Je veux juste mettre mon nom d'utilisateur/mot de passe".

En remarque, quelqu'un a-t-il eu de la chance avec Spring.Security sur Google App Engine?

En tout cas, je me déchaîne. Je veux juste savoir ce que les gens font (pas en Python, Rails etc, mais en bon vieux Java). J'aimerais avoir une page de connexion comme Digg, même avec une option un jour pour :)

OpenID

Cheers, Shane

Répondre

12

Je ne peux pas parler à la sécurité Spring aux côtés de Google App Engine, mais je peux dire quelques choses à ce sujet qui peuvent être utiles. Tout d'abord, il est très simple à configurer, et ils ont de bons tutoriels pour le faire démarrer. Personnellement, j'ai utilisé le pet-clinic tutorial comme guide pour savoir comment appliquer la sécurité de printemps à mon projet la première fois. J'ai été en mesure de l'installer en une heure ou deux et j'avais une sécurité de base en utilisant ma base de données sur quelques pages différentes. Votre kilométrage peut varier, bien sûr, mais dans le pire des cas, vous avez leur tutoriel complet, vous pouvez piquer et prod pour voir comment il réagit.

Deuxièmement, la bibliothèque est très configurable. Si vous cherchez à travers le manual vous aurez une bonne idée des choses que vous pouvez faire, et je n'ai eu aucun problème à retravailler les zones que je devais changer pour mon projet. J'ai confiance que vous devriez être en mesure de travailler ensemble sur Spring Security et Google App Engine. En général, j'ai été satisfait de la prévoyance de la source Spring et de sa capacité à interagir avec d'autres bibliothèques. Enfin, Spring Security prend en charge OpenID si c'est quelque chose que vous décidez de vouloir superposer. Je n'ai pas encore joué avec cette partie, mais à partir du tutoriel, elle semble également très intuitive. La bonne chose ici, c'est que vous devriez être en mesure d'ajouter cela après coup s'il s'avère que vous auriez dû supporter OpenID après tout.

Je vous souhaite la meilleure des chances!

+1

Merci pour vos commentaires, je vais creuser plus profond. Une chose, est-ce que je dois prendre tout le cadre de Spring, ou est-ce que je peux juste prendre le côté de la sécurité? C'est juste que je ne veux pas avoir à apprendre une grande bibliothèque pour en utiliser une partie. Si je dois le faire, alors qu'il en soit ainsi, mais je me demande juste à l'avance. – Shane

+1

Vous pouvez choisir parmi les différentes bibliothèques de framework Spring. Ils jouent généralement bien les uns avec les autres, ou la plupart des autres bibliothèques que j'ai vues. Ma compréhension est que vous pouvez superposer Spring Security avec d'autres frameworks, et nous le faisons localement (techniquement, nous sommes toujours sur Acegi, mais peu importe), et ça marche bien. –

0

Je suis en train de faire security-constraint element de la même servlet à l'aide. Dans mon application, basic/digest auth sous https est correct.

Le jour prochain j'essaierai également d'implémenter une autre application en utilisant restlet et/ou JAX-RS. Les deux frameworks fournissent des hooks de sécurité.

Entrer/quitter (suivre) une session (connecté/déconnecté).

cela peut être facilement mis en œuvre à l'aide d'un filtre de servlet (encore une fois, entièrement pris en charge par GAE)

Comme une note de côté, quelqu'un at-il eu de chance avec Spring.Security sur Google App Engine?

sécurité ressort est supporté

+0

Êtes-vous en mesure de fournir un exemple de ce – Shane

+0

pour les contraintes de sécurité web.xml oui: vérifier ceci: http: //stackoverflow.com/questions/995035/how-to-define-realms-for-using-by-google-app-engine – dfa

+0

Bonjour, J'ai vérifié votre fichier .xml par rapport aux documents Google ici: http: // code .google.com/appengine/docs/java/config/webxml.html # Security_and_Authentication J'ai remarqué qu'ils disent: "App Engine ne prend pas en charge les rôles de sécurité personnalisés () ou d'autres mécanismes d'authentification () dans le descripteur de déploiement. " Vous utilisez dans votre fichier .xml, cela fonctionne-t-il pour vous? En outre, autorisez-vous uniquement l'authentification de l'utilisateur sur un compte Google? Parce que c'est ce qui arrivera si vous définissez simplement des contraintes de sécurité via web.xml. – Shane

1

hey là, si vous voulez travailler avec java, vous pourriez vouloir regarder dans WICKET ... c'est un java-framework assez soigné qui offre une bonne affaire. il est orienté sur les composants et à travers les exemples assez facile à comprendre (voir l'exemple de connexion sur la page d'exemple étendue ... Je l'ai fait tourner assez vite). il fonctionne également avec d'autres frameworks js, mais offre également sa propre implémentation ajax. il a aussi une excellente liste de diffusion!

+0

Merci pour la suggestion. WICKET a l'air très bien, mais il imite également beaucoup de la même fonctionnalité de GWT, qui prend en charge nativement Google App Engine. Pourtant ... Ca a l'air très joli et léger ... Je me demande si quelqu'un a essayé de voir si WICKET et GAE peuvent jouer ensemble. – Shane

+0

En fait, on dirait que quelqu'un a essayé de faire fonctionner Wicket avec GAE, avec un certain succès :) http://stronglytypedblog.blogspot.com/2009/04/wicket-on-google-app-engine.html – Shane

+0

Ah , merci pour le lien. Je pensais l'avoir vu quelque part, mais je ne m'en souvenais pas! Peut-être que cela vous aide un petit peu :) – doro

4

Je viens de tomber sur votre message. Vous sembliez (au passé depuis longtemps) être confus au sujet de l'utilisation et de l'authentification HTTP/HTTPS. Si vous utilisez HTTP, votre mot de passe n'est pas renvoyé en texte brut. Généralement, les informations de connexion sont POSTées via HTTPS. A ce moment, une session a été établie, qui est suivie par un grand identifiant généré de manière aléatoire dans un cookie. L'utilisateur est authentifié sur le serveur et son identifiant est stocké dans la session (stockée sur le serveur) pour marquer sa connexion.

À partir de ce moment, l'utilisateur est suivi via la session. Oui, il est possible qu'un homme dans le milieu puisse détourner le cookie et assumer votre identité. C'est le cas pour 100% des sites qui fonctionnent sur HTTP mais ce n'est clairement pas un problème ou vous en entendez plus à ce sujet. Pour HTTPS, le cookie de session peut être marqué comme sécurisé, ce qui signifie qu'il ne sera jamais envoyé via HTTPS à partir du navigateur.Par le passé, j'ai constaté que les navigateurs se comportaient différemment, partageant parfois la même valeur pour un cookie de même nom sécurisé et non sécurisé (ce qui est une idée stupide). Votre meilleur pari est d'utiliser un cookie sécurisé nommé séparément pour s'assurer que l'utilisateur est connecté pour des fonctions sécurisées sur votre site Web. Je suis d'accord avec vous que le cadre JAAS est vraiment horrible. Il doit avoir été écrit par un tas de fous dérangés sans bon sens. En ce qui concerne l'utilisation de Google App Engine, ils se chargeront de toute l'authentification pour vous. Il semble que vous n'ayez d'autre choix que d'utiliser les comptes Google, ce qui est dommage. Il est également dommage qu'ils insistent pour que vous redirigiez vers leur page de connexion, car cela rompt le fonctionnement d'une application GWT. Je suis actuellement en train de chercher à gérer mes propres comptes car je ne veux pas que google les possède et je ne veux pas que cette expérience soit disjointe sur mon site.

Cependant, il semble impossible de suivre un utilisateur sans session (les sessions peuvent être prises en charge dans GAE mais sont fortement déconseillées pour promouvoir l'évolutivité dans GAE). Sans une session, j'ai littéralement besoin d'envoyer le mot de passe et d'authentifier l'utilisateur avec chaque requête RPC. Google tire quelques astuces pour faire fonctionner la méthode getUserPrincipal() sur leurs clusters de serveurs - et il semble que vous n'ayez cette magie que si vous utilisez des comptes Google.

Peut-être que je manque quelque chose, mais les docs Google écrémer un peu plus de ce trou béant :(

+0

avez-vous des liens pour décourager les sessions? semble fonctionner pour nous? – HaveAGuess

+0

Peut-être s'agit-il d'une nouvelle fonctionnalité pour soutenir les sessions. En général, si vous avez une session côté serveur, vos demandes doivent revenir à cette même instance de serveur. Dans le cas où l'instance tombe en panne, les copies de votre session doivent être distribuées à un ou plusieurs serveurs de sauvegarde. La logique doit être intégrée dans un routeur devant les serveurs pour savoir où se trouvent les sauvegardes pour chaque utilisateur.Ces routeurs frontaux doivent également être répliqués de manière à ne pas être un goulot d'étranglement ou un point de défaillance unique. C'est beaucoup de frais inutiles pour stocker des données dans une session ... des données que vous devriez probablement persister de toute façon! –

+0

continued ... Utilisez la fantastique base de données distribuée de Google pour effectuer le travail de stockage/récupération des données et garder votre serveur frontal apatride afin que toute instance de serveur puisse être utilisée pour répondre aux demandes. Utilisez GWT pour conserver l'état de la session sur le client et non sur le serveur. –

Questions connexes