当前位置: 首页 > 知识库问答 >
问题:

基于SpringBoot方法的分层角色安全性:ServletContext是必需的

咸浩初
2023-03-14

我添加了基于方法的安全性和角色层次结构。我在构建过程中不断遇到以下异常:

组织。springframework。豆。BeanInstationException:未能实例化[org.springframework.web.servlet.HandlerMapping]:工厂方法“defaultServletHandlerMapping”引发异常;嵌套的例外是java。lang.IllegalArgumentException:配置默认servlet处理需要ServletContext

我尝试了很多不同的配置选择,但都不起作用...这是我的基本Web安全配置类(如您所见,我添加了与角色层次结构相关的bean):

@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

(...)

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity
            .csrf()
            .disable()
            (...)
            .expressionHandler(webExpressionHandler())
            (...)
            .anyRequest().authenticated();

    httpSecurity
            .addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);
}

@Bean
public SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
    DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
    defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy());
    return defaultWebSecurityExpressionHandler;
}

@Bean
public RoleHierarchy roleHierarchy() {
    RoleHierarchyImpl r = new RoleHierarchyImpl();
    r.setHierarchy(Role.getHierarchy());
    return r;
}

(...)

}

下面是我根据这个线程创建的单独配置文件:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class GlobalMethodSecurityConfig extends GlobalMethodSecurityConfiguration {

    @Autowired
    private RoleHierarchy roleHierarchy;

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        DefaultMethodSecurityExpressionHandler expressionHandler = (DefaultMethodSecurityExpressionHandler) super.createExpressionHandler();
        expressionHandler.setRoleHierarchy(roleHierarchy);
        return expressionHandler;
    }
}

我为此挣扎了好几个小时。我尝试过的相关话题如下:

  • Spring Boot Spring Security分层角色
  • 创建名为“defaultServletHandlerMapping”的bean时出错
  • 创建名为defaultServletHandlerMapping的bean时出错

感谢您的帮助!

共有1个答案

袁飞鹏
2023-03-14

好的,找到了。

我仔细研究了这些类注释,找到了一个简单的解决方案:我从GlobalMethodSecurityConfig中删除了@EnableGlobalMethodSecurity,并将其移动到了WebSecurityConfiguration,它以前就是这样。看起来是这样的:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { (...) }

这是:

@Configuration
public class GlobalMethodSecurityConfig extends GlobalMethodSecurityConfiguration { (...) }

最有趣的是,这里被接受的答案告诉我什么不适合我。

 类似资料:
  • 我无法在注释中使用方法。还有给出。我错过了什么?尽管工作正常。 我正在从数据库中为用户分配权限。

  • 我需要使用登录的员工的角色在jsp页面中隐藏导航。应用程序使用单点登录登录。我将只从另一个应用程序获得用户的用户名,我将使用该应用程序在数据库中搜索以获得员工的详细信息。我在employee表中有一个role列,我目前正在javascript中使用它来显示和隐藏导航。如何设置spring security role并在jsp标记中使用“hasRole('any role')”,以显示或隐藏导航。我

  • 我试图保护我的Spring启动应用程序(1.21)看起来像我的antMatcher("/报告**"). hasRole("报告")的一些URL模式被忽略。 e、 g.如果我浏览到localhost:9000/report/books之类的内容,我需要登录,它只适用于我的用户名密码组合,但我没有将角色报告设置为我的用户“user”。所以我希望我不被允许访问报告网站,但页面会显示出来。 我必须如何更改

  • 在 JAX-RS 应用程序中,必须根据已登录用户分配到的角色来筛选我的某些资源。我正在尝试使用安全注释(和)来实现此目的。 现在,每个人(匿名和登录用户)都可以并检索(每个id),但对于角色中的用户,我希望看到输出(此处序列化为JSON): 其他用户(无论是匿名用户还是非角色的其他用户)应该只看到: 我知道Jersey有实体过滤(以及基于安全角色进行过滤的实现)。 不幸的是,Liberty(基于A

  • 看起来它工作得很好,但我想知道我是否必须确保新代码需要线程安全?这里有什么意见吗?抱歉用了假名字,提前致谢。

  • 到目前为止还好。我使用swagger-codegen构建了相应的服务器存根,它遵循connexion安全模型,并提供了两个字段,即承载令牌和“required_scopes”,即应该包含“labuser”。访问endpoint时,调用控制器函数: 当承载令牌正确传递时,是。因此,无法实际验证提供的令牌中显示的凭据和权限是否与授权控制器中endpoint所需的范围相匹配。我考虑在调用的endpoin