Use Generics in the interface to set the type of the parameters rather than using the Object class. Currently for PermissionEvaluator method boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission)

Would or should become

interface PermissionEvaluator boolean hasPermission(Authentication authentication, S targetId , String targetType, P permission); boolean hasPermission(Authentication authentication, TDO targetDomainObject, P permission);

This alleviates the need for casting and type un safety, by setting and knowing the types of data ahead of time.