Spring MVC中的自定义授权

我们有一个应用程序,用户可以由管理员创建用户,并将角色分配给特定类型的实体。

例如,如果实体名为Student ,则应用程序的用户具有不同级别的权限,例如:

  • 查看者 – 查看学生详细信息
  • 编辑 – 编辑学生详细信息
  • 出口商 – 出口学生详细信息

执行上述操作的URI如下所示:

  • GET/content/{classId}/{studentId}/view
  • PUT/content/{classId}/{studentId}
  • GET/content/{classId}/{studentId}/export
  • POST/content/{classId}/{studentId}/export

请注意,URI具有动态性质。 此外,给定用户User A可以为Class 1分配VIEWER角色,为Class 2分配EXPORTER

在我的spring-security配置中,我只定义了两个权限 – ADMINISTRATORUSER

  • ADMINISTRATOR – 可以访问所有内容
  • USER – 可以访问除/admin/* URI之外的所有内容。

角色VIEWEREDITOREXPORTER不是弹簧安全角色。 现在我遇到了一个问题,同时限制用户访问他们没有权限的资源。

此外,如果用户没有正确的EXPORTER ,他甚至不应该看到导出按钮(放在应用程序的某个位置)。 也许我可以使用spring的security标记库来做到这一点。 但这完全是另一个问题。

我可以让他们知道spring-security,但问题是我在哪里读取{studentId}@PathVariable )的逻辑并将其与当前登录用户匹配以检查他是否有权访问它。

我甚至想过创建一个侦听/content/*的filter/ HandlerInterceptor的想法。 但我必须做一些难看的事情,比如解析URI,自己提取第二个路径参数,然后检查数据库。

这样做有更优雅,弹簧安全的方式吗?

欢迎任何想法。

您可以提供Spring安全性自己的SecurityExpressionHandler实现。 只需扩展DefaultWebSecurityExpressionHandler并覆盖createSecurityExpressionRoot 。 默认情况下,此方法返回WebSecurityExpressionRoot的实例。 您的实现可以只扩展此类并添加其他方法,您将在spring安全配置中使用这些方法。

以下是您提供自己的SecurityExpressionHandler实现的方法。 代码来自spring安全文档 :

       

答案是否提供了足够的信息,还是需要进一步的帮助?