循序渐进学习spring security 第二篇,如何修改默认用户?

回顾上一篇

在上一篇《[面试不要在说不熟悉spring security了,一个demo让你使劲忽悠面试官] (https://blog.csdn.net/huangxuanheng/article/details/119062001)》 中我们对spring security 有了一个初步的感受,接下来,我们来一起分析的用户配置

上一篇项目启动时,会自动的打印默认用户的密码出来,这个密码是临时的密码,而用户也是默认的user用户,但是实际项目中往往都是从数据库获取的用户,不过别着急,我们循序渐进的摸透spring security。

源码下载

如何配置用户?

那么问题来了,我对spring security 不熟悉,什么都不懂,要怎么入手?怎么去配置用户?别忘了,我们上一篇项目运行后,会自动打印出来默认用户的密码字眼
在这里插入图片描述
临时密码前一行是类:UserDetailsServiceAutoConfiguration,猜想,就是在这个类启动的时候打印出来的日志,或者也可以根据“Using generated security password” 去搜索整个项目跟进,果不其然,跟进去后发现了打印日志代码
在这里插入图片描述
于是在继续跟进User这个类,发现这个是一个配置类SecurityProperties
在这里插入图片描述

默认的用户就是user,默认的临时密码是用UUID生成的随机密码
默认的用户就定义在它里边,是一个静态内部类,我们如果要定义自己的用户名密码,必然是要去覆盖默认配置,我们先来看下 SecurityProperties 的定义,这就很清晰了,我们只需要以 spring.security.user 为前缀,去定义用户名密码即可

在 properties 中定义的用户名密码最终是通过 set 方法注入到属性中去的,这里我们顺便来看下 SecurityProperties.User#setPassword 方法:
在这里插入图片描述
从这里我们可以看到,application.properties 中定义的密码在注入进来之后,还顺便设置了 passwordGenerated 属性为 false,这个属性设置为 false 之后,控制台就不会打印默认的密码了。

此时重启项目,就可以使用自己定义的用户名/密码登录了。

知道了这一配置,接下来我们来撸代码看效果

新建项目

  • 新建一个spring boot工程,名字叫做security-userconfig,选择依赖spring security 和spring web
    添加maven依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

在这里插入图片描述

  • 新建HelloController类
@RestController
public class HelloController {
    
    

    @RequestMapping("/sayHello")
    public String sayHello(){
    
    
        return "十年生死两茫茫,不思量,自难忘----苏轼,hello";
    }
}

  • 添加默认用户和密码的配置项,我习惯将配置文件拓展名改为yml的格式,完成后如下
spring:
  security:
    user:
      name: harry
      password: 123456


测试

  • 启动项目,发现默认打印出来的临时密码不再打印,这和上述分析的一致
    在这里插入图片描述

  • 访问接口:http://127.0.0.1:8080/sayHello ,会自动调整到登录页面,输入配置中的用户名:harry,密码:123456,点击登录,登录成功!说明我们通过配置文件配置的默认用户和密码是正确的

代码中配置用户

上面我们介绍了通过配置文件配置默认用户和默认密码的方式,但是实际开发过程中,我们的用户都是从代码中读取的,接下来我们通过代码来配置用户

  • 新建一个类SecurityConfig ,继承WebSecurityConfigurerAdapter ,实现对应的配置
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    
    @Bean
    PasswordEncoder passwordEncoder() {
    
    
        return NoOpPasswordEncoder.getInstance();
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    
    
        auth.inMemoryAuthentication()
                .withUser("harry")
                .password("123456").roles("user");
    }
}

说明:

  • PasswordEncoder 是密码加密接口,因为我们是循序渐进的,我这里先用无加密实例
  • 实现configure(AuthenticationManagerBuilder auth)配置方法,为了图方便,我先在内存中创建默认用户harry,默认密码是123456,角色是user
  • 配置文件中的默认用户和默认密码注释掉了
  • 启动项目,访问接口测试,发现登录后是这样的
    在这里插入图片描述
    实际上是登录成功了的,可以通过再次输入接口访问验证成功

但是为什么登录成功后会跳转到这个页面呢?这个我们以后再说,今天就先说到这里!

源码下载

猜你喜欢

转载自blog.csdn.net/huangxuanheng/article/details/119064244