Spring Security ACL provides instance-based security for domain objects through a comprehensive Access Control List implementation
npx @tessl/cli install tessl/maven-org-springframework-security--spring-security-acl@6.5.0Spring Security's Access Control List (ACL) module provides domain object instance-based security. It enables fine-grained permission controls where different users can have different permissions on individual instances of domain objects.
Group ID: org.springframework.security
Artifact ID: spring-security-acl
Package: org.springframework.security.acls
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-acl</artifactId>
<version>6.5.1</version>
</dependency>import org.springframework.security.acls.AclPermissionEvaluator;
import org.springframework.security.acls.model.AclService;
import org.springframework.security.acls.model.MutableAclService;
import org.springframework.security.acls.model.Permission;
import org.springframework.security.acls.model.Sid;
import org.springframework.security.acls.model.ObjectIdentity;
import org.springframework.security.acls.model.Acl;
import org.springframework.security.acls.domain.BasePermission;
import org.springframework.security.acls.domain.PrincipalSid;
import org.springframework.security.acls.domain.GrantedAuthoritySid;
import org.springframework.security.acls.domain.ObjectIdentityImpl;The modern approach uses Spring Security's expression-based access control with AclPermissionEvaluator:
@Service
public class DocumentService {
@PreAuthorize("hasPermission(#document, 'READ')")
public Document getDocument(Document document) {
return document;
}
@PreAuthorize("hasPermission(#document, 'WRITE')")
public void updateDocument(Document document) {
// Update document
}
@PreAuthorize("hasPermission(#documentId, 'com.example.Document', 'DELETE')")
public void deleteDocument(Long documentId) {
// Delete document
}
@PostAuthorize("hasPermission(returnObject, 'READ')")
public Document findDocument(Long id) {
return documentRepository.findById(id);
}
@PostFilter("hasPermission(filterObject, 'READ')")
public List<Document> getUserDocuments() {
return documentRepository.findAll();
}
}Spring Security ACL provides a flexible, extensible architecture for domain object security:
@PreAuthorize triggers permission evaluationThe ACL module provides a rich domain model for representing permissions:
// Domain object identity
ObjectIdentity identity = new ObjectIdentityImpl(Document.class, documentId);
// Security identities
Sid principalSid = new PrincipalSid("john.doe");
Sid roleSid = new GrantedAuthoritySid("ROLE_ADMIN");
// Built-in permissions
Permission read = BasePermission.READ;
Permission write = BasePermission.WRITE;
Permission delete = BasePermission.DELETE;Learn more about the domain model →
Programmatic access to ACL data for reading and modification:
@Autowired
private MutableAclService aclService;
// Create ACL for new object
MutableAcl acl = aclService.createAcl(objectIdentity);
// Grant permission
acl.insertAce(0, BasePermission.READ, principalSid, true);
aclService.updateAcl(acl);
// Read ACL
Acl existingAcl = aclService.readAclById(objectIdentity);Learn more about ACL services →
Modern annotation-based approach with caching and optimization:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig {
@Bean
public PermissionEvaluator permissionEvaluator(AclService aclService) {
AclPermissionEvaluator evaluator = new AclPermissionEvaluator(aclService);
evaluator.setPermissionFactory(permissionFactory());
return evaluator;
}
}Learn more about permission evaluation →
Complete Spring configuration with database setup and security integration:
@Configuration
@EnableJpaRepositories
public class AclConfig {
@Bean
public AclService aclService() {
JdbcMutableAclService service = new JdbcMutableAclService(
dataSource(), lookupStrategy(), aclCache());
service.setClassIdentityQuery("SELECT @@IDENTITY");
service.setSidIdentityQuery("SELECT @@IDENTITY");
return service;
}
}Learn more about configuration →
Advanced caching and performance optimization features for production deployments:
@Bean
public AclCache aclCache() {
return new SpringCacheBasedAclCache(
cacheManager().getCache("aclCache"),
permissionGrantingStrategy(),
aclAuthorizationStrategy()
);
}
@Bean
public PermissionCacheOptimizer permissionCacheOptimizer(AclService aclService) {
return new AclPermissionCacheOptimizer(aclService);
}Learn more about caching & performance →
Extensible strategy interfaces for customizing ACL behavior:
// Custom object identity retrieval
@Bean
public ObjectIdentityRetrievalStrategy objectIdentityRetrievalStrategy() {
return new CustomObjectIdentityRetrievalStrategy();
}
// Custom SID retrieval with groups
@Bean
public SidRetrievalStrategy sidRetrievalStrategy() {
return new GroupAwareSidRetrievalStrategy();
}
// Custom permission evaluation logic
@Bean
public PermissionGrantingStrategy permissionGrantingStrategy() {
return new CustomPermissionGrantingStrategy(auditLogger());
}Learn more about strategy interfaces →
This documentation covers Spring Security ACL version 6.x. The ACL module has been part of Spring Security since version 2.0 and maintains backward compatibility while encouraging migration to the modern annotation-based approach.