Keycloak - antMatcher не соответствует запрошенному пути Java - PullRequest
0 голосов
/ 22 марта 2020

Я вошел с правильными учетными данными как "РЕБЕНОК", поэтому он отличается от роли "ПОЛЬЗОВАТЕЛЬ". Когда я отправляю запрос на получение с токеном http://localhost: 8081 / iam / account / users , он мне не разрешается, и это нормально.

enter image description here

Но когда я отправляю запрос на http://localhost: 8081 / iam / account / users / (примечание sla sh добавляется в конец URL), я получаю разрешение чтобы попасть по этой ссылке и вернуть тело мне дано. Но я не должен быть авторизован для его получения.

enter image description here

Мой метод настройки. Похоже, работает, я просто не понимаю, почему "/ iam / account / users *" не совпадает также с URL с добавленным sla sh в конце?!

@Override
protected void configure(HttpSecurity http) throws Exception {

    super.configure(http);
    ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry expressionInterceptUrlRegistry = http.cors() //
            .and() //
            .csrf().disable() //
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) //
            .and() //
            .authorizeRequests();

    expressionInterceptUrlRegistry = expressionInterceptUrlRegistry.antMatchers("/iam/accounts/users*").hasRole("USER");
    expressionInterceptUrlRegistry = expressionInterceptUrlRegistry.antMatchers("/iam/accounts/childs*").hasRole("CHILD");

    expressionInterceptUrlRegistry.anyRequest().permitAll();
}

Rest controller

@RestController
@RequestMapping(path = "/iam/accounts", produces = MediaType.APPLICATION_JSON_VALUE)
@Validated
public class AccountController {

@GetMapping(path = "/users")
public String promoters() {
    return "Logged as user";
}

@GetMapping(path = "/childs")
public String supervisors() {
    return "Logged as child";
}
}

Я могу это исправить, если я добавлю 2 строки вместо одной, но почему этот antMatcher не делает этого, если звездочка * означает, что может следовать любое количество символов?

expressionInterceptUrlRegistry = expressionInterceptUrlRegistry.antMatchers("/iam/accounts/users").hasRole("USER");
expressionInterceptUrlRegistry = expressionInterceptUrlRegistry.antMatchers("/iam/accounts/users/*").hasRole("USER");

1 Ответ

1 голос
/ 22 марта 2020

Работает как положено. * совпадения в одном каталоге. / является разделителем пути, поэтому он не считается одним и тем же каталогом. user * будет соответствовать user, users, но не user /.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...