Java 当我的域标识符是字符串类型时,如何使用Spring安全ACL?

Java 当我的域标识符是字符串类型时,如何使用Spring安全ACL?,java,spring-security-acl,Java,Spring Security Acl,当我尝试使用MutableAclService.createAcl(ObjectIdentity ObjectIdentity)创建ACL时,我遇到了Spring Security ACL的奇怪和意外情况 问题是ObjectIdentity使用Serializable类型作为标识符。 同时,我的域为此使用Stringtype。ID的生成方式如下: String id = UUID.randomUUID().toString(); 然后我尝试使用以下结构添加ACL: ObjectIdentity

当我尝试使用
MutableAclService.createAcl(ObjectIdentity ObjectIdentity)
创建ACL时,我遇到了Spring Security ACL的奇怪和意外情况

问题是
ObjectIdentity
使用
Serializable
类型作为标识符。 同时,我的域为此使用
String
type。ID的生成方式如下:

String id = UUID.randomUUID().toString();
然后我尝试使用以下结构添加ACL:

ObjectIdentity identity = new ObjectIdentityImpl(clazz, id);
aclService.createAcl(identity);
之后,我得到以下异常:

java.lang.NumberFormatException:用于输入字符串:“ad169805-a2d1-4324-ba11-c98cc679e594”

我发现SpringSecurityACL使用
Long
类型作为标识符

因此,问题是:

  • 在这种情况下,最佳实践是什么(例如,我需要使用对象的hashcode作为标识符,还是使用smth等)
  • 为什么到处都提到
    Serializable
    ,但实际上它一定很长

  • 另外,标识符的SQL数据类型也是数字-bigserial。

    已经三年多了,但我将把这个留给仍在努力解决这个问题的人:

    从2017年到2018年(特别是从这次提交到现在),Spring security ACL开始实现类来解决这个问题

    我目前使用的是Spring Security ACL 5.2.2.RELEASE,它将此问题的解决方案缩小为两个简单的配置修改:

      @Bean
        public LookupStrategy lookupStrategy() {
            BasicLookupStrategy basicLookupStrategy = new BasicLookupStrategy(
                    dataSource,
                    aclCache(),
                    aclAuthorizationStrategy(),
                    new ConsoleAuditLogger()
            );
            basicLookupStrategy.setAclClassIdSupported(true); // <--- this line
            return basicLookupStrategy;
        }
    
        @Bean
        public JdbcMutableAclService aclService() {
            JdbcMutableAclService jdbcMutableAclService = new JdbcMutableAclService(dataSource,lookupStrategy(),aclCache());
            jdbcMutableAclService.setAclClassIdSupported(true); //<-- And this line.
            return jdbcMutableAclService;
        }
    

    1.hascode不是一个好主意,您可以使用相同的hashCode拥有两个标识。为什么不使用SQL标识符来表示对象身份?这是一款加兰特,你可以保证它是独一无二的。可能因为您对aclService使用JdbcAclService实现,所以您可以创建自己的自定义行为或扩展现有行为。我建议您使用数据库标识符。您提出了解决方案吗?@lillalinux,正如Vasile Bors为第二点建议的那样,使用您自己的acl实现。至于第1点-无论您想使用什么作为id。例如,您可以使用UUIDV4作为字符串。
    create table if not exists acl_class(
        id bigserial not null primary key,
        class varchar(100) not null,
        class_id_type varchar(100),
        constraint unique_uk_2 unique(class)
    );