获取spring security ACL查找以使用mysql只读副本

时间:2017-10-30 23:27:11

标签: java mysql spring spring-security

在使用我的Spring应用程序调试和测试MySql读取复制时,我注意到获取ACL的查询正在击中我的主数据库而不是从数据库数据库。我正在使用jdbc:mysql:replication://连接字符串。对于非ACL数据,这似乎与@Transactional(readOnly = true)中包含的调用有关。

我使用与JPA配置相同的数据源通过BasicLookupStrategy设置我的LookupStrategy。

就好像LookupStrategy没有将连接标记为只读。

这是正常的吗?有没有办法改变这种行为?

2 个答案:

答案 0 :(得分:0)

Spring Security 3.0提供了一个BasicLookupStrategy类,它在其构造函数中允许注入将用于命中数据库的DataSource。所以我的建议是使用该实现,并实现ACLCache以避免不必要的数据库访问。

https://docs.spring.io/spring-security/site/apidocs/org/springframework/security/acls/jdbc/BasicLookupStrategy.html

答案 1 :(得分:0)

因此,在阅读BasicLookupStrategy的所有来源之后,我没有看到任何地方,或者可以完成。然后在它上面,BasicLookupStrategy将jdbcTemplate作为私有使其无法扩展。 ug ..所以最后只是把整个班级称为BasicReadOnlyLookupStrategy并添加了以下方法setConnectionReadOnly'在jdbcTemplate.querylookupPrimaryKeys中调用lookupObjectIdentities之前和之后调用它{1}}

private void setConnectionReadOnly(boolean readOnly) {
    log.debug("setting JDBC connection to {}", readOnly);
    try {
        Connection con = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());
        con.setReadOnly(readOnly);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}