首页 > 解决方案 > 在 WebSecurityConfiguration 中注册 PermissionEvaluator

问题描述

假设我有以下 PermissionEvaluator 实现

@Component
public class AlwaysAccessPermissionEvaluator implements PermissionEvaluator {

  @Override
  public boolean hasPermission(Authentication authentication, Object targetDomainObject,
      Object permission) {
    return true;
  }

  @Override
  public boolean hasPermission(Authentication authentication, Serializable targetId,
      String targetType, Object permission) {
    return true;
  }
}

所以我知道如何为方法注释注册它,但我想在 WebSecurity 中使用它。所以我有以下配置类:

@Configuration
public class WebConfig extends WebSecurityConfigurerAdapter{

  @Autowired
  private AlwaysAccessPermissionEvaluator permissionEvaluator;

  @Override
  public void configure(WebSecurity web) throws Exception {
    var handler = new DefaultWebSecurityExpressionHandler();
    handler.setPermissionEvaluator(permissionEvaluator);
    web.expressionHandler(handler);
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    super.configure(http);
    http.csrf()
        .disable()
        .authorizeRequests()
        .antMatchers(HttpMethod.GET, "/**")
        .permitAll()
        .antMatchers(HttpMethod.POST, "/foo/{id}/**")
        .access("hasPermission(#id, 'example', 'READ')")
        .anyRequest()
        .denyAll();
  }
}

但是,当我现在向 PermissionEvaluator 发送 POST 请求时,/foo/{id}没有调用,而是收到 403 Forbidden。

那么我怎样才能在那里使用我的 PermissionEvaluator 呢?

标签: springspring-bootspring-security

解决方案


推荐阅读