掌握独立开发功能模块的流程
- 分析需求
- 设计实现方案
- 编码实现
- 测试调试
- 反馈优化
1,为什么需要单点登录系统?
2,单点系统关注哪些方面?
- 提供登录页面
- 提供账号信息认证
- 验证账号的登录状态
- 注销账号
3,BCrypt密码安全加密
3.1 特点简介
Spring Security提供了BCryptPasswordEncoder类,实现Spring的PasswordEncoder接口使用BCrypt强哈希方法来加密密码。
BCrypt可以做到相同的密码,但每次加密的结果不一样,这样即使被“脱库”,也可以保证不会被一次性破解所有相同密码的用户信息
3.2 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
3.3 添加配置类
当我们添加SpringSecurity依赖后,所有的地址都会被SpringSecurity控制,但此处我们只需要用到加密功能,所以添加一个配置类,开放所有的地址都可以匿名访问。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/**").permitAll()
.anyRequest().authenticated()
.and().csrf().disable();
}
}
3.4 声明加密工具类
@Bean
public BCryptPasswordEncoder bcryptPasswordEncoder(){
return new BCryptPasswordEncoder();
}
3.5 通过该工具类实现加密和验证密码正伪
//此方法用来进行加密
String encode = encoder.encode(tUser.getPasswd());
//此方法用来判断密码是否一致,参数一:输入的密码,参数二:数据库保存的密码
if(encoder.matches(user.getPasswd(),tUser.getPasswd())){
return tUser;
}
4,单点登录实现方案一
灵感来自传统的用户认证过程,基于Session+Cookie的机制演变过来。
此种方案,称为有状态性的方案,服务端需要保存凭证信息。
关键点:
- 保存凭证
//登录成功,保存凭证 redis+cookie来实现
//cookie: key:user_cookie value:UUID
//redis: key:user:token:UUID value:对象
//生成uuid
String uuid = UUID.randomUUID().toString();
//保存至cookie
Cookie cookie = new Cookie(UserUtil.USER_COOKIE,uuid);
//考虑安全性,表示cookie只能通过后端来获取,不能通过前端的脚本来获取
cookie.setPath("/");
cookie.setHttpOnly(true);
response.addCookie(cookie);
//存对象到redis
//拼接完整的key
StringBuilder builder= new <