动态访问动态端点

Dynamic access to a dynamic endpoint

我正在编写一个 spring-mvc webapp,我正在集成 spring-security 来处理所有与用户相关的内容以进行授权。我正在做一个类似大学的系统(您可以在其中登录并查看您的课程、公告等),但问题如下:我有两种类型的角色,一种是在用户 table 下声明的(用户是或不是管理员)然后用户和课程之间存在关系(以及它在课程中的角色,例如学生、教师等)。

问题是,根据我所在的课程(假设 /course/5),用户可以(或不能,取决于关系 userId | courseId | roleId)成为一名教师(以及例如,课程中的老师应该能够 post 公告),所以我应该找到一种方法从 URL 中获取该 courseId,调用 DAO 以获取当前记录的内容-在该课程中的用户角色中,并据此做出决定(例如,重定向到 JSP 视图,该视图具有比学生应有的更多功能)。

在我看来,您有两种方法可以做到这一点:

  1. 实施自定义过滤器以添加到验证/授权链以检查此项。这种方法的缺点是您需要知道根据请求调用哪个 DAO,这可能不是一段很好的代码。此外,如果用户已获得该课程的授权,您很可能会调用 DAO 两次(在授权期间和稍后在您的业务逻辑中)。其他详细信息:https://www.baeldung.com/spring-security-custom-filter.
  2. 您可以在应用常规业务逻辑之前检查此项。在处理 HTTP 请求的服务中,您将检查用户是否有权使用该课程,如果不是,则抛出异常或您认为合适的任何其他方式。这样做的好处是您不会重复调用 DAO(获取课程详细信息)。缺点是您的授权逻辑会与您的常规业务逻辑混在一起。尽管有些人可能不同意,但我认为这是可以接受的,因为检查用户是否获得课程授权在某种程度上也是您常规业务逻辑的一部分。

说了这么多,我会选择第二个选项。