аутентификация на уровне метода Spring - PullRequest
0 голосов
/ 29 марта 2019

Я сталкиваюсь с ошибкой 403 - Access denied каждый раз, когда пытаюсь нажать этот безопасный метод. Я могу поразить все другие методы, кроме этого безопасного. Если это имеет значение, я использую H2 DB.

Я впервые пытаюсь spring security. Так что прости меня за любые простые ошибки

@RestController
public class ProductController {

    @Autowired
    private ProductService productService;

    @PreAuthorize("hasRole('ADMIN')")
    @PostMapping("/addProduct")
    public ResponseEntity<String> addProduct(@RequestBody Product product) {
        if (productService.addProduct(product)) {
            return new ResponseEntity<String>("newly added " + product.getName(), HttpStatus.CREATED);
        }
        return new ResponseEntity<String>("Could not add product " + product.getName(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

Мой класс конфигурации Spring выглядит следующим образом:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    private static final String authoritiesQuery = "SELECT USERNAME, ROLE FROM TBLUSERS WHERE USERNAME = ?";
    private static final String usersQuery = "SELECT USERNAME, PASSWORD, 1 as enabled FROM TBLUSERS WHERE USERNAME = ?";

    @Autowired
    private DataSource dataSource;

    @Autowired
    protected void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication().dataSource(dataSource).authoritiesByUsernameQuery(authoritiesQuery)
        .usersByUsernameQuery(usersQuery).passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.authorizeRequests().antMatchers(HttpMethod.POST, "/addProduct").hasRole("ADMIN").antMatchers("/").permitAll().and().authorizeRequests()
                .antMatchers("/console/**").permitAll();
        httpSecurity.csrf().disable();
        httpSecurity.headers().frameOptions().disable();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(10);
    }
}

Мои записи H2 DB:

MERGE INTO TBLUSERS VALUES ('Abhi', '$2a$10$5uSoNE.xI.0Pe4uoy1Pd/ushJPh0O32Sa6W/CybjBp9FrytEuPGvq', 'ROLE_USER');
MERGE INTO TBLUSERS VALUES ('Abhishek', '$2a$10$5uSoNE.xI.0Pe4uoy1Pd/ushJPh0O32Sa6W/CybjBp9FrytEuPGvq', 'ROLE_ADMIN');
MERGE INTO TBLUSERS VALUES ('Abhishek', '$2a$10$5uSoNE.xI.0Pe4uoy1Pd/ushJPh0O32Sa6W/CybjBp9FrytEuPGvq', 'ROLE_USER');

1 Ответ

2 голосов
/ 29 марта 2019

Ваша таблица базы данных TBLUSERS содержит двух пользователей с именем пользователя Abhishek.По-видимому, используется последний с правами доступа ROLE_USER.Но URL /addProduct доступен только для пользователей с правами доступа ROLE_ADMIN.Следовательно, вы получаете сообщение об ошибке 403.

Если вы хотите иметь пользователей с несколькими полномочиями, вам нужно изменить схему базы данных, см., Например, Ссылка на Spring Security :

15.1.1 Схема пользователя

Стандартная реализация JDBC UserDetailsService (JdbcDaoImpl) требует таблиц для загрузки пароля, состояния учетной записи (включено или отключено)и список полномочий (ролей) для пользователя.Вам нужно будет настроить эту схему в соответствии с используемым вами диалектом базы данных.

create table users(
    username varchar_ignorecase(50) not null primary key,
    password varchar_ignorecase(50) not null,
    enabled boolean not null
);

create table authorities (
    username varchar_ignorecase(50) not null,
    authority varchar_ignorecase(50) not null,
    constraint fk_authorities_users foreign key(username) references users(username)
);
create unique index ix_auth_username on authorities (username,authority);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...