2016-02-19 1 views
0

Nous essayons d'utiliser JDBCRealm pour authentifier les utilisateurs avec la base de données neo4j. Nous avons suivi toutes les étapes de la documentation JDBCRealm et nous pensons que neo4j n'est pas supporté.Configuration de Neo4j avec JDBCRealm d'Apache Tomcat

Lorsque vous essayez d'authentifier un utilisateur, il envoie des requêtes qui ne sont pas dans la langue du chiffrement. Par exemple, nous obtenons:

Caused by: java.lang.RuntimeException: Error executing cypher statement(s) [{code=Neo.ClientError.Statement.InvalidSyntax, message=Invalid input 'L': expected 't/T' (line 1, column 3 (offset: 2)) "SELECT user_pass FROM users WHERE user_name = {1}" ^}]

L'erreur se produit lors du remplissage du formulaire d'authentification HTTP BASIC et soumission.

Détails:

  1. Nous avons ajouté le JDBCRealm au tomcat server.xml

  2. Nous avons ajouté l'authentification utilisateur à toutes nos applications web pages dans le fichier web.xml

  3. Nous utiliser l'authentification BASIC

Pourrait neo4j pas même être pris en charge pour JDBCRealm?

Merci.

Répondre

2

Vous ne pouvez pas utiliser JDBCRealm avec Neo4j. La raison en est que JDBCRealm construit une instruction SQL sous les hottes en fonction de votre configuration (nom de table, colonnes, etc.).

Le pilote JDBC pour Neo4j est "juste" une couche de transport pour Cypher, vous ne pouvez donc pas envoyer de code SQL.

Je peux penser à créer un CypherRealm pour tomcat qui émet alors quelque chose comme MATCH (u:User{name:{name}}) RETURN u.

+0

Est-ce que neo4j est même conçu pour prendre en charge les données de noms d'utilisateur/mots de passe? – dlv

+1

Bien sûr, ils sont simplement fournis au serveur ou dans JDBC au pilote. –

0

En général, vous devez faire la distinction entre JDBCRealms! Certains domaines utilisent un SQL assez statique, par ex. configurable sont seulement les valeurs comme nom d'utilisateur, mot de passe, db-url, mais certains d'entre eux sont assez souples pour inclure SQL personnalisé ou, et c'est assez utile dans votre cas, même CQL.

Nous avions l'habitude de configurer l'authentification et l'autorisation par Tomcat Realms pendant longtemps. Nous sommes passés à Apache Shiro et utiliser le Shiro Royaume org.apache.shiro.realm.jdbc.JdbcRealm, configuré dans le shiro.ini

Shiro accepte la configuration flexible avec votre propre FQC

  1. utilisateur
  2. rôle
  3. autorisation (en option)

Voici un exemple comment configuration Tomcat et shi ro.ini

1) Définissez la ressource JNDI dans votre contexte d'application Web.xml

<Resource auth="Container" driverClassName="org.neo4j.jdbc.Driver" maxIdle="30" maxTotal="50" maxWaitMillis="10000" 
      name="jdbc/SomeJndiNameForYourNeo4jDbResource" url="jdbc:neo4j:bolt://localhost" type="javax.sql.DataSource" username="neo4j" password="neo4j"/> 

2) Obtenir JNDI-objet à l'intérieur shiro.ini

ds = org.apache.shiro.jndi.JndiObjectFactory 
ds.resourceName = java:comp/env/jdbc/SomeJndiNameForYourNeo4jDbResource 

jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm 
jdbcRealm.permissionsLookupEnabled = true 
jdbcRealm.authenticationQuery = MATCH (u:User{email:?}) RETURN u.password 
jdbcRealm.userRolesQuery = MATCH (u:User{email:?})-[hr:HAS_ROLE]->(r:Role) RETURN r.name 
jdbcRealm.permissionsQuery = MATCH (:User{email:?})-[:HAS_PERMISSION]->(p:Permission) RETURN p.name 

jdbcRealm.credentialsMatcher = $passwordMatcher 
jdbcRealm.dataSource=$ds 
securityManager.realms = $jdbcRealm 

-> passwordMatcher doit être configuré aussi bien! Consultez la documentation d'Apache Shiro