SSO单点登陆问题

首先是我要到授权中心,是授权中心给我颁发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.配置局部过滤器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值