使用Wicket的Spring安全角色层次结构

9nvpjoqh  于 2023-04-20  发布在  Spring
关注(0)|答案(1)|浏览(127)

我想利用Apache Wicket框架中Spring Security的role hierarchies功能。即授权访问单个网页。Wicket设置为从安全上下文获取角色,因此我可以毫无问题地使用它:

@AuthorizeInstantiation({"ROLE_ADMIN", "ROLE_USER"})
public class HomePage extends BasePage

我已经设置了角色层次结构,以便ADMIN高于USER

@Bean
public RoleHierarchy roleHierarchy()
{
    RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
    roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");
    return roleHierarchy;
}

当我仅使用ADMIN角色访问授权端点 /hello 时,它工作正常:

http.authorizeRequests()
    .antMatchers("/hello").hasRole("USER")

理想情况下,我想做这样的事情:

// Caution: invalid code - for demonstration only
@AuthorizeInstantiation("hasRole('USER')")
public class HomePage extends BasePage

分问题:如果在类级别上是不可能的,那么有什么干净的方法可以防止Wicket基于角色层次来呈现组件,例如BookmarkablePageLink?

7fyelxc5

7fyelxc51#

我没有Spring Security角色层次结构的经验,但我觉得下面的工作很好:

@AuthorizeInstantiation({"ROLE_USER"})
public class HomePage extends BasePage

也就是说,如果当前用户的角色是USER或更高,那么它将允许页面的示例化,即ADMIN也应该是OK的。
wicket-auth-roles项目不支持hasRole()等Spring特性。
关于你的第二个问题:您可以重写Component#isEnabled()(或者更好的Component#onConfigure()+对Component#setEnabled(boolean)的调用。您可以使用Spring Security API来计算enabled boolean的值。

相关问题