【问题标题】:Dynamic access to a dynamic endpoint [closed]动态访问动态端点[关闭]
【发布时间】:2021-11-06 12:06:43
【问题描述】:

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

问题在于,根据我所在的课程(例如 /course/5),用户可以(或不能,取决于 userId | courseId | roleId 的关系)成为教师(例如教师课程内应该能够发布公告),所以我应该找到一种方法从 URL 中获取该 courseId,调用 DAO 以获取该课程中当前登录的用户角色,并根据对此(例如,重定向到一个 JSP 视图,它的功能比学生应该拥​​有的更多)。

【问题讨论】:

    标签: java spring spring-security


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢你的回答,我的一个朋友推荐我看看 AccessDecisionVoter 但我仍然认为你的第二种方法是正确的,加上使用 AccessDecisionManager 过滤每个 url 而不是我想要的专门评估 so idk 是否正确。
    • 感谢您的提示。以前从未听说过AccessDecisionVoter,但在我看来它是一个具有不同名称的自定义过滤器:)。当然,有一些区别,因为AccessDecisionVoter 似乎确实很有趣,并且抽象了创建和注册自定义过滤器的一些复杂性。不过,我会选择第二种方法。它更简单、更容易理解并且确实有效。
    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    相关资源
    最近更新 更多