跳到主要内容

安全

DeepSeek V3 中英对照 Security

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();
}
java
  • 这个 Spring Security 注解用于保护整个仓库。Spring Security SpEL 表达式表示主体必须在其角色集合中包含 ROLE_USER

  • 要更改方法级别的设置,你必须覆盖方法签名并应用 Spring Security 注解。在这种情况下,该方法覆盖了仓库级别的设置,要求用户具有 ROLE_ADMIN 权限才能执行删除操作。

前面的示例展示了一个标准的 Spring Data 仓库定义,它扩展了 CrudRepository,并做了一些关键修改:指定了访问各种方法的特定角色:

important

仓库和方法级别的安全设置不会合并。相反,方法级别的设置会覆盖仓库级别的设置。

前面的例子说明,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();
}
java
  • 这会导致与上一个示例相同的安全检查,但灵活性较低。它仅允许使用角色作为限制访问的手段。

  • 再次表明,删除方法需要 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
...
}
java
  • 这是一个 Spring 配置类。

  • 它使用 Spring Security 的 @EnableGlobalMethodSecurity 注解来同时启用 @Secured@Pre/@Post 支持。注意:你不必同时使用两者。这个特定的例子用于证明两者都可以与 Spring Data REST 一起工作。

  • 这个类继承了 Spring Security 的 WebSecurityConfigurerAdapter,后者用于纯 Java 的安全配置。

配置类的其余部分未列出,因为它遵循了 标准实践,你可以在 Spring Security 参考文档中阅读相关内容。