Spring cloud微服务安全实战-3-11API安全机制之登录

流控、认证、审计、授权以上都做了初步的简单的实现。

之前写的代码,base64加密了用户名和密码。
缺点1:每次请求都要带用户名密码 增加了泄露的风险。

每次传上来用户名和密码都要check验证。check是个非常耗资源的事

基于token的身份认证

token是有实效的

对于java开发,最常见的实现

代码实现来验证请求的流程
userController内增加login登陆的方法。

@GetMapping("/login")
public void login(@Validated UserInfo user,HttpServletRequest request){
UserInfo info = userService.login(user);
request.getSession().setAttribute("user",user);
}
userService内增加login方法

UserInfo login(UserInfo user);
实现类实现login的方法

@Override
public UserInfo login(UserInfo info) {
UserInfo result=null;
User user=userRepository.findByUsername(info.getUsername());
if(user!=null && SCryptUtil.check(info.getPassword(),user.getPassword())){
result=user.buildInfo();
}
return result;
}
因为之前做的授权的拦截器,把所有的请求都给拦截了。修改登陆时候我们不需要拦截,
定义一个数组,把不需要拦截的url放在数组内。

请求的路径如果不在我们的数组内就执行原来访问控制的逻辑。

如果是登陆的路径的话,不判断Attribute是否存在user了,也不判断请求的方法是否有权限了。直接返回true

private String[] permitUrls=new String[] {"/users/login"};
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println();
boolean result=true;
if(!ArrayUtils.contains(permitUrls,request.getRequestURI())){
User user=(User)request.getAttribute("user");
if (user==null){
response.setContentType("text/plain");
response.getWriter().write("need authentication");
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false;
}else{
String method = request.getMethod();
if(!user.hasPermission(method)){
response.setContentType("text/plain");
response.getWriter().write("forbidden");
response.setStatus(HttpStatus.FORBIDDEN.value());
return false;
}
}
}
return result;
}
启动服务进行测试
先调用获取用户信息的服务,返回了401,没有带身份认证信息。
http://localhost:8080/users/13

下面来调用一下login的方法,传入用户名和密码

这个方法返回了200.里面的Reponse Headers里面。Set-Cookies里面写的JSESSIONID

类似于下面这种:
在chrome的设置里面





这就是我们存起来的 服务器返回的token

session有了信息了 再去访问

我们可以看发出去的请求里面 Cookie里面有JSessionID,刚才浏览器里面存的JSessionID就从这里发出去了。

也就是这里的第四部,第五步

以上就是session的原理。你要明白的是,基于cookie、session的本质上仍然还是基于token的认证方式。只不过他的这种认证方式是servlet规范里面已经都实现好了的。有优点也有缺点,客户端只存一个串,真的信息是存在服务器端的,另外一个优点就是使用起来很方便,因为所有的东西servlet容器都替你实现好了,你啥都不用管了,代码里只需要getSession()然后往里面放东西就可以了。验证的时候只需要从里面拿,然后验证就可以了。使用起来非常的方便
缺点:只针对浏览器起作用,因为我返回的Repoonse Header,浏览器收到这个Repoonse Header然后自个去设置cookie这件事只有浏览器支持。如果你是一个客户或者app 甚至一个第三方的应用,你是走不了这个机制的。 当服务器向浏览器传输cookie的时候,很容易被劫持。并不是绝对安全的。在大型的项目中,我们的servlet容器。服务器往往不是一台,如果一个用户的信息落在第一台服务,那么后面请求在访问的是第二台服务器。那么后面的就访问不到这个用户信息了。然后又要重新登陆。Spring 有一个Spring Session外部的存储来当你的Token Store来存session信息。以前没有Spring Session 要做这个事情还是挺麻烦的,要在好多个tomcat之间同步session信息,然后保持他们的一致性,
所以出现了另外一种自己实现来基于token 的登陆

基于cookie和sesison常见的风险。也就是一些攻击方式,以及怎么去防护这些攻击
结束
Spring cloud微服务安全实战-3-11API安全机制之登录的更多相关文章
- Spring cloud微服务安全实战-3-4 API安全机制之认证(1)
本节开始讲认证相关的东西.注意事项,出现问题的对应的解决方案. 先写用户注册的服务,注册一些用户信息进去.注册也是我们安全体系的一部分 注册 UserController里面的create方法 先修改 ...
- Spring cloud微服务安全实战-3-3 API安全机制之流控
首先要保证你的服务是可用的,其中一个重要的手段就是流控.就是流量控制.比如我的系统每秒只能处理500个请求,那么多余的请求就拒绝掉.这样我的系统不会被压死 实际的开发中,所要面对的流控场景实际是非常复 ...
- Spring cloud微服务安全实战-3-5 API安全机制之认证(2)
基于Http协议的认证方式有很多.本节我们只讲一个最简单的HttpBasic认证.聪明就可以看出来,这是一个最基础的认证,好处是简单方便,所有的主流浏览器都支持,问题就是并不是非常安全的,但是帮我们大 ...
- Spring cloud微服务安全实战_汇总
Spring cloud微服务安全实战 https://coding.imooc.com/class/chapter/379.html#Anchor Spring Cloud微服务安全实战-1-1 课 ...
- 《Spring Cloud微服务 入门 实战与进阶》
很少在周末发文,还是由于昨晚刚收到实体书,还是耐不住性子马上发文了. 一年前,耗时半年多的时间,写出了我的第一本书<Spring Cloud微服务-全栈技术与案例解析>. 时至今日,一年的 ...
- Spring Cloud微服务安全实战_00_前言
一.前言: 一直以来对服务安全都很感兴趣,所以就学习.这是学习immoc的 jojo老师的 <Spring Cloud微服务安全实战课程>的笔记,讲的很好. 课程简介: 二.最终形成的架 ...
- Spring Cloud微服务安全实战_4-5_搭建OAuth2资源服务器
上一篇搭建了一个OAuth2认证服务器,可以生成token,这篇来改造下之前的订单微服务,使其能够认这个token令牌. 本篇针对订单服务要做三件事: 1,要让他知道自己是资源服务器,他知道这件事后, ...
- Spring Cloud微服务安全实战_4-3_订单微服务&价格微服务
实现一个场景: 订单微服务: POM: <?xml version="1.0" encoding="UTF-8"?> <project xml ...
- Spring cloud微服务安全实战 最新完整教程
课程资料获取链接:点击这里 采用流行的微服务架构开发,应用程序访问安全将会面临更多更复杂的挑战,尤其是开发者最关心的三大问题:认证授权.可用性.可视化.本课程从简单的API安全入手,过渡到复杂的微服务 ...
- Spring cloud微服务安全实战-6-8sentinel限流实战
阿里2018年开源的. 简单来说就是干三件事,最终的结果就是保证你的服务可用,不会崩掉.保证服务高可用. 流控 先从最简单的场景来入手. 1.引用一个依赖, 2,声明一个资源. 3.声明一个规则 注意 ...
随机推荐
- 《少年先疯队》第九次团队作业:Beta冲刺第二天
2.1 今日完成任务情况 姚玉婷:房间管理功能测试文档的编写 马丽莎:酒店系统中商品管理功能的完善 张 琼:商品管理功能的测试 孙苗坤:商品管理功能的测试 2.2 明天任务安排 姚玉婷:酒店系统中 ...
- 浅谈JS高阶函数
引入 我们都知道函数是被设计为执行特定任务的代码块,会在某代码调用它时被执行,获得返回值或者实现其他功能.函数有函数名和参数,而函数参数是当调用函数接收的真实的值. 今天要说的高阶函数的英文为High ...
- 第4课.vi编辑器
1.vi编辑器的配置 cd /etc/vim cp vimrc ~/.vimrc cd ~ gedit .vimrc 在.vimrc中加入如下内容: "关闭兼容功能 set nocompat ...
- Windows系统错误处理机制
一.什么是错误 意为意为不正确,与正确答案相反.我们这里讲的是Windows操作系统里进程运行时产生的错误.对我们程序员来说,其实也就是我们编程过程中,调用Windows系统提供的API.COM 接口 ...
- Codevs 3002 石子归并 3(DP四边形不等式优化)
3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...
- Pytorch在colab和kaggle中使用TensorBoard/TensorboardX可视化
在colab和kaggle内核的Jupyter notebook中如何可视化深度学习模型的参数对于我们分析模型具有很大的意义,相比tensorflow, pytorch缺乏一些的可视化生态包,但是幸好 ...
- 利用HTML和CSS设计一个静态的“小米商城官网首页”
一.小项目说明 这是个例行的小项目练习,主要利用html和css的基础知识,复刻一个缩减版的小米商城网页.包括[导航栏].[头部logo区,快捷键.搜索框].[网页主体].[网页尾部]几个部分.目前只 ...
- segfault at 0 ip sp error 14
error 14从未见过.谁能帮我解答什么情况才会出现这个,而且怎么定位崩溃函数地址? 备忘: segfault at 引起故障的地址ip 指令的内存地址sp 堆栈指针地址, 及栈顶指针err is ...
- npm 更新包
方法一手动跟新: 手动修改package.json中依赖包版本,执行npm install --force,强制从远程下载所有包更新本地包 方法二使用第三方插件: npm install -g npm ...
- Python逆向(四)—— Python内置模块dis.py源码详解
一.前言 上一节我们对Python编译及反汇编做了讲解,大家知道dis模块可以将编译好的pyc文件中提取出来的PyCodeObject反汇编为可以阅读字节码形式.本节我们对dis模块中的源码进行详细的 ...