使用 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认证表单并提交时出现错误
详情:
我们将 JDBCRealm 添加到 tomcat server.xml
我们在 web.xml 文件
中的所有 Web 应用程序页面中添加了用户身份验证
我们使用 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 的灵活配置
- 用户
- 角色
- 权限(可选)
这里是如何设置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 文档
我们正在尝试使用 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认证表单并提交时出现错误
详情:
我们将 JDBCRealm 添加到 tomcat server.xml
我们在 web.xml 文件
中的所有 Web 应用程序页面中添加了用户身份验证
我们使用 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 的灵活配置
- 用户
- 角色
- 权限(可选)
这里是如何设置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 文档