Spring 安全 Acl 对象

Mar*_*Gui 1 java spring acl jdbc spring-security

我创建 Acl 的服务是这样的:

@Autowired
JdbcMutableAclService aclService;

public void createAcl(AclDTO aclDTO) throws ClassNotFoundException {

    ObjectIdentity oi = new ObjectIdentityImpl(getClass().getClassLoader().loadClass(aclDTO.getClassPath()),
        aclDTO.getObjectIdentityId());
    Sid sid = new PrincipalSid(aclDTO.getSid());

    Permission p = getPermission(aclDTO.getPermissionDesc());

    // Create or update the relevant ACL
    MutableAcl acl = null;
    try {
        acl = (MutableAcl) this.aclService.readAclById(oi);
    } catch (NotFoundException nfe) {
        acl = aclService.createAcl(oi);
    }

    // Now grant some permissions via an access control entry (ACE)
    acl.insertAce(acl.getEntries().size(), p, sid, true);
    this.aclService.updateAcl(acl);
}
Run Code Online (Sandbox Code Playgroud)

但是这个类似乎有问题,当它运行时,我得到了这样的错误:

2019-02-25 11:02:18.410 错误 10608 --- [XNIO-2 task-1] cssacl.aop.logging.LoggingAspect:com.spring.security.acl.service.AccessGrantService.createAcl() 中的异常原因= 'com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: PROCEDURE security_acl.identity 不存在'和异常 = 'StatementCallback; 错误的 SQL 语法 [call identity()]; 嵌套异常是 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: PROCEDURE security_acl.identity 不存在'

org.springframework.jdbc.BadSqlGrammarException: StatementCallback; 错误的 SQL 语法 [call identity()]; 嵌套异常是 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: PROCEDURE security_acl.identity 在 org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:93) 在 org.springframework.jdbc.support 不存在。 AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.core.JdbcTemplate.translator.java:72) at org.springframework.jdbc.core.JdbcTemplate.translator.java:72) .springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:388) 在 org.springframework.jdbc.core。

如果有人能帮我解决这个问题,我将不胜感激!

Tru*_*ung 7

看来您正在使用 MySQL。

我遇到了同样的错误并通过如下设置 JdbcMutableAclService 解决了它:

// Based on https://github.com/eugenp/tutorials/blob/master/spring-security-acl/src/main/java/org/baeldung/acl/config/ACLContext.java
@Bean
public JdbcMutableAclService aclService() {
  JdbcMutableAclService jdbcMutableAclService = new JdbcMutableAclService(dataSource, lookupStrategy(), aclCache());

  // TODO: for MySQL ONLY
  jdbcMutableAclService.setClassIdentityQuery("SELECT @@IDENTITY");
  jdbcMutableAclService.setSidIdentityQuery("SELECT @@IDENTITY");

  return jdbcMutableAclService;
}
Run Code Online (Sandbox Code Playgroud)

希望这有帮助。


Mír*_*íra 5

PostgreSQL使用时的解决方案JdbcMutableAclService

@Bean
public MutableAclService aclService() {
    JdbcMutableAclService aclService = new JdbcMutableAclService(dataSource, lookupStrategy(), aclCache());
    aclService.setSidIdentityQuery("SELECT currval('acl_sid_id_seq')");
    aclService.setClassIdentityQuery("SELECT currval('acl_class_id_seq')");
    return aclService;
}
Run Code Online (Sandbox Code Playgroud)