Artigo Diretório
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 UserDetailsService
uma instância no projeto de micro pessoal (https://github.com/lenve/vhr), nós criamos uma classe própria implementar UserDetailsService
a interface, além de seu pacote, também podemos usar o sistema fornecido por UserDetailsService
instâncias padrão , como os artigos e introdução InMemoryUserDetailsManager
.
Vemos o UserDetailsService
que as classes alcançaram:
Pode ser visto em várias classes de implementação que podem ser usadas diretamente, além disso InMemoryUserDetailsManager
, há uma JdbcUserDetailsManager
utilização JdbcUserDetailsManager
que 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_ignorecase
alterado 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.
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 InMemoryUserDetailsManager
utilizando dados fornecidos pelo usuário em JdbcUserDetailsManager
vez 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
JdbcUserDetailsManager
exemplo.
(2) paraJdbcUserDetailsManager
adicionar uma instância do objeto DataSource.
(3) chama ouserExists
mé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 sermosInMemoryUserDetailsManager
basicamente o mesmo método de criação.
Aqui createUser
ou userExists
chamadas 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, userExists
executar método lógico é na verdade uma chamada JdbcTemplate
para 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:
Quatro, teste de login
Então podemos testar.
Durante o processo de teste, se o usuário no banco de dados enabled
definir propriedades para false
, desabilitar a conta, as falhas de login novamente usarão a conta para fazer logon.