使用 Apache Tomcat 的 JDBCRealm 设置 Neo4j

Setup Neo4j with Apache Tomcat's 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. 中的所有 Web 应用程序页面中添加了用户身份验证
  4. 我们使用 BASIC 身份验证

JDBCRealm 甚至不支持 neo4j 吗?

谢谢。

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

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

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

的东西

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

我们曾经很长时间通过 Tomcat 领域来配置身份验证和授权。我们切换到 Apache Shiro 并使用 Shiro Realm org.apache.shiro.realm.jdbc.JdbcRealm ,在 shiro.ini

中配置

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

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

这里是如何设置Tomcat和shiro.ini

的示例

1) 在你的 webapp 中设置 JNDI 资源 context.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) 在 shiro.ini

中获取 JNDI 对象
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 文档