0%

【工作技能】用户注册与登录

用户注册和登录工作中比较好的实现方法


1 注册

1.1 验证码生成

  • 通过redis过期时间设置验证码有效时间,且在验证码加上本地时间,用于60s防刷
  • 验证码校验也是redis中取数据进行判断即可
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @Autowired
    private StringRedisTemplate redisTemplate;

    public String smsCode(String phone) {
    String key = "sms:code:" + phone;
    String code_time = redisTemplate.opsForValue().get(key);
    // 60秒防刷校验
    if (null != code_time && System.currentTimeMillis()-Long.parseLong(code_time.split("_")[1]) < 60000) {
    return "请求过快,60s后才能重新发送验证码";
    }
    // 生产随机6位验证码
    String code = String.valueOf((int)((Math.random()*9+1)*Math.pow(10, 6-1)));
    // 将验证码_本地时间放入redis(验证码有效时间10分钟,60秒再重发验证码)
    redisTemplate.opsForValue().set(key, code+"_"+System.currentTimeMillis(), 10, TimeUnit.MINUTES);
    return code;
    }

1.2 密码加密

1
2
3
4
5
6
<!-- spring security -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>5.7.3</version>
</dependency>
1
2
3
4
5
6
7
@GetMapping("/encodePwd")
public void encodePwd(String password) {
// spring security工具类,自动进行盐值加密(无需额外盐值字段存入数据库)
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String encodePwd = encoder.encode("123456");
// 存入数据库...
}

2 登录

2.1 普通登录

  • 单纯的验证账号密码,适当可以引入安全框架(如:Shiro)
    1
    2
    3
    // 校验密码
    BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
    boolean matches = encoder.matches("#{原密码}", "#{加密密码}");

2.2 社交登录

  • OAuth:OAuth是一个开放标准,允许用户授权第三方网站访问他们的存储在另外的服务器提供者的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容
  • OAuth2.0:对于用户相关的OpenApi,为了保护用户的安全和隐私,第三方网站访问用户数据前都需要显示的向用户征求授权

2.3 单点登录

  • 单点登录:一处登录,处处登录。会从系统抽取出一个认证中心,其他系统的登录都会自动重定向到此认证中心,在认证中心登录。登录完后重定向回原来系统
  • 单点登录目前两种主流实现方式:基于Session基于Token

2.3.1 基于Session

2.3.2 基于Token