安全
Spring Data REST 与 Spring Security 协同工作良好。本节展示了如何使用方法级安全性保护 Spring Data REST 服务的示例。
@Pre
和 @Post
安全性
Spring Data REST 测试套件中的以下示例展示了 Spring Security 的预授权模型(最复杂的安全性模型)
示例 1. spring-data-rest-tests/spring-data-rest-tests-security/src/test/java/org/springframework/data/rest/tests/security/PreAuthorizedOrderRepository.java
@PreAuthorize("hasRole('ROLE_USER')") (1)
public interface PreAuthorizedOrderRepository extends CrudRepository<Order, UUID> {
@PreAuthorize("hasRole('ROLE_ADMIN')")
@Override
Optional<Order> findById(UUID id);
@PreAuthorize("hasRole('ROLE_ADMIN')") (2)
@Override
void deleteById(UUID aLong);
@PreAuthorize("hasRole('ROLE_ADMIN')")
@Override
void delete(Order order);
@PreAuthorize("hasRole('ROLE_ADMIN')")
@Override
void deleteAll(Iterable<? extends Order> orders);
@PreAuthorize("hasRole('ROLE_ADMIN')")
@Override
void deleteAll();
}
1 | 此 Spring Security 注解保护整个资源库。 Spring Security SpEL 表达式 指示主体必须在其角色集合中具有ROLE_USER 。 |
2 | 要更改方法级设置,必须覆盖方法签名并应用 Spring Security 注解。在这种情况下,该方法通过要求用户具有ROLE_ADMIN 才能执行删除操作来覆盖资源库级设置。 |
前面的示例展示了标准的 Spring Data 资源库定义,它扩展了CrudRepository
,并进行了一些关键更改:指定访问各种方法的特定角色。
资源库和方法级别的安全设置不会组合。方法级别的设置会覆盖资源库级别的设置。 |
前面的示例说明了CrudRepository
实际上有四种删除方法。必须覆盖所有删除方法才能正确保护它。
@Secured 安全性
以下示例展示了 Spring Security 的旧版@Secured
注解,它纯粹是基于角色的。
示例 2. spring-data-rest-tests/spring-data-rest-tests-security/src/test/java/org/springframework/data/rest/tests/security/SecuredPersonRepository.java
@Secured("ROLE_USER") (1)
@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface SecuredPersonRepository extends CrudRepository<Person, UUID> {
@Secured("ROLE_ADMIN") (2)
@Override
void deleteById(UUID aLong);
@Secured("ROLE_ADMIN")
@Override
void delete(Person person);
@Secured("ROLE_ADMIN")
@Override
void deleteAll(Iterable<? extends Person> persons);
@Secured("ROLE_ADMIN")
@Override
void deleteAll();
}
1 | 这将产生与前一个示例相同的安全检查,但灵活性较低。它只允许角色作为限制访问的方式。 |
2 | 同样,这表明删除方法需要ROLE_ADMIN 。 |
如果从新项目开始或第一次应用 Spring Security,则@PreAuthorize 是推荐的解决方案。如果已经在应用程序的其他部分使用 Spring Security 和@Secured ,则可以继续使用该路径,而无需重写所有内容。 |
启用方法级安全性
要配置方法级安全性,以下是 Spring Data REST 测试套件中的简短代码片段。
示例 3. spring-data-rest-tests/spring-data-rest-tests-security/src/test/java/org/springframework/data/rest/tests/security/SecurityConfiguration.java
@Configuration (1)
@EnableWebSecurity
@EnableMethodSecurity(securedEnabled = true, prePostEnabled = true) (2)
class SecurityConfiguration { (3)
...
}
1 | 这是一个 Spring 配置类。 |
2 | 它使用 Spring Security 的@EnableGlobalMethodSecurity 注解来启用@Secured 和@Pre /@Post 支持。注意:不必同时使用两者。此特定案例用于证明这两个版本都适用于 Spring Data REST。 |
3 | 此类扩展了 Spring Security 的WebSecurityConfigurerAdapter ,用于纯 Java 安全性配置。 |
未列出配置类的其余部分,因为它遵循标准实践,您可以在 Spring Security 参考文档中阅读。