Canção Ge mãos que você começou com Spring Security, não pergunte como descriptografar uma senha


Devido ao pequeno parceiro antes de discutir como descriptografar a senha no grupo de micro pessoal Canção Ge, eu vejo depois dos chats atordoado.

Em qualquer caso, eu tenho que escrever um artigo, Introdução ao Spring Security com todos! Quando introduzimos dependência Spring Security relacionadas em um projeto, o padrão é o formulário de login, então começamos com o formulário de login.

Este artigo de vídeo correspondente

O seguinte é as notas de vídeo.

1. Crie um novo projeto

Primeiro crie um novo projeto Primavera Bota, a introdução de dependência Spring Security e Web Quando você cria um dependente, como mostrado abaixo:

[Imagem despejar a cadeia falhar, a estação de origem pode ter mecanismo de cadeia de segurança, recomenda-se para salvar a imagem para baixo carregado diretamente (img-Ur2YJrgF-1585095356039) (http://img.itboyhub.com//2020/03/spring-security- 2-1.png)]

Depois que o projeto é criado com sucesso, Spring Security é dependente acrescentando entrou, nós nos juntamos no arranque da Primavera é spring-boot-starter-security, é principalmente estes dois:

Depois que o projeto é criado com sucesso, nós adicionamos um teste HelloController, tem o seguinte teor:

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

Então não faça nada, começamos diretamente o projeto.

No processo de iniciação do projeto, vamos ver a seguinte linha de log:

Using generated security password: 30abfb1f-36e1-446a-a79b-f70024f589ab

Este é o Spring Security como a senha temporária gerado pelo usuário padrão para o usuário, é uma string UUID.

Em seguida vamos para acessar http://localhost:8080/helloa interface, você pode ver automaticamente redirecionado para a página de login:

Na página de login, o nome de usuário padrão é o usuário, a senha padrão é impresso no início do console da senha do projeto, em seguida, digite o nome de usuário e senha, em seguida, faça o login com sucesso, o login for bem sucedido, vamos ser capazes de acesso / Olá interface a.

Em Spring Security, a página de login padrão e login da interface é /login, é apenas uma solicitação get (página de login), o outro é uma solicitação post (interfaces de login).

Como podemos ver, muito conveniente, uma dependência sobre a protecção de todas as interfaces.

Algumas pessoas dizem que, como você sabe sabe a senha padrão é gerada por um UUID isso?

Isso é realmente muito bom senso.

classe de configuração automatizada associada ao usuário no UserDetailsServiceAutoConfigurationinterior, neste tipo de getOrDeducePasswordabordagem, vemos a seguinte linha de log:

if (user.isPasswordGenerated()) {
	logger.info(String.format("%n%nUsing generated security password: %s%n", user.getPassword()));
}

Não há dúvida de que nós vemos no log do console é impresso a partir daqui. Condições método que retorna verdadeiro isPasswordGenerated, essa senha é gerada pelo padrão de impressão.

Além disso, descobrimos que, user.getPassword aparecer em SecurityProperties, os SecurityProperties vemos a seguinte definição:

/**
 * Default user name.
 */
private String name = "user";
/**
 * Password for the default user name.
 */
private String password = UUID.randomUUID().toString();
private boolean passwordGenerated = true;

Você pode ver, o nome de usuário padrão é o usuário, a senha padrão é o UUID e, por padrão, também passwordGenerated verdade.

2. Configuração do usuário

O único problema senha padrão é que cada vez que você reiniciar o projeto teria que mudar, o que é inconveniente.

Antes formalmente apresentado conexões de banco de dados, Canção Ge e introduzir o primeiro esquema de nome de usuário / senha de dois non-mainstream.

2.1 arquivos de configuração

Podemos configurar o nome de usuário e senha padrão nas application.properties.

Como configurá-lo? Nós ainda me lembro da seção anterior dissemos SecurityProperties, o usuário padrão é definida no interior é uma classe interna estática, se quisermos definir o seu próprio nome de usuário e senha, é necessariamente vai substituir a configuração padrão, que primeiro olhar para os SecurityProperties definição:

@ConfigurationProperties(prefix = "spring.security")
public class SecurityProperties {

Isto é muito claro, só precisamos spring.security.user prefixado para definir a senha do nome de usuário:

spring.security.user.name=javaboy
spring.security.user.password=123

Este é o nosso novo nome de usuário e senha definida.

Usuário e senha definida nas propriedades do método set final é injetado através do movimento de propriedade, aqui vamos olhar para a forma métodos SecurityProperties.User # setPassword abaixo:

public void setPassword(String password) {
	if (!StringUtils.hasLength(password)) {
		return;
	}
	this.passwordGenerated = false;
	this.password = password;
}

Então, podemos ver a partir daqui, application.properties senha definida veio após a injeção, mas também a maneira de configurar passwordGenerated propriedade é falsa, essa propriedade é definida como false, o console não irá imprimir a senha padrão.

Neste projeto de reinício, você pode logar com o seu próprio definido pelo usuário nome / senha.

classe 2.2 configuração

Além do arquivo de configuração acima desta maneira, também podemos configurar um nome de usuário / senha na classe de configuração.

Na configuração de classe de configuração, temos de especificar PasswordEncoder, isso é uma coisa muito crítico.

Considerando-se o parceiro de pequeno porte para alguns PasswordEncoder não estão familiarizados com, então eu estou aqui para dizer-lhe sobre um pouco PasswordEncoder no final é fazer com. Say PasswordEncoder, você tem que começar com criptografia de senha.

2.2.1 Por Encryption

21 de dezembro de 2011, foi divulgada no banco de dados web contendo 6 milhões de dados do usuário CSDN, todos os dados são armazenados em texto simples, que contém o nome de usuário, senha e endereço de e-mail. Após o incidente no canal CSDN micro-Bo, o site oficial e assim emitiu um comunicado, explicando que este sistema de backup de banco de dados usado em 2009, devido a vazamentos inexplicáveis ​​foram reportados à polícia, e mais tarde no site oficial emitiu uma carta pública de desculpas. Ao longo dos próximos dias dez, o Jinshan, Netease, Jingdong, Dangdang, Sina e outras empresas estão envolvidas neste incidente. O que é mais chocante do que as senhas do usuário CSDN armazenadas em texto simples, porque muitos usuários são vários sites compartilhar uma senha, para um site de senha divulgação vai causar um grande risco de segurança. Muito obrigado aviso, estamos fazendo o sistema, a senha deve ser criptografada.

O vazamento também deixou algumas coisas interessantes, especialmente para a maioria dos programadores senha este. Pessoas do CSDN vazou documento, encontrado algumas senhas divertidas, como os abaixo:

  • ppnn13%dkstFeb.1st determinação chinesa esta senha é: Ping Ping onda mais de treze anos, cardamomo Shaotou início de fevereiro.
  • csbt34.ydhl12s determinação chinesa esta senha é: Bi musgo Ikegami três ou quatro pontos, no fundo de um Oriole duas vezes
  • ...

E assim por diante, você vai encontrar um monte de programadores humanidades ainda é muito alto, é impressionante.

2.2.2 Encryption

Nós geralmente usam criptografia função hash de senha, também conhecido como algoritmo de hash, função hash, que é uma maneira de criar uma "impressão digital" de quaisquer dados. A função hash para a compilação de mensagem, ou a compressão de dados, de modo a que a pequena quantidade de dados, os dados de formato fixo para baixo, e depois misturando os dados perturbados, recriar um valor de hash. valor de hash é normalmente uma seqüência aleatória curta de letras e números que representam. Boa função hash de colisões de hash raramente ocorrem no campo de entrada. Na tabela de hash e processamento de dados, não inibe o conflito para distinguir entre dados, registros de dados fará com que seja mais difícil de encontrar. Nossos funções hash comuns são MD5 mensagem de digerir algoritmo, algoritmo de hash seguro (Secure Hash Algorithm).

Mas apenas usando uma função hash não é suficiente, a fim de aumentar a segurança da senha, o processo de criptografia senha no também sal necessidade geral, o sal pode ser um número aleatório chamado ou um nome de usuário, em seguida, adicione sal, mesmo se a mesma senha em texto simples senha gerada pelo usuário não é o mesmo texto cifrado, o que pode melhorar significativamente a segurança da senha. Mas a maneira tradicional de sal em um banco de dados requer um campo especial para gravar o valor de sal, este campo pode ser um campo de nome de usuário (porque o nome de usuário único), ele poderia ser um valor especial sal campo de registro, esta configuração é mais complicada.

Spring Security fornece uma variedade de esquema de criptografia de senha, o BCryptPasswordEncoder oficial recomendado, o uso BCryptPasswordEncoder bcrypt função hash forte, os desenvolvedores podem optar por usar para proporcionar força e exemplo SecureRandom. quanto maior for a força, mais o número de iterações do tecla, o número de iterações chave é 2 ^ força. valor de força entre 4 e 31, 10 por padrão.

Shiro é diferente da necessidade de lidar com o seu próprio sal senha, na Spring Security, BCryptPasswordEncoder vem com um sal, e tem sido fácil.

A classe de implementação é a interface BCryptPasswordEncoder PasswordEncoder.

2.2.3 PasswordEncoder

PasswordEncoder nesta interface define três métodos:

public interface PasswordEncoder {
	String encode(CharSequence rawPassword);
	boolean matches(CharSequence rawPassword, String encodedPassword);
	default boolean upgradeEncoding(String encodedPassword) {
		return false;
	}
}
  1. O método utilizado para codificar uma palavra-passe para encriptar um texto simples, o texto cifrado devolvido depois de ser encriptada.
  2. O método é um método partidas senha agrupamento, quando o usuário fizer login, o banco de dados armazenados em texto claro senha e o texto cifrado senha do usuário transmitidos como um parâmetro passado para o método para isso, de acordo com o valor booleano determina se a senha do usuário de entrada para retorno correta.
  3. Se upgradeEncoding deve ser re-criptografado, isso geralmente não teria tido.

Podemos ver classe de implementação PasswordEncoder pela seguinte figura:

2.2.4 Configuração

Após as preliminares terminou, então olhamos para os detalhes de como configurar:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("javaboy.org")
                .password("123").roles("admin");
    }
}
  1. Primeiro, nosso costume SecurityConfig herdada de WebSecurityConfigurerAdapter, reescrita método configure dentro.
  2. Primeiro, nós fornecemos um exemplo de uma PasswordEncoder, porque o presente caso é relativamente simples, então eu não primeiro dar uma senha para criptografar, ele retorna uma instância de NoOpPasswordEncoder pode ser.
  3. método configure, vamos abrir por inMemoryAuthentication definido no usuário memória, withUser é um nome de usuário, senha é a senha do usuário, funções são funções de usuário.
  4. Para configurar uma pluralidade de utilizadores, ligados por e.

Por que e conectado a ele?

Na ausência de Primavera Bota, estamos todos em uso SSM Spring Security, Spring Security desta vez são configurados em um arquivo XML, uma vez que é um arquivo XML, o rótulo começou a ter terminado ali, e agora é o equivalente simbólico de tags XML o terminador indica o fim da etiqueta atual, este é um contexto de tempo voltará método inMemoryAuthentication, e em seguida, abra uma nova configuração do usuário.

Após a configuração, iniciar o projeto novamente, a configuração de código Java irá substituir o arquivo XML de configuração, em seguida, ir visitar / Olá, interfaces, você encontrará apenas o nome do usuário Java de código / senha para o sucesso de acesso.

página 3. formulários personalizados de login

O formulário de login padrão um tanto feio (na verdade agora o formulário de login padrão muito melhor do que o anterior, mais feio antes).

Mas muitas vezes estamos ainda absolutamente a página de login um pouco feio, então podemos personalizar uma página de login.

Olhe para juntos.

3.1 definições do servidor

E, então, continuar a melhorar a classe SecurityConfig anterior, continuam a reescrevê-lo configure(WebSecurity web)e configure(HttpSecurity http)métodos, como segue:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/js/**", "/css/**","/images/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login.html")
            .permitAll()
            .and()
            .csrf().disable();
}
  1. web.ignoring () é usado para configurar o endereço URL ignorado, geralmente para arquivos estáticos, podemos fazer isso usando.
  2. Se usarmos XML para configurar Spring Security, dentro haverá uma grande gravadora <http>, o método de configuração HttpSecurity fornecidos corresponde à tag.
  3. authorizeRequests correspondem <intercept-url>.
  4. correspondem formLogin <formlogin>.
  5. e método para indicar o fim da etiqueta atual, contexto Voltar HttpSecurity, abra uma nova configuração round.
  6. permitAll representam páginas relacionadas login / interfaces de não ser interceptado.
  7. Finalmente, lembre-se de desligar csrf, de volta à minha pergunta sobre csrf especializada e todo mundo disse.

Quando definimos a página de login para o /login.html tempo, Spring Security nos ajudará a registrar automaticamente uma interface /login.html, esta interface é um pedido POST para lidar com a lógica login.

3.2 definições front-end

Canção Ge preparar uma página de login passável, como segue:

Vamos apresentar a página de login estática relevante copiados para os recursos do projeto Primavera Bota diretório / static:

Página inicial muito tempo, e eu venho aqui para o núcleo da lista (o código completo I enviados para GitHub: https://github.com/lenve/spring-security-samples ):

<form action="/login.html" method="post">
    <div class="input">
        <label for="name">用户名</label>
        <input type="text" name="username" id="name">
        <span class="spin"></span>
    </div>
    <div class="input">
        <label for="pass">密码</label>
        <input type="password" name="password" id="pass">
        <span class="spin"></span>
    </div>
    <div class="button login">
        <button type="submit">
            <span>登录</span>
            <i class="fa fa-check"></i>
        </button>
    </div>
</form>

forma forma, prestar atenção à ação /login.html, o outro é a operação normal, não vou repetir.

Bem, após a configuração estiver concluída, vá para reiniciar o projeto, visite qualquer página neste momento, será automaticamente redirecionado para a página de nós definimos isso, digite seu nome de usuário e senha pode se autenticar novamente.

4. Seção

Este artigo e nós simplesmente falar sobre entrada Spring Security, a configuração forma há muitos detalhes, vamos continuar para o próximo artigo.

Publicado 571 artigos originais · Louvor obteve 6801 · Visualizações 4,7 milhões +

Acho que você gosta

Origin blog.csdn.net/u012702547/article/details/105086617
Recomendado
Clasificación