[项目问题]使用Redis缓存
SpringSecurity对登陆用户进行权限划分
- Security启动.userDetailsService(service)来使用数据库。
- 根据用户名从数据库中获取密码(使用Mybatis)
- 密码正确就返回一个UserDeatil,里面包含用户名、密码、角色。
- 在登陆验证过程中,通过Handler实现自定义的跳转。只有对应权限的用户才能访问对应的界面。
Redis实现记住我功能
- SpringSecurity开启remenberMe(),
- 设置一个Token的有效期
写一个自定义的tokeRepository实现redis持久化token。
实现了PersistenTokenReposity的类
- createNewToken:创建新的token,
- 如果勾选了记住我选项,则会生成一个系的Token,并将Token持久化到Redis中。
- 首先清除用户之前的token信息。
- 存入,(key, token, 有效期)
- updateToken:每次新的会话都会更新Token。
- 当用户再次访问时,更新Token的最后使用时间和值。
- getTokeForSeries:通过Series获取Token对象。
- 当用户再次访问时,如果存在Token,则会从Redis中检索Token对像。
- removeToken:更新Token
- 当用户注销或Token过期时,调用该方法删除指定用户的所有Token。
- createNewToken:创建新的token,
邮件发送
SpringBoot已经给我们提供了封装好的邮件模块使用。注入依赖即可。
在.yml文件配置:
1
2
3
4
5
6
7
8spring:
mail:
# 163邮箱的地址为smtp.163.com,直接填写即可
host: smtp.163.com
# 你申请的163邮箱
username: 1070362388@163.com
# 注意密码是在开启smtp/pop3时自动生成的,记得保存一下,不然就找不到了
password: WCKBLIQKEDBTHHYM用户在注册过程中点击获取验证码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class VerifyServiceImpl implements VerifyService {
//JavaMailSender是专门用于发送邮件的对象,自动配置类已经提供了Bean
JavaMailSender sender;
//Redis的模版类
StringRedisTemplate template;
String from;
public void sendVerifyCode(String mail) {
//SimpleMailMessage是一个比较简易的邮件封装,支持设置一些比较简单内容
SimpleMailMessage message = new SimpleMailMessage();
message.setSubject("【测试】你的网站注册验证码");
//生成随机验证码
Random random = new Random();
int code = random.nextInt(899999) + 100000;
//设置键值存入,并设定存在时间为3分钟
template.opsForValue().set("verity:code" + mail, code+"", 3, TimeUnit.MINUTES);
//邮件内容格式
message.setText("您的验证码为:" + code + ",三分钟内有效,请及时完成注册!");
//设置邮件发送给谁,可以多个,这里就发给你的QQ邮箱
message.setTo(mail);
//邮件发送者,这里要与配置文件中的保持一致
message.setFrom(from);
//OK,万事俱备只欠发送
sender.send(message);
}
public boolean doVerify(String mail, String code) {
//从Redis中取值
String verify = template.opsForValue().get("verity:code" + mail);
//如果不存在或者错误返回错误
if(verify == null) return false;
if(!verify.equals(code)) return false;
//正确返回并删除此认证码
template.delete("verity:code" + mail);
return true;
}
}
Mybatis完成分页查询
- 接收前端发送的一个list,里面包含用户名,电话号码,当前页数,页面大小等参数
- 如果用户名,电话号码为空,则查询全部,否则按条件查询。
1