I have added 4 custom validators to make some checks in my controller. 3 of them working but the ValidObjectIdentity one does not work.
Here is my constraint-mapping.xml
<constraint-mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.1.xsd"
xmlns="http://jboss.org/xml/ns/javax/validation/mapping" version="1.1">
<bean class="org.springframework.security.acls.domain.AccessControlEntryImpl" ignore-annotations="true">
<field name="sid">
<constraint annotation="javax.validation.constraints.NotNull"/>
<constraint annotation="package.validation.SidExists"/>
<constraint annotation="package.validation.NonMatchingSid"/>
</field>
<field name="acl">
<constraint annotation="javax.validation.constraints.NotNull"/>
</field>
</bean>
<bean class="org.springframework.security.acls.domain.AclImpl">
<field name="objectIdentity">
<constraint annotation="javax.validation.constraints.NotNull"/>
<constraint annotation="package.validation.ValidObjectIdentity"/>
</field>
</bean>
<bean class="package.AccessControlEntryController">
<method name="create">
<parameter type="org.springframework.security.acls.model.AccessControlEntry">
<constraint annotation="package.validation.ValidEntry"/>
</parameter>
</method>
</bean>
</constraint-mappings>
@RestController
@RequestMapping(value = "/acl")
@Validated
public class AccessControlEntryController {
@ResponseBody
@RequestMapping(value = "/entry", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public AccessControlEntry create(@Valid @RequestBody AccessControlEntry entry){
return aclService.createAccessControlEntry(entry);
}
}
For reference I will put here the structure of AccessControlEntryImpl and AclImpl
public class AccessControlEntryImpl implements AccessControlEntry, AuditableAccessControlEntry {
private final Acl acl;
private Permission permission;
private final Serializable id;
private final Sid sid;
private boolean auditFailure = false;
private boolean auditSuccess = false;
private final boolean granting;
}
public class AclImpl implements Acl, MutableAcl, AuditableAcl, OwnershipAcl {
private Acl parentAcl;
private transient AclAuthorizationStrategy aclAuthorizationStrategy;
private transient PermissionGrantingStrategy permissionGrantingStrategy;
private final List<AccessControlEntry> aces = new ArrayList<>();
private ObjectIdentity objectIdentity;
private Serializable id;
private Sid owner; // OwnershipAcl
private List<Sid> loadedSids = null;
}
I can see that the working validators are directly related with the AccessControlEntry but the ObjectIdentity is related to class Acl. Even though AccessControlEntry have Acl class in itself it does not go validator. Is there a way to validate ObjectIdentity like others?
Here is a validator incase you want to see
@Target(value = ElementType.FIELD)
@Retention(value = RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ValidObjectIdentityValidator.class)
public @interface ValidObjectIdentity {
String message() default "{package.ValidObjectIdentity.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class ValidObjectIdentityValidator implements ConstraintValidator<ValidObjectIdentity, ObjectIdentity> {
@Override
public boolean isValid(ObjectIdentity identity, ConstraintValidatorContext context) {
// Logic
}
}