Spring Security 6 Сопоставители запросов

Итак, недавно я начал работать с Spring Security и вроде как понимаю, что он делает, однако единственное, что меня серьезно настораживает, это то, какrequestMatchers().hasRole()иrequestMatchers.hasAuthority()работает...

Я понимаю, как они вызываются, и у меня есть этот фрагмент кода, который я пытаюсь заставить работать, но я явно делаю что-то не так, поскольку ролл SUPER_USER просто не получает доступа к конечным точкам /userManagement/**...

      http
      //CSRF Protection
      .csrf(csrf -> csrf.disable())
      .authorizeHttpRequests(
        auth -> {
          auth
            //Whitelist URLS
            .requestMatchers("/auth/**").permitAll()

            //Authorize Requests
            .requestMatchers("/userManagement/**").hasRole(Role.SUPER_USER.name())
            .anyRequest().denyAll();
        }
      )

У меня есть такое перечисление ролей...

      @RequiredArgsConstructor
public enum Role {
  SUPER_USER(
    Set.of(
      SUPER_USER_READ,
      SUPER_USER_UPDATE,
      SUPER_USER_CREATE,
      SUPER_USER_DELETE
    )
  );

@Getter
  private final Set<Permission> permissions;

  public List<SimpleGrantedAuthority> getAuthorities() {
    List<SimpleGrantedAuthority> permissions = getPermissions().stream()
      .map(permission -> new SimpleGrantedAuthority(permission.getPermission()))
      .collect(Collectors.toList());
    permissions.add(new SimpleGrantedAuthority("ROLE_" + this.name()));
    return permissions;
  }

  public static Role fromString(String value) {
    for (Role role : Role.values()) {
      if (role.name().equalsIgnoreCase(value)) {
        return role;
      }
    }
    throw new LoginException("Invalid Role: " + value);
  }
}

С разрешениями, объявленными в собственном Enum

      @RequiredArgsConstructor
public enum Permission {
  SUPER_USER_READ("superuser:read"),
  SUPER_USER_UPDATE("superuser:update"),
  SUPER_USER_CREATE("superuser:create"),
  SUPER_USER_DELETE("superuser:delete");

  @Getter
  private final String permission;
}

Моя конечная цель — иметь возможность вызывать эту конечную точку с помощью пользователя с ролью суперпользователя.

      @RestController
@RequestMapping("/userManagement")
@RequiredArgsConstructor
public class UserManagementController {

  private final UserService userService;

  @GetMapping("/getUsers")
  public String getUsers() {
    return "getUsers";
  }

}

Я надеюсь, что кто-нибудь сможет подсказать мне, в чем может быть проблема?

Я часами просматривал видео на YouTube и просматривал примеры кода, структурированные аналогично. Независимо от того, какие изменения я пытался применить, например. пробуя разные роли или используя только SuperUserRole или метод hasPermission, я не могу справиться с этим.

Если я сделаю это

      //.requestMatchers("/userManagement/**").hasRole(Role.SUPER_USER.name())
//            .requestMatchers(HttpMethod.GET, "/userManagement/**").hasAuthority(Permission.SUPER_USER_READ.getPermission())
//            .anyRequest().denyAll();
.anyRequest.authenticated();

Я добираюсь до конечной точки и получаю ожидаемый результат. Это говорит мне о том, что проблема заключается в том, как я обрабатываю эту конфигурацию.

И консоль не очень помогает после включения ведения журнала отладки для Spring Boot, поскольку единственное, что появляется, этоo.s.s.w.a.Http403ForbiddenEntryPoint - Pre-authenticated entry point called. Rejecting accessи я не могу найти много информации о том, как решить эту проблему.

1 ответ

Хорошо, я понял это...

В Enum у меня есть метод.

То, что я забыл сделать, это в моей сущности пользователя, которая реализуетorg.springframework.security.core.userdetails.UserDetails

В переопределенномgetAuthorities()мне просто нужно былоreturn this.role.getAuthorities()

Другие вопросы по тегам