登录鉴权

注册登录鉴权

1.1.用户注册

前台需要给我们传递用户名、密码、手机号、手机验证码。验证用户前台传过来的数据是否符合规范,我们使用的Hibernate Validator框架实现的服务端表单校验。短信验证码这块,我们采用的阿里的大于短信接口来做的,我们单独搭建了一个短信微服务,发送的短信请求通过MQ消息由短信微服务消费,进行短信发送。密码我们使用的是Spring提供的BCryptPasswordEncoder加密算法,分成加密和验证两个过程:

  • 加密:算法会对明文密码使用UUID随机生成一个salt,使用salt结合密码来加密,得到最终的密文。

  • 验证密码:需要先拿到加密后的密码和要验证的密码,根据已加密的密码来推测出salt,然后利用相同的算法和salt对要验证码的密码加密,与已加密的密码对比即可。

短信验证码的有效期为30分钟,为了验证短信验证码的时效性,我们保存到了redis中,手机号作为key,验证码作为value,设置有效期为30分钟。另外为了防止恶意攻击,我们限制一个手机号1分钟之内只能发送一次验证码,这个也是通过redis来实现的,手机号拼接"_yes"为key,验证码为value,设置有效期为1分钟。为了防止机器恶意调用验证码接口,我们这个地方使用图形验证码来进行限制。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R9Wh8WaR-1608619936313)(assets\6.png)]

1.2.用户登录

使用JWT+RSA加密技术实现了无状态登录。我们单独搭建了一个校验微服务来进行校验,验证用户名和密码的话需要通过feign组件来调用用户魏服务来进行查询,另外的话,我们使用JWT+RSA加密生成一个token返回给前台,写到cookie中。

(img-8LbV4Usa-1608619936317)(assets\1.png)]

1.3.校验登录

在页面created生命周期函数中就调用校验登录的接口。接口的主要逻辑为:

  • 去redis中验证token是否存在redis中,如果存在说明,此token失效了,返回401
  • 取cookie中的token信息,使用公钥进行解密操作,获取用户信息进行返回
  • 如果前两步正确无误,但是token的有效期小于15分钟则进行token的续签操作,即重新生成一个token,写入cookie中即可

(img-g6v3vwaX-1608619936318)(assets\2.png)]

1.4.登出操作

  • 把JWT存入黑名单,就是把token放入redis中,设置一个过期时间(token的有效剩余时间)
  • 删除客户端cookie

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RaSRvF8Z-1608619936320)(assets\3.png)]

1.5.网关登录控制

  • 1)获取用户的登录凭证jwt
  • 2)解析jwt,获取用户身份
    • 如果解析失败,证明没有登录,返回401
    • 如果解析成功,继续向下
  • 3)根据身份,查询用户权限信息
  • 4)获取当前请求资源(微服务接口路径)
  • 5)判断是否有访问资源的权限

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fc0zeBLC-1608619936322)(assets\4.png)]

2.JWT的3W1H

2.1.是什么(what)?

JWT,全称是Json Web Token,是JSON风格轻量级的授权和身份认证规范,可实现无状态、分布式的Web应用授权;JWT包含三部分数据:①Header头部:声明这是JWT以及选用的签名算法;②payLoad:载荷,就是有效数据,我们存放了jwt的id、用户信息、过期时间;③Signature:签名,是整个数据的认证信息。一般根据前两步的数据,再加上服务的的密钥(secret)(不要泄漏,最好周期性更换),通过加密算法生成。用于验证整个数据完整和可靠性。

2.2.为什么(why)?

我们使用的springCloud搭建的微服务架构,想使用JWT来做无状态登录,使用JWT+RSA加密算法来生成token,客户端保存token信息,服务器端不再保存用户登录状态。

2.3.在哪用(where)?

一般用于授权和身份认证。

2.4.怎么用(how)?

(img-FmYAqHNl-1608619936323)(assets\5.png)]

  • 引入maven的依赖
  • 创建一个JWT的工具类
    • 使用私钥加密token
    • 公钥解密token
    • 获取token中的User信息
    • 获取token中的载荷信息

3.RSA的3W1H

3.1.是什么?

1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字缩写:RSA。是一种非对称加密算法。

3.2.为什么?

加密技术是对信息进行编码和解码的技术,编码是把原来可读信息(又称明文)译成代码形式(又称密文),其逆过程就是解码(解密),加密技术的要点是加密算法。用RSA的目的就是对数据进行加密,防止信息泄露。

3.3.在哪用?

用于对不能明文传输或者明文保存的信息进行加解密。

3.4.怎么用?

基本原理:同时生成两把密钥:私钥和公钥,私钥隐秘保存,公钥可以下发给信任客户端

  • 私钥加密,持有私钥或公钥才可以解密
  • 公钥加密,持有私钥才可解密

4.cookie被禁用的解决方案

一.在URL后面手动拼接sessionid

经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。

二.使用响应对象HttpServletRequest中的encodeURL(String path)方法实现jsessionid的自动拼接

5.如何解决cookie被盗用问题?

答:cookie被盗用的可能性主要包括下面几种:

  • XSS攻击:这个可以再前端页面渲染时对 数据做安全处理即可,而且我们的cookie使用了Httponly为true,可以防止JS脚本的攻击。
  • CSRF攻击:
    • 我们严格遵循了Rest风格,CSRF只能发起Get请求,不会对服务端造成损失,可以有效防止CSRF攻击
    • 利用Referer头,防盗链
  • 抓包,获取用户cookie:我们采用了HTTPS协议通信,无法获取请求的任何数据
  • 请求重放攻击:对于普通用户的请求没有对请求重放做防御,而是对部分业务做好了幂等处理。运行管理系统中会对token添加随机码,认证token一次有效,来预防请求重放攻击。
    我们采用了HTTPS协议通信,无法获取请求的任何数据
  • 请求重放攻击:对于普通用户的请求没有对请求重放做防御,而是对部分业务做好了幂等处理。运行管理系统中会对token添加随机码,认证token一次有效,来预防请求重放攻击。
  • 用户电脑中毒:这个无法防范。控制自己
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Spring Boot中实现微信登录鉴权,可以使用Spring Security框架来实现。具体步骤如下: 1.引入相关依赖 ```xml <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>5.3.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>5.3.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-client</artifactId> <version>5.3.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-jose</artifactId> <version>5.3.4.RELEASE</version> </dependency> ``` 2.配置Spring Security ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CustomOAuth2UserService customOAuth2UserService; @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/error", "/webjars/**").permitAll() .anyRequest().authenticated() .and() .oauth2Login() .userInfoEndpoint() .userService(customOAuth2UserService); } } ``` 3.实现CustomOAuth2UserService ```java @Service public class CustomOAuth2UserService extends DefaultOAuth2UserService { @Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { // 获取用户信息 OAuth2User oAuth2User = super.loadUser(userRequest); // 获取用户的唯一标识 String openId = oAuth2User.getAttribute("openid"); // TODO 根据openId查询用户信息并返回 return oAuth2User; } } ``` 4.配置application.yml ```yaml spring: security: oauth2: client: registration: wechat: client-id: your-client-id client-secret: your-client-secret scope: snsapi_login redirect-uri: http://localhost:8080/login/oauth2/code/wechat client-name: WeChat provider: wechat: authorization-uri: https://open.weixin.qq.com/connect/qrconnect token-uri: https://api.weixin.qq.com/sns/oauth2/access_token user-info-uri: https://api.weixin.qq.com/sns/userinfo user-name-attribute: openid ``` 以上是在Spring Boot中实现微信登录鉴权的基本步骤,具体实现还需要根据实际情况进行调整。如果需要实现微信支付功能,可以参考微信支付接口说明进行开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值