2017-06-26 6 views
1

Pour mon application JSF/TomEE, j'ai une base de données NoSQL avec des utilisateurs et des rôles qui spécifie comment les utilisateurs peuvent accéder aux ressources (essentiellement les ID dans un paramètre url) en lecture seule ou en écriture.Shiro et client certs

Je veux mettre en œuvre la sécurité et this post gave me some ideas mais je tiens à essayer une bibliothèque tierce - probablement Shiro ou PicketLink. La règle est que les utilisateurs s'authentifieront avec un certificat client, et si ce n'est pas le cas, ils seront authentifiés en tant qu'utilisateur invité par défaut. Étonnamment, j'ai un peu de mal à trouver des informations sur la façon de faire cela dans Shiro, ça ne semble pas simple. Je suis quelque peu surpris qu'il n'y ait rien de «prêt à l'emploi» dans Shiro pour implémenter l'authentification par certificat client.

Donc je pense que je dois créer un royaume pour "connecter" Shiro avec ma base de données. Ensuite, j'ai lu que je pourrais avoir besoin d'étendre org.apache.shiro.authc.UsernamePasswordToken pour lire le certificat et le transmettre à Shiro. Ensuite, je suppose que je dois restreindre l'accès au contenu dans les pages xhtml JSF (en utilisant l'attribut rendered par exemple) et je suppose que même dans toutes les méthodes des beans gérés Named, je devrai vérifier les permissions.

Aussi, je ne vois pas comment je peux assigner l'utilisateur invité quand un certificat n'est pas fourni, puisque apparemment c'est TomEE qui valide le client, donc si aucun certificat n'est fourni, mon code ne sera pas exécuté pour affecter l'utilisateur invité. Je pourrais ouvrir deux ports différents dans TomEE, mais alors l'accès ne sera pas unifié, puisque je veux traiter l'utilisateur invité uniformément, comme n'importe quel autre utilisateur dans le système. Comment cela peut-il être fait?

Est-ce implémenté plus facilement dans PicketLink? (qui est également mieux préparé pour JSF)

Répondre

1

OK, il m'a fallu un certain temps et beaucoup de recherche, donc je vais résumer mes conclusions de façon spectaculaire. J'ai tout documenté mais je ne veux pas créer un chapitre de livre.

J'ai donc décidé d'y aller avec Shiro, et tout ce que je décris fonctionne et peut être fait. This X509certificate project for Shiro était très utile. Fondamentalement, vous devez implémenter un Realm remplaçant deux méthodes (une pour l'authentification et une autre pour l'autorisation) - il y a une classe à étendre dans le code que j'ai mentionné précédemment.

La distorsion d'un utilisateur ne fournissant pas de cert peut être effectuée dans le filtre Shiro, donc quand aucun jeton (certificat) n'est fourni, on peut le créer à la volée ou lire à partir d'un fichier de clés.

Pour restreindre l'accès dans JSF il y a quelques balises shiro qui peuvent aider, pas besoin d'utiliser rendered. J'ai également vérifié les permissions dans les beans ou autres classes accédant à la base de données. Cela fonctionne une fois que les autorisations ont été établies dans la méthode d'autorisation.

Le problème avec Tomcat peut être résolu en utilisant <Connector port="..." ClientAuth="want" ... qui demandera un certificat mais n'arrêtera pas l'utilisateur si aucun certificat n'est fourni.