回顾上一篇
在上一篇《[面试不要在说不熟悉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
- 配置文件中的默认用户和默认密码注释掉了
- 启动项目,访问接口测试,发现登录后是这样的
实际上是登录成功了的,可以通过再次输入接口访问验证成功
但是为什么登录成功后会跳转到这个页面呢?这个我们以后再说,今天就先说到这里!