仅保护对Spring Data Rest存储库的REST访问

Ger*_*rdo 10 spring-security spring-data spring-data-rest

我正在使用Spring Data Rest来公开存储库.我正在使用@PreAuthorize@PostFilter限制对REST端点的访问,以专门管理用户并过滤结果.

@PreAuthorize("hasRole('ROLE_ADMIN')")
@PostFilter("hasPermission(filterObject, 'read')
public interface SomeRepository extends CrudRepository<SomeEntity, Long> {
}
Run Code Online (Sandbox Code Playgroud)

与此同时,我有另一个不需要任何身份验证但使用存储库的Controller.

@Controller
public class SomeController {

 @Autowired
 SomeRepository repository;

 @RequestMapping(value = "/test")
 public ResponseEntity test () {
 // Do something
 repository.findAll();
 // Do something else
 }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为将请求发送到"/ test"的用户不是admin,因此它无权访问存储库.

我的问题是,可以将安全性专门添加到存储库的REST接口,而不是在应用程序内部使用存储库时?

谢谢

aux*_*aux 5

请评估以下可能性:

  • REST事件处理程序中的安全检查
  • 添加供内部使用的自定义存储库方法
  • 使用RunAsManager(或临时切换SecurityContext来执行特权操作)

使用REST事件处理程序确保修改请求的安全:

@Service
@RepositoryEventHandler
public class FooService {

  /**
   * Handles before-* events.
   */
  @HandleBeforeCreate
  @HandleBeforeSave
  @HandleBeforeDelete
  @HandleBeforeLinkSave
  @HandleBeforeLinkDelete
  @PreAuthorize("hasRole('ADMIN')")
  public void onBeforeModify(final Foo entity){
    // noop
  }

}
Run Code Online (Sandbox Code Playgroud)

保护标准CRUD方法,同时在存储库中添加供内部使用的非安全自定义方法

public interface FooDao extends CrudRepository<Foo, Long> {

 @Override
 @PreAuthorize("hasRole('ADMIN')")
 <S extends Foo> S save(final S entity);

  /**
   * Saves entity without security checks.
   */
  @Transactional
  @Modifying
  default <S extends Foo> S saveInternal(final S entity) {
    return save(entity);
  }
}
Run Code Online (Sandbox Code Playgroud)