【问题标题】:Setup Neo4j with Apache Tomcat's JDBCRealm使用 Apache Tomcat 的 JDBCRealm 设置 Neo4j
【发布时间】:2016-06-01 07:01:15
【问题描述】:

我们正在尝试使用 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 文件中的所有 Web 应用页面中添加了用户身份验证

  3. 我们使用 BASIC 身份验证

难道 JDBCRealm 甚至不支持 neo4j?

谢谢。

【问题讨论】:

    标签: tomcat neo4j jdbcrealm


    【解决方案1】:

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

    Neo4j 的 JDBC 驱动程序“只是”Cypher 的传输层,因此您不能发送 SQL。

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

    【讨论】:

    • neo4j 是否甚至被设计为支持用户名/密码数据?
    • 当然,它们只是提供给服务器或在 JDBC 中提供给驱动程序。
    【解决方案2】:

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

    长期以来,我们一直使用Tomcat Realms来配置认证和授权。我们切换到 Apache Shiro 并使用 Shiro Realm org.apache.shiro.realm.jdbc.JdbcRealm ,在 shiro.ini 中配置

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

    1. 用户
    2. 角色
    3. 权限(可选)

    这是一个如何设置 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
    

    -> passwordMatcher 也需要配置!检查 Apache Shiro 文档

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 2018-04-18
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多