如何仅在GraphRepository中获取经过身份验证的用户拥有的数据

在我里面

我正在尝试使用带有Spring Data Neo4j,Spring Data Rest和Spring Security的Spring Boot(版本1.4.0.M2创建REST API 域由三种类型的实体组成:

  • 存储用户名/密码和与所有用户拥有的实体的关系的用户实体:
@NodeEntity
public class User extends Entity {
    @Relationship(type = "OWNS")
    private Set<Activity> activities;
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;
    private String username;
}
  • 用户创建/拥有的内容实体:
@NodeEntity
public class Activity extends Entity {
    private String name;
    @Relationship(type = "ON", direction = Relationship.INCOMING)
    private Set<Period> periods;
    @Relationship(type = "HAS", direction = Relationship.INCOMING)
    private User user;
}
  • 数据实体,存储所有用户均可访问的日期和时间信息
@NodeEntity
public class Period extends Entity {
    @Relationship(type = "HAS")
    private Set<Activity> activities;
    @Relationship(type = "HAS_PERIOD", direction = Relationship.INCOMING)
    private Day day;
    private PeriodNames name;
}

我现在试图使所有事情都尽可能简单,因此我只使用Repository扩展GraphRepository和Spring Security配置,该配置使用Basic Authentication和中的UserObject / Repository UserDetailsService这按预期工作,我能够创建用户,创建一些对象等。

问题是,我只希望用户访问自己的实体。目前,每个人都可以访问所有内容。从我的研究中了解到,我可以通过三种方式实现这一目标:

  1. 在存储库方法上使用Spring Security Annotations,如下所示:
@PostAuthorize("returnObject.user.username == principal.username")
@Override
Activity findOne(Long id);
@PostFilter("filterObject.user.username == principal.username")
@Override
Iterable<Activity> findAll();
  1. 使用注释方法,@Query并使用自定义查询来获取数据。
  2. 创建执行实际数据查询的自定义控制器和服务,类似于:sdn4-university

现在我的问题是:

使用我的可用工具来实现所需功能的最佳方法是什么?

对我来说,这似乎是使用#2(自定义查询)的首选方式这样,我只能获取我实际需要的数据。我将不得不尝试找到一种方法来创建启用分页的查询,Page<Activity> findAll(Pageable pageable)但是我希望这是可能的。我无法principal.username在自定义查询中使用似乎spring-data-neo4j目前不支持SpEL这是正确的还是在查询中还有另一种访问当前经过身份验证的用户的方法?

使用Spring Security Annotations的方式1对我有效(请参见上面的代码),但是我无法弄清楚如何过滤,Page<Activity> findAll(Pageable pageable)因为它返回的是Page对象而不是实体或集合。另外,我不确定这种方式是否有效,因为数据库始终必须查询所有实体,而不仅是查询特定用户拥有的实体。这似乎是对资源的浪费。这不正确吗?

还是我应该只使用#3并实现自定义控制器和服务?还有我没有读过的另一种方式吗?

非常感谢您提供有关此主题的任何意见!

谢谢,丹尼尔

在我里面

好的,我想我已经找到了解决方案。我猜它不是很漂亮,但目前可以使用。我对用于@PostAuthorize("returnObject.user.username == principal.username")单个实体的存储库方法使用或类似的方法,并为此创建了一个默认实现,Page<Activity> findAll(Pageable pageable)实现仅通过调用来获取用户名,SecurityContextHolder.getContext().getAuthentication().getName()并调用一个获取正确数据的自定义查询方法:

@RestResource(exported = false)
@Query("MATCH (u:User)-[:HAS]->(a:Activity) WHERE u.username={ username } RETURN a ORDER BY CASE WHEN NOT { sortingProperty} IS NULL THEN a[{ sortingProperty }] ELSE null END SKIP { skip } LIMIT { limit }")
List<Activity> findAllForUsernamePagedAndSorted(@Param("username") String username, @Param("sortingProperty") String sortingProperty, @Param("skip") int skip, @Param("limit") int limit);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

获取经过身份验证的用户拥有的所有角色

如何从Blazor中的数据库获取经过身份验证的用户

在ASP.NET MVC中获取经过身份验证的身份用户数据

如何在Laravel的数据库的表中获取经过身份验证的用户存储的数据

ReactJS-如何从Node js API获取经过身份验证的用户数据?

如何在事件侦听器中获取经过身份验证的用户-Laravel

如何从.Net Core中单独的类库获取经过身份验证的用户

如何在Olingo ODataServiceFactory中获取经过身份验证的用户的ID

如何在AWS Lambda函数中获取经过Cognito身份验证的用户信息?

如何在Web API中获取经过身份验证的用户名(基于令牌的身份验证)

Thymeleaf-获取经过身份验证的用户的全名

如何获取经过身份验证的用户信息并在所有控制器和服务中使用?

Passport.ls/Mysql - 获取经过身份验证的/当前用户数据

如何在 Cloud Functions 存储触发器中获取经过身份验证的 Firebase 用户的 uid

如何在Datasnap Server Methods单元中获取经过身份验证的用户名和密码?

如何获取经过身份验证的用户的电子邮件ID?

如何使用Tweepy获取经过身份验证的用户的屏幕名称

OAuth:访问令牌后如何获取经过身份验证的用户信息?

在 Django 中获取经过身份验证的用户名

从Blazor应用程序中的Middleware类获取经过身份验证的用户

从Django Rest Framework中的令牌获取经过身份验证的用户

EF Core:在Shadow Properties中获取经过身份验证的用户名

在 SAPUI5 应用程序中获取经过身份验证的用户 ID

在IIS HTTP PlatformHandler前面使用Windows身份验证时,如何在Python中获取经过身份验证的用户名?

如何在已登录页面中获取经过身份验证的令牌

如何在序列化程序类上获取经过身份验证的用户以进行验证

Laravel 8 我们如何获取经过身份验证的用户电子邮件地址

Firebase / Swift 2-如何获取经过身份验证的用户密码和电子邮件

如何使用Azure Active Directory在ASP.NET Core应用程序中获取经过身份验证的用户的名称