在不进行分布式的情况,在Springboot中配置SpringScurity很简单,只需要在创建spring boot项目时勾选SpringScurity依赖,或者在pom文件中添加依赖。
1、引入SpringScurity
或者在pom.xml文件中添加依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
只要加入依赖,项目的所有接口都会被自动保护起来。
2、测试是否成功
先新建一个HelloController
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
然后访问
运行spring boot项目后,直接在浏览器访问http://localhost:8080/hello (如果不是在本地,则将localhost改为服务器IP)
访问 /hello
,自动跳转到登录页,需要登录之后才能访问。
3、用户名配置
默认情况下,登录的用户名是 user
,密码则是项目启动时随机生成的字符串,可以从启动的控制台日志中看到默认密码
默认用户名:user
密码:如下图
这个随机生成的密码,每次启动时都会变。对登录的用户名/密码进行配置,有三种不同的方式:
- 在 application.properties 中进行配置
- 通过 Java 代码配置在内存中
- 通过 Java 从数据库中加载
3.1 配置文件配置用户名/密码
可以直接在 application.properties 文件中配置用户的基本信息:
spring.security.user.name=javaboy
spring.security.user.password=123
配置完成后,重启项目,就可以使用这里配置的用户名/密码登录了。
3.2 Java 配置用户名/密码
也可以在 Java 代码中配置用户名密码,首先需要我们创建一个 Spring Security 的配置类,集成自 WebSecurityConfigurerAdapter 类,如下:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//下面这两行配置表示在内存中配置了两个用户
auth.inMemoryAuthentication()
.withUser("javaboy").roles("admin").password("$2a$10$OR3VSksVAmCzc.7WeaRPR.t0wyCsIj24k0Bne8iKWV1o.V9wsP8Xe")
.and()
.withUser("lisi").roles("user").password("$2a$10$p1H8iWa8I4.CA.7Z8bwLjes91ZpY.rYREGHQEInNtAp4NzL6PLKxi");
}
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
这里我们在 configure 方法中配置了两个用户,用户的密码都是加密之后的字符串(明文是 123),从 Spring5 开始,强制要求密码要加密,如果非不想加密,可以使用一个过期的 PasswordEncoder 的实例 NoOpPasswordEncoder,但是不建议这么做,毕竟不安全。
Spring Security 中提供了 BCryptPasswordEncoder 密码编码工具,可以非常方便的实现密码的加密加盐,相同明文加密出来的结果总是不同,这样就不需要用户去额外保存盐
的字段了,这一点比 Shiro 要方便很多。