使用Apache Tomcat的JDBCRealm设置Neo4j

时间:2016-02-19 16:14:09

标签: tomcat neo4j jdbcrealm

我们正在尝试使用JDBCRealm来使用neo4j数据库对用户进行身份验证。 我们遵循了JDBCRealm文档中的所有步骤,我们认为不支持neo4j。

尝试对用户进行身份验证时,会发送不包含在密码语言中的查询。 例如,我们得到:

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}" ^}]

填写HTTP BASIC身份验证表单并提交时会发生错误。

详细说明:

  1. 我们将JDBCRealm添加到tomcat server.xml

  2. 我们在web.xml文件

  3. 中为我们的所有网络应用页面添加了用户身份验证
  4. 我们使用BASIC认证

  5. 对于JDBCRealm,甚至不支持neo4j?

    感谢。

2 个答案:

答案 0 :(得分:2)

您不能将JDBCRealm与Neo4j一起使用。原因是JDBCRealm根据您的配置(表名,列等)构建了一个SQL语句。

Neo4j的JDBC驱动程序是"只是" Cypher的传输层,因此您无法发送SQL。

我可以考虑为tomcat创建CypherRealm,然后发出类似MATCH (u:User{name:{name}}) RETURN u的内容。

答案 1 :(得分:0)

一般情况下,您需要区分JDBCRealms! 一些领域使用非常静态的SQL,例如可配置只是像用户名,密码,db-url这样的值,但其中一些足够灵活,可以包含自定义SQL,或者在您的情况下非常有用,甚至是CQL

我们过去常常使用Tomcat Realms配置身份验证和授权。我们切换到Apache Shiro并使用在shiro.ini中配置的Shiro Realm org.apache.shiro.realm.jdbc.JdbcRealm

Shiro接受使用您自己的CQL进行灵活配置

  1. 用户
  2. 作用
  3. 权限(可选)
  4. 以下是设置Tomcat和shiro.ini

    的示例

    1)在webapp context.xml中设置JNDI资源

    <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)在shiro.ini中获取JNDI-Object

    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
    

    - &GT; passwordMatcher也需要配置!检查Apache Shiro文档