本文通过配置文件以及注解配置用户名、密码
一、我们可以在 application.properties 中配置默认的用户名密码
1、怎么配置呢?SecurityProperties类,默认的用户就定义在它里边,是一个静态内部类,我们如果要定义自己的用户名密码,必然是要去覆盖默认配置,我们先来看下 SecurityProperties 的定义:
@ConfigurationProperties(prefix = "spring.security") publicclass SecurityProperties {
2、这就很清晰了,我们只需要以 spring.security.user 为前缀,去定义用户名密码即可:
spring.security.user.name=javaboy spring.security.user.password=123
这就是我们新定义的用户名密码。
-------------------------------------------------------------------------------------------
配置类中配置默认的用户名密码
除了上面的配置文件这种方式之外,我们也可以在配置类中配置用户名/密码。
在配置类中配置,我们就要指定 PasswordEncoder 了,这是一个非常关键的东西。
介绍一下 PasswordEncoder 到底是干嘛用的
PasswordEncoder 这个接口中就定义了三个方法:
publicinterface PasswordEncoder { String encode(CharSequence rawPassword); boolean matches(CharSequence rawPassword, String encodedPassword); default boolean upgradeEncoding(String encodedPassword) { returnfalse; } }
encode 方法用来对明文密码进行加密,返回加密之后的密文。
matches 方法是一个密码校对方法,在用户登录的时候,将用户传来的明文密码和数据库中保存的密文密码作为参数,传入到这个方法中去,根据返回的 Boolean 值判断用户密码是否输入正确。
upgradeEncoding 是否还要进行再次加密,这个一般来说就不用了。
1、创建SecurityConfig配置类
@Configuration publicclass 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"); } }
首先我们自定义 SecurityConfig 继承自 WebSecurityConfigurerAdapter,重写里边的 configure 方法。
首先我们提供了一个 PasswordEncoder 的实例,因为目前的案例还比较简单,因此我暂时先不给密码进行加密,所以返回 NoOpPasswordEncoder 的实例即可。
configure 方法中,我们通过 inMemoryAuthentication 来开启在内存中定义用户,withUser 中是用户名,password 中则是用户密码,roles 中是用户角色。
如果需要配置多个用户,用 and 相连。
为什么用 and 相连呢?
在没有 Spring Boot 的时候,我们都是 SSM 中使用 Spring Security,这种时候都是在 XML 文件中配置 Spring Security,
既然是 XML 文件,标签就有开始有结束,现在的 and 符号相当于就是 XML 标签的结束符,表示结束当前标签,
这是个时候上下文会回到 inMemoryAuthentication 方法中,然后开启新用户的配置。
配置完成后,再次启动项目,Java 代码中的配置会覆盖掉 XML 文件中的配置,此时再去访问 /hello 接口,就会发现只有 Java 代码中的用户名/密码才能访问成功。