REST应用程序中的UI权限端点

时间:2016-12-02 08:55:00

标签: java spring rest spring-mvc spring-security

我有一个带有REST(Spring MVC)后端和纯JavaScript前端的Spring Boot应用程序。最近我们通过Spring安全性启用了安全性,我们正在讨论如何告诉UI用户拥有什么权限,即应根据她的角色向用户显示哪些控件

对于我的尝试:

  • 我们可能只公开端点和权限列表(角色),让UI处理它。这对于后端来说很简单,但在我们的后端我们保持ROLE - >允许的URL映射在前端会发生同样的情况。在某些时候,这些将会分歧(我确定!),我们将展示一个UI控件 - 当使用时 - 将导致403 - Unauthorized

  • 让它以URL为中心,因为这就是REST:有一个端点(比如:/security/privileges?url=...&method=...)回答问题:我是否可以通过Request方法y访问URL x?这将允许UI专注于只看似更好的URL。但看起来像噩梦/后端是不可能的(特别是当您通过@Pre/@Post注释通过过滤器与方法级安全性结合Web安全性时。

问题:

  1. 我正在研究如何实现从REST后端到UI的通信用户权限的最佳实践。它应该是以URL为中心还是仅发送角色列表?

  2. 如果有人通过以URL为中心的方法,有没有办法检查控制器的方法是否会通过安全检查?请注意,WebInvocationPrivilegeEvaluator不适用,因为它没有考虑方法级别的安全性。

  3. 修改 澄清我对发送角色列表的方法的疑虑。如果我这样做那么:

    MVC控制器:

    @PreAuthorize("hasAnyRole('ADMIN', 'EDITOR'")
    @RequestMapping("/editStuff")
    public void editStuff(...) {
       ...
    }
    

    JS:

    if (hasRole('ADMIN') || hasRole('EDITOR')) {
        showEditControllWhichOnClickCalls('/editStuff');
    }
    

    显然有重复检查是否有任何角色 EDITOR ADMIN 。另一方面,如果你在JS中做(并且理想情况下将URL保持为一个常量),它看起来不像我:

    if (doIHaveAccessTo('/editStuff', 'POST')) {
        showEditControllWhichOnClickCalls('/editStuff');
    }
    

1 个答案:

答案 0 :(得分:0)

主音:  登录后,您应该使用与登录用户相关的所有角色和权限来回收UserDetails对象。根据这些信息,您可以决定在UI上应该隐藏或显示哪些控件。

后端:  成功登录后,您可以使用任何SSO系统来保证用户的身份验证。会话,记住我的标记,并不重要。它只是将您的所有请求与SecurityContext中的Authentication对象相关联,并允许您管理对不同服务的访问权限。关于令牌你可以在那里阅读: http://docs.spring.io/spring-security/site/docs/3.0.x/reference/remember-me.html

提出任何具体问题,我将尝试回答