安全性
Spring Data REST 与 Spring Security 配合良好。本节将通过示例展示如何使用方法级安全性来保护您的 Spring Data REST 服务。
@Pre
和 @Post
安全性
以下来自 Spring Data REST 测试套件的示例展示了 Spring Security 的 PreAuthorization 模型(这是最复杂的安全模型)
示例 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 注解用于保护整个 Repository。 Spring Security SpEL 表达式表示主体(principal)必须在其角色集合中拥有 ROLE_USER 角色。 |
2 | 要更改方法级设置,必须重写方法签名并应用 Spring Security 注解。在这种情况下,该方法会覆盖 Repository 级别设置,要求用户拥有 ROLE_ADMIN 角色才能执行删除操作。 |
前面的示例展示了一个标准的 Spring Data Repository 定义,它扩展了 CrudRepository
并做了一些关键更改:指定了访问各种方法所需的特定角色
Repository 级别和方法级别的安全设置不会合并。相反,方法级别的设置会覆盖 Repository 级别的设置。 |
前面的示例说明,实际上 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 。如果您已经在应用程序的其他部分使用了带 @Secured 的 Spring Security,您可以继续沿用这种方式,无需全部重写。 |
启用方法级安全性
要配置方法级安全性,这里是来自 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 参考文档中阅读相关内容。