Весенняя загрузка стартера не аутентифицируется - PullRequest
1 голос
/ 11 октября 2019

Я новичок в безопасности весенней загрузки и следую этому уроку:

https://www.baeldung.com/spring-security-jdbc-authentication

Я использую POSTMAN для тестирования.

Я использовал Type = Basic Auth в Авторизации -> Тип

Имя пользователя / Пароль = admin / 12345

Я пробовал все, но всегда получал следующий ответ:

{
    "timestamp": "2019-10-11T16:03:23.463+0000",
    "status": 401,
    "error": "Unauthorized",
    "message": "Unauthorized",
    "path": "/api/user"
}    

Один из URL:

http://localhost:8080/api/user

Вот моя конфигурация безопасности:

package com.spr.security;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

import com.spr.util.Constants;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter 
{
    @Autowired
    private DataSource dataSource;

    @Autowired
    private PasswordEncoder passwordEncoder;

    protected void configure(HttpSecurity http) throws Exception 
    {
        http.httpBasic()
            .and()
            .authorizeRequests()
            .antMatchers("/api/**").hasRole("USER")
            .antMatchers("/admin/**").hasRole("ADMIN")
            .and()
            .csrf().disable()
            .headers().frameOptions().disable();
    }

    @Autowired
    protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
    {
            auth.jdbcAuthentication().dataSource(dataSource).passwordEncoder(passwordEncoder);  

        /*
         * By default spring security assumes `users` table for storing users 
         * and `authorities` table for storing roles
         */
    }

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

Также пробовал:

auth.jdbcAuthentication().dataSource(dataSource).passwordEncoder(new BCryptPasswordEncoder());  

Я создал следующие таблицы, используя сущности.

users
    id int AUTO_INCREMENT (PK)
    username UNIQUE varchar(256)
    email varchar(256)

authorities
    username varchar(256)
    authority varchar(256)

В каждой таблице по одной записи

В пользователях:

username = admin
password = $2y$10$llcw8Cbuww90KW1dYB6Rn.98iM0JyTiC1VBT1WveVKz99VqbhFLpG
email = abc@test.com

Пароль был хеширован 12345 на bcrypt-generator.com с силой 10

В полномочиях:

username = admin
authority = ROLE_USER

Я также пробовал полномочия = USER

У меня есть следующая зависимость в моем pom.xml

<!-- Spring data JPA -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- spring security -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

        <!-- for jdbc authentication -->
        <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

Мой файл application.properties

## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url=jdbc:mysql://localhost:3306/sprboot?useSSL=false&serverTimezone=UTC
spring.datasource.username=spr
spring.datasource.password=boot


## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto=validate

spring.jackson.serialization.fail-on-empty-beans=false

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration
logging.level.org.springframework.security=DEBUG

Без Spring Security все мои пути, контроллеры, jpa и т. Д. Работают нормально.

Что я здесь не так делаю?

Требуется ли дополнительная информация?

Редактировать

Есть ли способ увидеть sql аутентификацию безопасности в окне журнала (console) Я добавил следующее в application.properties, но ничего не показывает сгенерированный sql

spring.jpa.show-sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
logging.level.org.springframework.security=DEBUG

Я использую базу данных mysql

1 Ответ

0 голосов
/ 13 октября 2019

Было две проблемы, и вот как я исправил:

Изменено hasRole () на hasAuthority ()

protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.httpBasic()
            .and()
            .authorizeRequests()
            .antMatchers("/api/**").hasAuthority("USER")
            .antMatchers("/admin/**").hasAuthority("ADMIN")
            .and()
            .csrf().disable()
            .headers().frameOptions().disable();
    }

IВ другой ссылке на переполнение стека обнаружена ошибка в Spring Security, и зашифрованный пароль должен начинаться с $ 2a ... , а не с $ 2b ... или $ 2y ...

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