Как переопределить роль для указанной конечной точки c в Spring Security? - PullRequest
1 голос
/ 27 января 2020

Я настраиваю конфигурацию безопасности с помощью Spring Security.

Мне интересно, можно ли переопределить роль для более конкретной c конечной точки с помощью HttpSecurity объект.

Допустим, у меня есть что-то вроде этого:

httpSecurity
               .authenticationProvider(authenticationProvider)
               .authorizeRequests()
               .antMatchers("/api/v1/**").hasRole("ADMIN")

И я хочу иметь другую роль для более конкретной c конечной точки:

httpSecurity
                .authenticationProvider(authenticationProvider)
                .authorizeRequests()
                .antMatchers("/api/v1/**").hasRole("ADMIN")
                .antMatchers("/api/v1/specific").hasRole("ROLE_ONLY_FOR THIS_ENDPOINT")

И это не работает, для него все еще требуется роль ADMIN для указанной конечной точки c.

Можно ли как-то переопределить ее или исключить эту конечную точку из более распространенной правило роли?

Обновление 1 :

    @PreAuthorize("hasAuthority('ROLE_SPECIFIC')")
    @GetMapping("/specific")
    public ResponseEntity<TopDamagedComponentsResponse> getTopDamagedComponents(
            @RequestParam(required = true) String manufacturer,
            @RequestParam(required = true) String model,
            @RequestParam(required = true) String vehicleBodyType,
            @RequestParam(required = true) String vehicleType,
            @RequestParam(defaultValue = "25", required = false) Integer limit){
        List<ComponentDto> topDamagedComponents = service.getTopDamagedComponents(manufacturer, model, vehicleBodyType, vehicleType, limit);
        TopDamagedComponentsFilter filter = new TopDamagedComponentsFilter(manufacturer, model, vehicleBodyType, vehicleType);
        return new ResponseEntity<TopDamagedComponentsResponse>(new TopDamagedComponentsResponse(topDamagedComponents, topDamagedComponents.size(), filter), HttpStatus.OK);
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .addFilterBefore(tokenAuthFilter, BasicAuthenticationFilter.class)
                .antMatcher("/**")
                .authenticationProvider(authenticationProvider)
                .authorizeRequests()


                .antMatchers("/api/v1/**").hasRole("ADMIN")

                .antMatchers("/v2/api-docs", "/swagger-resources/configuration/ui", "/swagger-resources", "/swagger-resources/configuration/security", "/swagger-ui.html", "/webjars/**").permitAll()

                .antMatchers("/actuator/**").permitAll()

                .and()
                  .sessionManagement()
                      .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        http.csrf().disable();


    }

Я пытался использовать @PreAuthorize, но он все еще не работает.

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Спасибо @RG за замечание опечатки. Мне не хватало / в начале моей конечной точки (api/v1/specific), это было так:

httpSecurity
                .authenticationProvider(authenticationProvider)
                .authorizeRequests()
                .antMatchers("api/v1/specific").hasRole("ROLE_ONLY_FOR THIS_ENDPOINT")
                .antMatchers("/api/v1/**").hasRole("ADMIN")

После добавления / и установки правил в правильном порядке в цепочке (более точные c должны быть go первыми, а более общие - в конце цепочки), он работает как ожидалось: для конкретной c конечной точки требуется только указанная c роль и все остальные под /api/v1/** требуют роли администратора.

Наконец, это выглядит так:

httpSecurity
                .authenticationProvider(authenticationProvider)
                .authorizeRequests()
                .antMatchers("/api/v1/specific").hasRole("ROLE_ONLY_FOR THIS_ENDPOINT")
                .antMatchers("/api/v1/**").hasRole("ADMIN")
0 голосов
/ 27 января 2020

Добавьте @PreAuthorize("hasAuthority('" + ROLE + "')") над заголовком метода.

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