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()