登录功能
katcha 谷歌验证码
传入用户的UUID为这个用户生成带有过期时间的验证码图片,
将用户UUID和验证码绑定, 检验阶段通过用户的UUID和输入验证码检验是否匹配
根据用户名获取用户信息
验证用户登录信息
用户名不存在返回
获取用户对应的盐, 和用户此次输入密码通过Sha256算法加密得到值和用户实际密码是否相等
验证完登录信息, 会用户生成Token
UserId
一个UUID随机数
当前时间
过期时间
将新生成的Token保存到数据库
token认证机制<br>token与session的不同主要在<br>①认证成功后,会对当前用户数据进行加密,生成一个加密字符串token,返还给客户端(服务器端并不进行保存)<br>②浏览器会将接收到的token值存储在Local Storage中,(通过js代码写入Local Storage,通过js获取,并不会像cookie一样自动携带)<br>③再次访问时服务器端对token值的处理:服务器对浏览器传来的token值进行解密,解密完成后进行用户数据的查询,如果查询成功,则通过认证,实现状态保持,所以,即时有了多台服务器,服务器也只是做了token的解密和用户数据的查询,它不需要在服务端去保留用户的认证信息或者会话信息,这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利,解决了session扩展性的弊端。<br>原文链接:https://blog.csdn.net/mydistance/article/details/84545768
解决跨域问题
问题描述
前端页面在8001端口登录需要访问88端口的登录, 同源策略禁止<br>
什么是跨域<br>
浏览器对于协议, 域名, 端口 任意一个不同的地址不允许请求
跨域的流程是发送了两个请求, 第一个为OPTIONS预检请求, 去访问服务器, 询问是否允许跨域请求, 如果服务器响应允许, 则发送真实的请求
解决方法(采用方法2)
- 方法1:设置nginx包含admin和gateway。都先请求nginx,这样端口就统一了<br>- 方法2:让服务器告诉预检请求能跨域
配置当次请求允许跨域
添加响应头, 对于预检Option请求, 表示允许
Access-Control-Allow-Origin : 支持哪些来源的请求跨域<br>Access-Control-Allow-Method : 支持那些方法跨域<br>Access-Control-Allow-Credentials :跨域请求默认不包含cookie,设置为true可以包含cookie<br>Access-Control-Expose-Headers : 跨域请求暴露的字段
网关模块添加配置类, 注册CorsWebFilter到Spring中
获取基于url跨域配置源类 UrlBasedCorsConfigurationSource source
生成Cors跨域配置信息类 CorsConfiguration corsConfiguration
//1.配置跨域<br> //允许所有的请求头类型跨域<br> corsConfiguration.addAllowedHeader("*");<br> //允许任意请求方式跨域<br> corsConfiguration.addAllowedMethod("*");<br> //允许任意请求来源跨域<br> corsConfiguration.addAllowedOrigin("*");<br> //允许携带cookies跨域<br> corsConfiguration.setAllowCredentials(true);<br> //任意路径允许跨域<br> source.registerCorsConfiguration("/**", corsConfiguration);
对任意路径拦截后设置允许跨域就不存在跨域问题了
XSS Cross Site Script(跨站脚本)
攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作
CSRF(跨站请求伪造)
1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;<br>2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;<br>3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;<br>4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;<br>5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
设置黑客无法伪造的信息, 请求参数加rtoken 或者HTTP头中自定义属性验证
实现微服务间的RPC调用
会员服务会请求优惠券服务, 获取会员的优惠券信息
调用流程
member模块添加feign包<br>
feign包中编写接口, 告诉SpringCloud这个接口需要调用远程服务
接口添加注解@FeignClient("需要调用的模块在注册中心的名称")
被调用服务有多个方法, 要调用哪个方法就把方法完整的写在这里
调用方法上加@RequestMapping("被调用方法的完整URL")
主启动类添加主机@EnableFeignClients("feign包的全路径, 表示这个包下的接口都是远程调用的")