Um artigo leva você a obter o Spring Security para armazenar dados do usuário no banco de dados

Próximo Próximo UserDetailService

Spring Security suporta uma variedade de fontes de dados diferentes, essas fontes de dados diferentes serão eventualmente empacotadas em UserDetailsServiceuma instância no projeto de micro pessoal (https://github.com/lenve/vhr), nós criamos uma classe própria implementar UserDetailsServicea interface, além de seu pacote, também podemos usar o sistema fornecido por UserDetailsServiceinstâncias padrão , como os artigos e introdução InMemoryUserDetailsManager.

Vemos o UserDetailsServiceque as classes alcançaram:

Insira a descrição da imagem aqui
Pode ser visto em várias classes de implementação que podem ser usadas diretamente, além disso InMemoryUserDetailsManager, há uma JdbcUserDetailsManagerutilização JdbcUserDetailsManagerque nos permite uma forma por meio de JDBC para conectar o banco de dados e Spring Security.

É necessário adicionar dependências jdbc e mysql aqui:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
</dependency>     

二 、 JdbcUserDetailsManager

O próprio JdbcUserDetailsManager fornece um modelo de banco de dados, que é armazenado no seguinte local:

org/springframework/security/core/userdetails/jdbc/users.ddl

O conteúdo do script armazenado aqui é o seguinte:

create table users(username varchar_ignorecase(50) not null primary key,password varchar_ignorecase(500) 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);

Você pode ver, o script tem um tipo de dados varchar_ignorecase, isso é realmente criado para banco de dados HSQLDB, e usamos o MySQL não suporta este tipo de dados, então aqui precisamos ajustar manualmente o tipo de dados, será varchar_ignorecasealterado para varchar.

create table users(username varchar(50) not null primary key,password varchar(500) not null,enabled boolean not null);
create table authorities (username varchar(50) not null,authority varchar(50) not null,constraint fk_authorities_users foreign key(username) references users(username));
create unique index ix_auth_username on authorities (username,authority);

Depois que a modificação for concluída, crie um banco de dados e execute o script após a conclusão.

Insira a descrição da imagem aqui
Depois de executar o script SQL, podemos ver que no total duas tabelas foram criadas: usuários e autoridades.

A tabela de usuários salva informações básicas do usuário, incluindo nome de usuário, senha de usuário e se a conta está disponível.
As funções do usuário são armazenadas nas autoridades.
Autoridades e usuários são relacionados por nome de usuário.

Uma vez configurado, o próximo, seremos o último artigo InMemoryUserDetailsManagerutilizando dados fornecidos pelo usuário em JdbcUserDetailsManagervez de fora, da seguinte forma:

	@Autowired
    DataSource dataSource;

    @Override
    @Bean
    protected UserDetailsService userDetailsService() {
    
    
        JdbcUserDetailsManager manager = new JdbcUserDetailsManager();
        manager.setDataSource(dataSource);
        if (!manager.userExists("yolo")) {
    
    
            manager.createUser(User.withUsername("yolo").password("123").roles("admin").build());
        }
        if (!manager.userExists("nlcs")) {
    
    
            manager.createUser(User.withUsername("nlcs").password("123").roles("user").build());
        }
        return manager;
    }

O significado desta configuração é o seguinte:

(1) Construção de um primeiro JdbcUserDetailsManagerexemplo.
(2) para JdbcUserDetailsManageradicionar uma instância do objeto DataSource.
(3) chama o userExistsmétodo para determinar se o usuário existe, caso não exista, crie um novo usuário fora (este código será executado porque toda vez que o projeto for iniciado, então adicione um juiz, para evitar a duplicação da criação de um usuário).
Crie um método (4) usuário e antes de sermos InMemoryUserDetailsManagerbasicamente o mesmo método de criação.

Aqui createUserou userExistschamadas de método são realmente escritas em SQL para julgar, podemos ver saindo de sua fonte (parte):

public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsManager,
  GroupManager {
    
    
 public static final String DEF_USER_EXISTS_SQL = "select username from users where username = ?";

 private String userExistsSql = DEF_USER_EXISTS_SQL;

 public boolean userExists(String username) {
    
    
  List<String> users = getJdbcTemplate().queryForList(userExistsSql,
    new String[] {
    
     username }, String.class);

  if (users.size() > 1) {
    
    
   throw new IncorrectResultSizeDataAccessException(
     "More than one user found with name '" + username + "'", 1);
  }

  return users.size() == 1;
 }
}

A partir deste código-fonte pode ser visto, userExistsexecutar método lógico é na verdade uma chamada JdbcTemplatepara executar scripts SQL predefinidos e, em seguida, determinar se o usuário existe, os outros métodos de julgamento são semelhantes, não vou repeti-los.

Três, suporte de banco de dados

Por meio do código anterior, todos veem que o suporte de banco de dados é necessário aqui, então adicionamos as duas dependências a seguir ao projeto:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

Em seguida, configure a conexão do banco de dados em application.properties:

spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/security?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

Como o Mysql 8 está selecionado aqui, as informações de configuração precisam ser adicionadas:serverTimezone=Asia/Shanghai

Depois que a configuração for concluída, você pode iniciar o projeto.

Depois que o projeto é iniciado com sucesso, podemos ver que dois usuários são adicionados automaticamente ao banco de dados e os usuários são configurados com funções. Como mostrado abaixo:

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Quatro, teste de login

Então podemos testar.

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Durante o processo de teste, se o usuário no banco de dados enableddefinir propriedades para false, desabilitar a conta, as falhas de login novamente usarão a conta para fazer logon.

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/nanhuaibeian/article/details/108602260
Recomendado
Clasificación