在spring-security-acl中允许ObjectIdentity.getIdentifier()的UUID值

时间:2015-02-09 23:21:51

标签: spring-security acl

我想讨论为spring-security-acl,SEC-972中的ObjectIdentity.getIdentifier()提供允许UUID值的解决方案。 Spring Security Contributing指南指向Spring Security论坛,现在已关闭并指向Stack Overflow,所以希望我能在正确的位置提出问题。

我的解决方案为acl_class表class_id_type添加了一个新列,可选择允许您为该acl_class指定Java类型。如果将ConversionService连接到BasicLookupStrategy并且acl_class指定了class_id_type,则将使用ConversionService将标识符转换为正确的类型。这增加了对spring-core的依赖。

acl_class架构如下所示:

create table acl_class(
    id bigint generated by default as identity(start with 100) not null primary key,
    class varchar_ignorecase(100) not null,
    class_id_type varchar_ignorecase(100),
    constraint unique_uk_2 unique(class)
);

lookupStrategy的定义如下所示:

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"/>
<!-- Declare a lookup strategy-->
<bean id="lookupStrategy" class="org.springframework.security.acls.jdbc.BasicLookupStrategy">
    <constructor-arg ref="dataSource"/>
    <constructor-arg ref="aclCache"/>
    <constructor-arg ref="aclAuthorizationStrategy"/>
    <constructor-arg ref="permissionGrantingStrategy"/>
    <constructor-arg ref="conversionService"/>
    <property name="permissionFactory" ref="permissionFactory"/>
</bean>

对BasicLookupStrategy.convertCurrentResultIntoObject()的调整如下所示:

// If the Java type is a String, check to see if we can convert it to the target id type, e.g. UUID.
Serializable identifier = (Serializable) rs.getObject("object_id_identity");
if (isString(identifier) && hasValidClassIdType(rs)
        && canConvertFromStringTo(classIdTypeFrom(rs))) {

    identifier = convertFromStringTo((String) identifier, classIdTypeFrom(rs));
}
ObjectIdentity objectIdentity = new ObjectIdentityImpl(rs.getString("class"),
        identifier);

您可以在此分支中查看分支中的更改 - https://github.com/pwheel/spring-security/tree/feature/acl-uuid-strings

该分支包含一些不相关的更改(例如私有Maven仓库),因此请不要将该分支视为拉取请求本身。这种变化似乎是一个“非平凡”的变化,因此根据我提出的指导原则,我想在提出拉动请求之前对其进行讨论。

另请注意,我在我的应用程序中发现我需要实现一个JdbcMutableAclService版本,该版本使用JdbcTemplate方法将SQL类型作为参数 - 这是因为否则MySQL连接器将UUID映射到二进制而不是String,从而产生UTF -8错误被抛出。我可以将它添加到拉取请求中。

我在制作中使用此设置没有任何问题。

在提出拉取请求之前,我应该做出哪些更改或改进?

由于

0 个答案:

没有答案