006-SpringSecurity身份认证方式(1):HttpBasic身份认证方式-用户名和密码自定义存储在内存中(SpringSecurity大型项目)

005 用户名和密码是SpringSecurity生成的,
006 用户名和密码自定义存储在内存中。
 
 
1.配置用户名和密码,存储在内存当中
 @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //auth.inMemoryAuthentication():用户信息存储在内存中
        //inMemoryAuthentication:内存验证
        auth.inMemoryAuthentication()
                //withUser:用户名
                .withUser("cis")
                //password:密码
                .password("123")
                //authorities:授权
                .authorities("ADMIN");
    }
 
006-SpringSecurity身份认证方式(1):HttpBasic身份认证方式-用户名和密码自定义存储在内存中(SpringSecurity大型项目)_第1张图片

 

2.重启项目发现报错,发现密码没有进行加密

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"

006-SpringSecurity身份认证方式(1):HttpBasic身份认证方式-用户名和密码自定义存储在内存中(SpringSecurity大型项目)_第2张图片

解决方案:对密码进行加密,编写一个加密器

在 SpringSecurityConfifig 指定 BCryptPasswordEncoder() 加密方式,
相同的密码, 在每次加密后的结果都不一样的,因为它每次都会随机生成盐值, 会将随机生成的盐加到密码串中.
每次判断时, 通过随机生成的盐反推回加密时的密码串, 最终判断是否匹配
 
 
加密的最终结果分为两部分,盐值 + MD5(password+ 盐值 ), 调用 matches(..) 方法的时候,
先从密文中得到 盐值,用该盐值加密明文和最终密文作对比,
这样可以避免有一个密码被破解 , 其他相同的密码的帐户都可以破解 .
因为通过当前机制相同密码生成的密文都 不一样。
 
加密过程(注册):  aaa ( 盐值 ) + 123( 密码明文 )  > 生成密文    > 最终结果 盐值 . 密文: aaa.asdlkf 存入数据库
校验过程(登录): aaa ( 盐值 , 数据库中得到 ) + 123( 用户输入密码 )> 生成密文 aaa.asdlkf ,与数据库对比一
致密码正确
 
 @Bean
    public PasswordEncoder passwordEncoder() {
        // 明文+随机盐值》加密存储
        //使用BCryptPasswordEncoder()进行加密
        //常用方法:
        //      encode:用于加密明文
        //      matches:前端输入的密码与数据库中的密码对比
        //      upgradeEncoding:是否需要重新编码,一般不需要
        return new BCryptPasswordEncoder();
    }

006-SpringSecurity身份认证方式(1):HttpBasic身份认证方式-用户名和密码自定义存储在内存中(SpringSecurity大型项目)_第3张图片

3.重启项目,即可

 

代码区:

package com.cis.security.config;

import lombok.extern.slf4j.Slf4j;
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.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;


//EnableWebSecurity启用Web安全,有二个作用,
//              1: 加载了WebSecurityConfiguration配置类, 配置安全认证策略。
//              2: 加载了AuthenticationConfiguration, 配置了认证信息。
@EnableWebSecurity
//类上添加注解 @Configuration 标识为配置类
@Configuration
//SpringSecurityConfig类安全控制配置类作为安全控制中心,用于实现身份认证与授权配置功能,需要继承WebSecurityConfigurerAdapter
//@EnableWebSecurity注解以及WebSecurityConfigurerAdapter一起配合提供基于web的security
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public PasswordEncoder passwordEncoder() {
        // 明文+随机盐值》加密存储
        //使用BCryptPasswordEncoder()进行加密
        //常用方法:
        //      encode:用于加密明文
        //      matches:前端输入的密码与数据库中的密码对比
        //      upgradeEncoding:是否需要重新编码,一般不需要
        return new BCryptPasswordEncoder();
    }


    //configure(AuthenticationManagerBuilder auth):身份认证管理器
    //      1.认证信息提供方式(用户名、密码、当前用户的资源权限)
    //      2.认证方式可采用内存存储方式,也可采用数据库方式等
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        //auth.inMemoryAuthentication():用户信息存储在内存中
        //inMemoryAuthentication:内存验证
        auth.inMemoryAuthentication()
                //withUser:用户名
                .withUser("cis")
                //password:密码
                .password(passwordEncoder().encode("123"))
                //authorities:授权,权限标识符
                .authorities("ADMIN");
    }

    //configure(HttpSecurity http):资源权限配置(过滤器链)
    //      1.拦截的哪一些资源,资源所对应的角色权限
    //      2.定义认证方式: httpBasic 、 httpForm
    //      3.定制登录页面、登录请求地址、错误处理方式
    //      4.自定义 spring security过滤器链
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.httpBasic() //采用httpBasic认证方式
                .and()
                //authorizeRequests:授权请求
                .authorizeRequests() // 认证请求
                //anyRequest:任何请求     authenticated:已验证
                .anyRequest().authenticated()// 所有进入应用的HTTP请求都要进行认证
                //spring security的配置 http.anyRequest().authenticated()
               //的理解是任何请求都必须经过身份验证,否则Spring应用程序将返回401响应  (类型=未授权,状态=401) .
        ;
    }
}
 

你可能感兴趣的:(006-SpringSecurity身份认证方式(1):HttpBasic身份认证方式-用户名和密码自定义存储在内存中(SpringSecurity大型项目))