通过预授权保护 vaadin 8 个视图(spring 安全性)

Protect vaadin 8 views with pre-authorize (spring security)

我目前正在开发一个带有 spring 引导的 Vaadin 8 应用程序,正如我在许多帖子中所读到的,保护视图的正确方法是使用 PreAuthorize 注释 class。我这样做是为了保护这样的观点:

@SpringView(name="arinteractions")
@PreAuthorize("hasAuthority('OWNER') or hasAuthority('ADMIN')")
public class ARInteractionsView extends SideMenuViewBase {

我遇到的第一个问题是我的角色没有 ROLE_ 前缀,所以我添加了它。

仍然,spring 允许用户通过键入其 URL 进入任何视图(在 vaadin 中是像 #!interactionview 这样的 hashbang)。

添加这个允许有访问权限的用户进入视图,但也允许没有访问权限的用户。当没有角色的用户试图进入他们打开的视图时。日志显示:

Found view ARStorageBanksView annotated with @PreAuthorize but no access decision manager. Granting access.

同时抛出异常:

org.springframework.security.access.AccessDeniedException 
at org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:84) ~[spring-security-core-5.0.4.RELEASE.jar:5.0.4.RELEASE]

我尝试通过在安全配置中添加 bean maker 方法来添加访问决策管理器,但我没有找到任何关于如何正确实现它的文档。

此外,添加访问决策管理器只会让情况变得更糟。所有视图都被阻止,日志显示视图“不存在”。

我解决的问题是使用旧的@Secured 注解。由于某种原因,它工作得很好。

Spring 安全角色、权限非常混乱。它的一些对象是字符串,一些是普通对象,auth 脚本很难调试,需要的转换不明显。

所以问题是,设置安全性以便我可以使用较新的预授权的正确方法是什么?

我认为使用@Secured 没有任何问题,特别是如果它有效的话。 Vaadin 参考应用程序 (Bakery) 也已使用它实现。查看更多信息:https://vaadin.com/start/v8-full-stack-spring