Spring Security 简介
Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。 它是用于保护基于 Spring 的应用程序的实际标准。
Spring Security 是一个框架,致力于为 Java 应用程序提供身份验证和授权。 像所有 Spring 项目一样,Spring Security 的真正强大之处在于可以轻松扩展以满足自定义要求。
特点
- 对身份验证和授权的全面且可扩展的支持
- 防御会话固定,点击劫持,跨站点请求伪造等攻击
- Servlet API 集成
- 与 Spring Web MVC 的可选集成
Spring Security 官网:
https://spring.io/projects/spring-security
https://github.com/spring-projects/spring-security
Spring Security 初体验
添加依赖:
<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>
写一个 Controller 类:
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "Hello Security!";
}
}
运行项目,访问http://localhost:8080/hello
,回车,如下图:
只要在项目中间加入了 Spring Security 依赖,所有的地址请求都受到访问控制。
在没有手动设置用户名和密码的时候,默认用户名为 user
,默认密码是一个随机字符串,被打印在控制台中:
输入默认用户名和默认密码,就能访问 /hello 接口了:
每次使用默认密码,十分麻烦。接下来就自定义用户名和密码。
Spring Security 手动设置用户名和密码
有两种方式来设置用户名和密码,一是在 application.properties 文件中配置,二是写一个 config 类,继承 WebSecurityConfigurerAdapter ,重写方法 configure(AuthenticationManagerBuilder auth) 来设置。
方法一:application.properties 文件中配置
配置如下:
spring.security.user.name=user
spring.security.user.password=123456
# 指定用户角色
spring.security.user.roles=admin
三行配置搞定。需要注意的是,需要给用户指定角色,在 Spring Security 中,是通过用户的角色进行访问权限控制的。
方法二:写一个 config 类
写一个 config 类,继承 WebSecurityConfigurerAdapter ,重写方法 configure(AuthenticationManagerBuilder auth) :
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 这是一个过期的方法
* 指明密码不用加密
*/
@Bean
PasswordEncoder passwordEncoder(){
return NoOpPasswordEncoder.getInstance();
}
/**
* 定义两个用户,并设置密码和角色
* 从 Spring5.0 开始,密码必须要加密
* 基于内存的用户认证
* @param auth
* @throws Exception
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin")
.password("123456")
.roles("admin")
.and()
.withUser("user1")
.password("123")
.roles("user");
}
}
上面,创建了两个用户:admin、user1,并分别赋予角色 admin 和 user 。
每天学习一点点,每天进步一点点。