首先是我要到授权中心,是授权中心给我颁发token,然后我前端有这个token,访问其他微服务只要tokn可以被解析,就表明用户登陆没有问题。但是每次都解析太过于麻烦,代码冗余,所以可以用gateway来弄一个局部过滤器,在网关这一步被解析,不成功就返回登陆页面,成功了就放行。
登录时:
第一次登陆 时 携带用户名和密码 拿到用户名去数据库校验 (包括密码匹配)
如果返回实体类 说明数据库有这个用户
为空就用户名或者密码不正确
然后我要给这个正确的用户生成token(jwt令牌)
把返回的id和name还有ip地址(防止被盗号)填到载荷信息里去,再加密生成token 放入cookie。
安全! 不过这是无状态 我们也不能强制用户下线 但是前端可以把cookvalue滞空
怎么防止盗用:加入登录时的ip地址
怎么防止伪造toekn:ras加密,私钥不泄露就不会被伪造
登陆分为有状态登陆 和无状态登陆
有状态登陆:
为了保证客户端cookie的安全性,服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。
例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。
缺点是什么?
-
服务端保存大量数据,增加服务端压力
-
服务端保存用户状态,无法进行水平扩展
-
客户端请求依赖服务端,多次请求必须访问同一台服务器
即使使用redis保存用户的信息,也会损耗服务器资源。
无状态登陆:微服务集群中的每个服务,对外提供的都是Rest风格的接口。而Rest风格的一个最重要的规范就是:服务的无状态性,即:
-
服务端不保存任何客户端请求者信息
-
客户端的每次请求必须具备自描述信息,通过这些信息识别客户端身份
带来的好处是什么呢?
-
客户端请求不依赖服务端的信息,任何多次请求不需要必须访问到同一台服务
-
服务端的集群和状态对客户端透明
-
服务端可以任意的迁移和伸缩
-
减小服务端存储压力
token的安全性
token是识别客户端身份的唯一标示,只需要能够被成功解析,就说明是真的,如果加密不够严密,被人伪造那就完蛋了。
采用何种方式加密才是安全可靠的呢?
JWT json web token
我们将采用JWT + RSA非对称加密
网关过滤器:
全局过滤器:无差别拦截所有经过网关的请求
局部过滤器:拦截特定路由对应的服务请求
全局过滤器:实现GlobalFilter 无差别拦截所有请求
局部过滤器: 也可以实现gateWayFliterFactory(接口)最好继承 abstractGatewayFilterFactory(抽象类)
实现抽象类需要定义一个泛型 这个泛型在类的类部 定义一个静态内部类 并且定义拦截字段的类型 可以是单个string 也可以是list集合等等 然后需要实现 apply方法 (核心方法) 然后要重写父类的无参构造方法。super(定义的类型),然后重写shortcuttype,表明接受参数的字段类型,还有shortcutFilterOrder表明接受拦截参数的顺序。
具体步骤:
1.编写实现类XxxGatewayFilterFactory继承AbstractGatewayFilterFactory抽象类
2.定义实体类KeyValueConfig,并定义接受参数的字段
3.可选:如果要接受的参数是不定数量的,在实体类中定义集合字段
4.过滤器工厂继承AbstractGatewayFilterFactory抽象类时,指定泛型(之前定义的实体类类型)
5.重写父类的无参构造方法,调用super(Step2中定义的实体类.class)
6.重写父类的shortcutFieldOrder()方法指定接受参数的字段顺序
7.可选:如果接受的参数是不定数量的,重写shortcutType方法,返回ShortcutType.GATHER_LIST
8.配置局部过滤器