SpringSecurity
一、概述
- 官网:https://spring.io/projects/spring-securitySpringSecurity官网
- SpringSecurity是Spring公司开发一个基于认证和授权的安全框架
- 认证:登录的过程
- 授权:在登录的过程中,授予相应的操作权限
- 一般权限管理都是RBAC的
- RBAC:基于角色的访问控制(Role-Based Access Control)
二、快速入门
1. 实现步骤
- 创建SpringBoot项目
- 导入依赖
- 控制器
- 启动项目
- 访问控制器
2. 具体实现
2.1 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.2 接口
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "Hello,Success!";
}
}
2.3 测试
-
访问接口
若被拦截,则跳回登录页
若登录成功,则跳转的之前访问的资源
用户名:user
密码:控制台随机生成
三、配置用户名、密码
1. SpringBoot配置文件
spring:
#指定用户名与密码
security:
user:
name: java2107
password: java2107
2. 配置类
2.1 基于内存【了解】
- 注释配置文件
- 引导类增加加密Bean
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
- 增加配置类
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
PasswordEncoder passwordEncoder;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
String newPwd = passwordEncoder.encode("java2107");
//基于内存配置用户名与密码
auth.inMemoryAuthentication()
.withUser("java2107")
//这个密码一定需要加密,需要指定加密器
.password(newPwd)
//指定角色,具体角色可以不指定
.roles("");
}
}
- 测试
2.2 自定义认证类
- 基于内存的配置要注释掉
- 实现接口UserDetailsService
@Service
public class MyUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if(null != username && "java2107".equals(username)) {
//比对密码,security框架会自动去比对密码
//参数一:数据库的用户名
//参数二:数据库的密码 $2a$10$mFcvAbMb7iMtuS0vuv/sXuSiKSeb/EVAM8xQekJ0PEWmo9M23UMfS --> java2107
//参数三:角色权限列表
Collection<? extends GrantedAuthority> authorities =
AuthorityUtils.commaSeparatedStringToAuthorityList("");
return new User(username,
"$2a$10$mFcvAbMb7iMtuS0vuv/sXuSiKSeb/EVAM8xQekJ0PEWmo9M23UMfS",
authorities);
}
//认证未通过
return null;
}
}
- 基于认证类的配置类
@Override