我有一个带有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安全性时。
问题:
我正在研究如何实现从REST后端到UI的通信用户权限的最佳实践。它应该是以URL为中心还是仅发送角色列表?
如果有人通过以URL为中心的方法,有没有办法检查控制器的方法是否会通过安全检查?请注意,WebInvocationPrivilegeEvaluator不适用,因为它没有考虑方法级别的安全性。
修改 澄清我对发送角色列表的方法的疑虑。如果我这样做那么:
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');
}
答案 0 :(得分:0)
主音: 登录后,您应该使用与登录用户相关的所有角色和权限来回收UserDetails对象。根据这些信息,您可以决定在UI上应该隐藏或显示哪些控件。
后端: 成功登录后,您可以使用任何SSO系统来保证用户的身份验证。会话,记住我的标记,并不重要。它只是将您的所有请求与SecurityContext中的Authentication对象相关联,并允许您管理对不同服务的访问权限。关于令牌你可以在那里阅读: http://docs.spring.io/spring-security/site/docs/3.0.x/reference/remember-me.html
提出任何具体问题,我将尝试回答