粉丝999获赞3325
这期我们来分享弱医的 spring security 配置。打开 framework 模块 configure 目录下的 security configure 文件,找到 configure 方法。方法注息里列举了各种参数及说明,从说明我们可以理解相关参数的用法。若一框架已帮我们做好了大部分的配置, 基本上能满足我们的项目需求了。如果我们增加了一个可以允许匿名访问的 logan byphone 接口,只需添加这样一行代码 ant maxis logan byphone permit al 即可。
spring boot 如何解决跨域问题?跨域指的是浏览器在执行网页中的 drove a script 代码时,由于浏览器同源策略的限制,只能访问同源协议域名端口号均相同的资源, 而不能访问其他原协议域名端口号任意一个不同的资源。而解决跨域问题的方法就是在不破坏同源策略的情况下,能够安全地实现数据共享和交互。常见的解决跨域问题的方法有两种,一种是 j c n p, 另一种是 q s。 其中 q s 是一种在服务器后端解决跨域的方案,它的工作原理很简单,如果一个网站需要访问另一个网站的资源,浏览器会先发送一个 options 请求,根据服务器返回的 excess gun control gun are low gun origin 投信息决定是否允许跨域访问。所以我们只需要在服务器端配置 excess gun control gun are low gun origin 属性,并配置允许哪些域名支持跨域请求即可。在 spring boot 中 提供了两种配置, xs 刚 control 刚 rl 刚 origin 属性的方式来解决跨域问题,一通国卫特 cross origin origins 等于 h t t p local host 八零八零注解指定允许哪些 origins 允许跨域。二使用 wepam vc configure r 接口 重写 at core s map ins 方法来配置允许跨域的请求援。
好,同学们,接下来我们来聊角色和权限这样的概念, 首先啊这样的概念呢,绝对会啊,让你有点晕炫,哈哈。呃,因为他有一些绕,但是呢我们把它带入到实际的实际的场景里面啊,呃,大家就应该好理解一些,我们来到 啊,我们用画图的方式啊来讲解,我们来到一个系统里面,那这个系统呢?是呃图书管理系统, 而这个系统呢我们做一个简单的事情啊,就是说,呃对于学生来讲啊,学生,我们在图书馆里面,我们是不是要去呃查询某一本书,对吧?啊?学生,然后呢他的诉求是 查询某一本书,学生,他的诉求查一本书啊,我相信,呃在座的各位呢应该都有这样的场景啊,我要去图书馆借本书,那这个时候我要 呃到我不知道这个书在哪一个呃书架上,所以呢我要在系统里面去查这本书,对吧? 当你去输入一些呃书的名字啊,或者其他的作者啊,其他的一些信息啊,那么就这个时候呢,你就能够看到啊这本书的这个具体的信息。然后呢关键是这个书的信息后面呢 会有一些按钮,对吧?啊?会有些按钮啊,对于站在你的角度啊,这个按钮就是详情 啊,站在你的角度这个按钮就是详情,对不对啊?然后呢如果说啊换一个身份进来,换一个身份进来啊,换一个身份进来,比如说这个身份呢?是呃管理员,图书管理员啊,图书馆的管理员, 然后呢他也去查这本书啊,那么在他的场景里面呢,那我们加一条分割线啊,我们就用啊,这个 好,就这样吧。 ok, 那在他的场景里面呢,他就不只是详情了,他还能够什么?他还能够去做件事情,就是下架啊,上架啊,或者删除等等。那我们就写一个啊,他 还能做一个下架的事情。很显然你们两个用户进来发生的这个页面的可操作的功能是不一样的,或者说你们的权限是不一样的,因为什么?因为你们两个属于不同的身份, 所以呢?这样的话呢,我们就呃理出了两个概念,一个概念叫什么?一个概念叫权限啊,权限其实是最基础的概念啊,你有没有权限?你有没有权限进到图书馆啊?这个词大家应该经常听到,对吧? 呃,宿舍管理员啊,来到你的房间,把你的这个,比如说你做了一个电磁炉啊,你买了个电磁炉,那他就有权限把你的电磁炉没收走啊,因为,呃使用大功率电器啊,宿舍是不允许的。但是 如果说你的呃另外一个隔壁寝室的啊,这样一个同学你都不认识他,那他过来呢?他是没有权限把你的电磁炉没收走的,对不对啊?所以权限这个词大家应该很好理解,就是说你在操作呃某一个事情的时候有没有相应的权利啊?相应的权利? 那什么是角色呢?对不对啊?什么是角色呢? 角色呢?其实也好理解我们这么说啊,呃,一个角色包含了多个权限,打个比方 管理员他不仅具备着呃下架这个权限,那下架图设权限他还有什么呢?他还有 上架啊,这样的权限,那他还有什么呢?他还有着这个删除图书的权限,对不对那?呃对于学生来讲呢啊,他只能够 啊,查看详情和借阅啊,借阅好,对于学生来讲呢,他只有这两个权限, 对吧?那这个时候呢,我们说,嗯,有这么一个单位啊,就是角色这个单位,他的内部包含了多个权限。那对于学生这个角色, 学生他是一个角色啊,他内部包含着详情和借阅 两种权限。那对于管理员这种角色啊,他内部包含了啊,详情,下架,上架,删除,上架, 删除这四种权限。所以说从这两个词啊,大家应该很好理解啊,就是角色和权限到底是什么意思?如果说你在这个地方还是有一点晕,没有关系啊,那接下来我们来看更晕的东西啊,来 啊,相信这个图应该好理解,是吧?那也就是说管理员呢?可能啊,这个赵老师啊,啊,师老师等等,那这些老师呢,可以拥有管理员的角色,那对于这个老师来讲啊,我们来画一个人吧啊,来画一个啊,就这样吧啊,那这 是一个老师啊,比如说他姓赵,叫赵老师,赵老师呢,我们给他一个权限啊,叫赵四啊, 赵四呢,拥有一个权限,是啊,用一个角色是管理员,他既然是管理员的角色,那是不是他就具备着这四个权限, 是吧?非常好理解啊,如果说现在呢,你把这个赵四这个管理员呢啊,把他的角色呢改成了学生,那不好意思,他只有两个权限,他只能够做详情和借阅,他就不具备上架、下架和删除的权限啊。所以关于这一块的概念 我们下面来看啊,这个数据库里面关于权限和角色非常重要的五张表啊,来我们看这个数据库, 在这个库里面呢,我们看一下会有这五张表啊,然后我们把它放宽一些啊,大家能够看清楚啊, 一个是什么呢?一个是用户表,用户表里面就放用户的信息的,这个没什么问题啊。 然后呢,还有一个是权限表,就是具体有哪些权限,还有呢角色表有哪些角色,那某一个角色拥有哪些权限呢?啊?那是不是就应该这张表 对吧?就是说啊,管理员他拥有着哪些权限呢啊?普通的用户,学生啊,拥有哪些权限呢?那就在这张表里面去表示,而用户他是属于什么角色 对吧?啊,用户不是说我直接有什么权限的,就看你这个用户是属于什么角色啊,那这个时候,哎,是不是用户和角色之间关联的表就是这张表? 好,那接下来呢,我们逐一的来,呃,用表的数据啊,让大家对这块知识啊,呃,联系的更加的紧密一些啊。首先我们先来看啊,最基本的单位是不是权限这个单位在权限这张表里面呢,我们可以看一下, 重点其实就是这一块了啊,就这一块有这么二十六个权限, 那这,哎,啊,不止啊,有一个被我删掉了,是吧,一二三四五没了,对不对啊?好,那就是二十五个,二十二个啊,还有些 数据被删掉,那没关系啊,有这么二十二个权限,那每一个权限呢?有自己的 id 啊,然后,嗯,在这个地方有个 parent id 啊,就是说当前它是属于几级权限啊?哈,这句话应该这么讲啊,就是一旦用了 id 和 parent id 呢,那实际上他们就可以实现啊,无极的分类。无极的划分 为什么?因为,呃,第一集是 id 是 pandaid 是零的,你会发现呢,第一集是一六七啊,还有呢十六和二十二, 然后呢?呃,这一集下面是不是还有他的子权线啊?然后下面还有子权线,还有子权线,那你只要在数据库里面设成这两个例啊,这是一种技巧,对吧?那你就无限制的可以 让这一集呢会拥有他的子,这一集啊,用他的子集对不对啊?所以呢这就是无限集啊,或叫无极限啊。好啊,这个不重要,重要的是, 呃有哪些权限啊?有这么二十二个权限,那这二十二个权限呢?分别呃对应着的啊,就是说他能够做什么事情呢啊做啊,用户管理啊,用户查询啊啊查询新增 啊,然后呢啊菜单啊啊查询啊等等。那这些只是这个权限的,呃你可以理解成啊,就是一个名词啊,或者说是一个描述啊,是一个描述。但真正我们说要想实现这种用户管理啊,新增啊, 单处啊,对吧?那是不是得靠你的啊业务代码来实现?比如说用户下面做这个事情,你看他有没有权限,那就是看他有没有这个 id 了, 对吧?啊?如果有的话,在你的业务代表里面啊,如果他有十五这个权限的话,那他就能够往下走啊,如果说他没有的话,那不好意思,对吧?那你就不能够做这个事情啊。好,所以呢,呃首先我们看到了这个二十二个权限啊, 好,那接下来呢我们再来看对应的角色啊,然后在这个地方呢,我们的角色呢就分成了两个,一个是 的命管理员,还有个呢是由着普通用户啊,这两个角色。那管理员拥有着管理员这个角色啊,拥有着什么样的权限啊?那这个说, 或者说普通用户这个优着拥有着怎样的权限呢?我们是不是得看这张表啊?得看这张表。好,我们进到这张表里面看一下, 这样表里面的也是一样,你需要关注的是,嗯,管理员或者邮着他们的 id 啊,所以呢,在这里边啊,首先 第一个是角色的 id 啊,角色 id 是一呢,就是管理员,然后呢管理员呢拥有着所有的权限,大家看到没有啊?所有的二十二个啊,全部都在啊,那就说管理员他的权限非常的大啊,他的权限非常的大, 然后呢?呃呃,权益非常多嘛啊?然后普通用户呢要少一些啊,普通用户呢?只有这么十几个啊,这么十三个啊,很好理解,很好理解。 行,那这个是管理员他具备了哪些权限的这张表啊?是,这个时候三张表是不是就实现,对吧?换句话说,你在你的系统里面要想实现权限这套角色权限这套逻辑啊, 呃,除了一张用户表还不够,对吧?你还得有这四张表。好,我们继续看第四张表。呃,先看用户表吧,用户表就是我们刚看到的啊,这个用户,然后呢,用户是不是有个用户的 id, 那这个用户他属于什么样的角色,对吧?所以呢,我们重点就看这张表啊,在这张表里面呢,就会说某一个用户他的是属于什么样的角色啊?来,好,你会发现呢?呃,一号用户他的角色是 什么?是一啊,二号用户是二啊,然后呢?当然你可以啊说啊,你的这个二号用户啊啊,他也是管理员啊,那你再加一个吗?对吧?啊?二号用户又是一啊,又是二,是不是很好理解对吧?啊,这个很好理解啊。啊,先把他删掉。 ok, 这样的话我们就理清楚了啊,我们就理清楚了。那下面的话呢?我们说当我们要想去啊实现登录的时候啊,那我们就要知道某一个页面他有没有这样的权限能查看啊,如果没有的话,那他就不能够访问这个页面。 好,关于角色和权限这一块知识点啊,大家如果觉得,呃都没有问题啊,或者说有问题啊,我们都可以啊,在评论区和弹幕留言。
刚才我们介绍了角色和权限的概念,那接下来呢,我们看看怎么样在系统里面来实现这一套权限管理。 对于 springceequetee 来讲,他给我们提供了四个方法,这四个方法的呃逻辑呢,其实是两套,一个是针对于角色的他的权限的控制,还有一个呢就是对权限的控制,那也就是说我们先来看这四个方法, 大家看这四个方法呢,其实就能够呃大致的啊,看得出来,呃他们要实现的功能是什么? 比如说,哎,看看某一个用户啊,是否有相应的权限, 如果有相应的权限就能够访问对应的路径的资源啊。然后呢,第二个方法是看看这个用户是否有一些权限,那这就是一些权限, 那只要匹配这一些权限里面的某一个啊,那么就能访问相应的资源, 这是一套关于前线的逻辑。然后呢再往下这一套呢,是关于角色的逻辑,那我们之前已经讲过了,角色里面呢,它可以包含多个权限啊,所以你直接放一个角色就可以了, 那看看某一个用户是否属于这一个角色啊,或者说这个用户是否有多个角色好。讲到这些啊,大家应该是 呃能够感受到啊,一些他的逻辑,但是呢具体怎么实现啊?那接下来我们首先先来看第一个方法,这个方法呢是判断当前主体是否有指定的权限啊,如果有的话呢,就是处啊,否则就 force 好,那这个时候我们看看怎么去实现啊?呃,我们下面要实现的逻辑应该是这样的啊,大家看这边, 在我们的数据库里面呢,我把第二个呃用户的第二条记录改成我们的啊,千分 edu 啊。 呃,为什么呢?因为,因为我们的这个呃角色和权限表里面呢,大家能看到吗?我这边就不多加了,直接用二啊。 呃,这样的一个用户的角色啊,应该是这样说吧,就是呃用户的 啊,这个 id 是二,然后呢?他的呃权限的啊,这个角色的 id 是二,然后呢?对应的角色啊,又有相应的权限。 ok, 那简单做个调整啊,那我们后面演示的例子啊,这样改的目的就是我后面演示例子就是围绕这两个用户啊,当然大家不改也没有问题。然后呢?呃,我这个工具啊, navykat 这工具有点小小毛病,对吧?啊?你看是不是都。 嗯,有黑色的一条,不用管他,不用管他。好,那接下来呢,我们下面要实现的逻辑就是当访问这个页面啊,我们先来回来看那张图,在 这个图里面呢,当我们的学生呢访问某一个页面的时候,来判断他有没有这个权限能够访问到这个页面啊,如果有的话就怎么怎么的,如果没有的话呢?呃,如果有的话就能访问,如果没有的话呢,告诉他没有权限, 对吧?啊?那这个时候他有没有权限,那我们在数据库层面呢?是不是就是。呃, 以这个千分一滴油为例啊,那千分一滴油这个账号啊,登录进来以后呢,我们就要去看这个账号的角色是哪个角色, 还有呢,推断出与他这个角色对应的权限有哪些啊?比如说我的前锋 e d u 啊,登陆进来以后发现呢,他的 账号是他的 id 是二,然后对应的二的啊,对应的这个角色是二啊,对应的角色是二,那对应的角色是二呢?那这个角色是二的角色有哪些权限呢?都在这个地方。 好,那打个比方啊,我们刚才说你要访问的这个页面啊,如果他需要的权限是二十六,就是这个页面啊,就这个页面,这个页面呢,需要的权限是二十六。 这个 id 啊,这个权限的 id 好,但是我们的当前二号身份,二号角色的,呃,拥有的权限呢,并不包含二十六,所以呢,对于二号的角色啊,他就没有办法访问到这个页面。但是呢,一号的 拥有一号角色的啊,就是 id 是一的。这样的一些用户呢啊,这个角色的这个用户呢,就有着二十六号权限啊,他就能访问这个页面。呃,我说的这这些话里面呢,这些 啊组织的比较的长啊,因为它里面的逻辑还是会有一些复杂,就是你需要有五个表啊,相互的关联, 大家应该能理解啊。其实,呃,简单,对吧?其实简单就是看看你在你的这个用户里面,他的角色是什么,然后呢,这个角色对应的权限是什么啊?就这样过来的, 然后过来呢,发现啊,他没有二十六,对吧?那他就不能访问,然后呢发现,哎,他有二十六,他就能访问,所以在这个过程当中啊,我们需要查三张表啊,我们不说,我们要查具体是 什么角色的名称,呃,也不用查具体是什么权限的名称,我们只需要知道 id 就可以了,因为 id 是唯一的,对不对啊?所以我们只需要查三张表,那这三张表呢?我们来看一下 怎么去在我们的啊加瓦代码里面去把它实现掉啊?好,呃,首先也是一样的,我们借用之前的这一套查询的逻辑啊,那么我们就需要对这些表产生相应的实体和映射啊,那这个时候呢,我们先把它复制一下,感觉 c 好,接下来呢我们再加一张表,那这个表呢?是,呃角色和用户表 好,再来一个直接复制就可以了,看球 c, 然后呢再加一张表呢,它是角色和权限表好,这边加上盆霉选。 ok, 那这个时候我们直接来生成就可以了,双击 身上。好,以后我们需要把这些东西呢关联到我们自己的项目里面,把它复制过来,先复制 anticopy 好扔进来,然后呢还有就是他的 map 接口, 把这两个新生成的拿过来 放进来,放下以后啊,这边的 att 呢,我们重新的倒一遍。好,这个地方也是一样的, 再往下呢,我们需要把映射文件也拿到 靠壁过来, 好,也是一样,放到我们的 mapper 文件夹里面扔进来。 ok, 那这个时候我们对印热文件 要调整一下啊,首先先调这个,这个的话呢,我们需要先把我们的啊实体啊,先把我们的实体靠背过来,把他的路径靠背过来, 然后呢要替换的这个路径类的名称拿过来,好,全部替换,再往下就是这个 mapper 好,把 map 的入境呢也复制过来。 ok 啊,那这一个 map 啊,这个音首文件就 ok 了,然后呢再换下一个,也是一样的操作 好,呃,还有就是这个 map 的路径 好,这样的话呢,我们的啊基本的环境呢就准备好了, 准备好以后我们回来看一下我们刚才这一套验证的逻辑啊,那这一套验证的逻辑呢,我们需要稍微的啊,或者说其实还需要改动的地方还是比较大的,对吧?啊?呃首先我们一步步来啊,在刚才这个 secret ctrl 里面呢,那呃 都是为了体体现出我们之前聊的各种功能啊,比如说表单的认证呢啊,然后呢成功与否啊,哪些页面放行啊,注销啊等等啊。 呃现在呢,我们既然是在讲权限认证,那我们干脆就啊把这个肯定我们就放掉啊,重新呢我们来写一个啊,趁机呢把这里面的 这些呃练式吊用的一些方法呢,我们在详细的在逐一的啊复习一下。好,这时候我们再建一个 comfigu, 我们把它叫 permission, ok, 那首先呢它既然是一个啊 comfig, 所以呢我们让它继承 security and figured out, 然后在这地方啊不要忘了这个柱姐,行,呃接下来呢也是一样的,我们下面要做的事情是不是就开始去重写一些方法,比如说首先我们要去 重写我们的呃对于 htp security 的这个肯定个方法, 在这个方法里面我们要让他实现一套全线的啊这样一个认证的方式, 所以说在这个地方我们逐一的来写写啊。首先第一点呢就是我们要配置一下,如果你登录成功了,但是你没有权限,那怎么办啊?所以呢我们先配置一下这个没有权限的跳转页面, 之前我们没有配这样的页面,对吧?所以我们在这个地方啊,先把这页面先加进来好,然后在这边我们先进个页面,就是说当没有权限,他会跳到这个页面啊,比如说我们这个页面就叫 nope, 没选 好这页面呢,我们就告诉他说没有权限放在三级的标签里面。 行,这个是没有权限,会跳到这一面,回到我们的这个配置里面, 然后呢怎么去配呢?去调这边的 htpcct 对象,它里面有一个方法是对于异常的处理啊,就是说没有权限呢,是不是就会啊有异常会出现,那这个异常呢, 是属于什么异常呢?在这边我们看一下,是不是我们要去配啊,如果说是一个访问被拒绝的啊,那么这样的操作呢,我们就让他跳到这个页面啊,跳到我们的 nope 很悲选啊,这个页面 点 html, ok, 好,这个是我们啊,在权限的这一块啊,新来的一个配置, 其他的呢,就比较简单了,比如说我们依然使用我们的表单啊,这个认证的方式,所以呢,这边我们给上一个呃, form 老警, 然后再通过练习调的方式告知登录页是哪一个啊?登录页呢,是我们的 logician html, 把每一行的注解都打一下,这个是告知登录页啊,打在后面呢,呃,看的会清爽一些。 好,除了告知登录页以外呢,那登录时访问的啊,也可以把这个加一下,这边是不是有个叫 logime processing uil, 那很显来啊,这个路径啊,就登陆时访问的是。呃,杠,罗老警,就是我们的表单提交的那个 action 啊,那个地址, 那这个地址呢,是不会做拦截的对吧?啊,所以这个是登录时 访问的 url 好,再往下呢,我们可以去配一个用户名或密码时 失败的 ui ol 点 html。 好,这个是用户名或密码错误访问的页面。 嗯,这些应该大都没什么问题哈,还有呢,就是登录成功以后啊,那他会来到默认的这个页面啊,那这个页面呢,就是我们的 index 点去填没有 后访问的页面。 ok 啊,那接下来呢,我们就来一些啊,呃, 对于登录成功啊这个页面的,就是你已经登录成功了,对吧?啊,那我们加一下这个之前没有解释到的这样一个点,就是你已经登录成功了,是不是可以 给他来一个什么?可以给他来一个彭梅特欧,那彭梅特欧呢?很显来就是不需要做拦截啊,不需要做拦截。 好,那这一块呢就 ok 了。 ok, 好,以后呢我们再来一个按的,按的之后呢,我们开始啊,去设计我们的权限相关的东西啊,所以呢,这边好,那首先啊,我们说啊,我们的这一次, 嗯,对于哪些页面你可以啊,就是不需要做拦截啊,取消拦截。那比如说 我们打比方,我们要访问这个跟路径啊,那么我们就不要拦截啊,或者说我们上面已经提到了一个杠牢镜,对吧?如果访问这样的路径呢,我们也取消拦截,所以呢,在这边啊,你可以通过这种方式啊, 之前的话我们是不是通过 internet 方式啊?现在我们可以通过这种方式啊来,呃,设置哪些路径取消拦截好,然后呢?呃,下面就非常关键了,我们刚才是不是提到说, 如果说我们这一次登陆的主体有某一个权限才能访问目标资源啊,这句话我还是要再说一下,就是如果我们这一次登陆的主体有某个权限才能访问目标资源,那很显然他的,嗯, 他的,我们的主要的视角啊,应该是站在目标资源这个角度啊,也就说是这样的,就是我这个目标资源就是站在我这个角度,哎, 你过来,你有权限啊,才能访问我,对吧?你另外一个人过来没有权限,你不能访问我,所以我们应该站在目标资源这个角度,那因此呢,我们在这边啊,去做这么一个配置啊,就是啊,稍等,好, 这边的啊,自动边给他去掉。我们要做这样一个配置啊,就是说,呃,对于什么样的匹配什么的路径呢?比如说啊,打比方, 我们现在要访问的是,呃,我们看一下就拿我们的 index 连续填排好了,因为你登录成功是不是会跳到这页面,对吧? 但是呢,有的用户呢能跳,有的用户不能跳,因为他没有权限啊,所以我们对于我们的 indes 连续 tm 页面来讲,对于这个页面来讲,就是这个路径来讲,你, 你只有拥有这,哎,大家能看到啊,你只有拥有着这样的一个权限才能访问啊,所以这个应该好理解,对吧?啊,好,你只有拥有着什么样的权限呢?好,我们说我们刚才是不是说了,数据库里面你只有拥有这二十六这个权限 啊,你才能够访问啊,就在这个地方我们的权限的,嗯,这边的内容里面,呃,只有一号的角色才会拥有二十六号的权限,对吧?其他的角色没有啊。好,那这边大应该能理解啊,应该能理解,我们写写来, 对于啊,这句话非常的关键,这是我们讲的第一个方法叫 as authority 啊,也就是说对于这个页面来讲 啊,页面来说啊只有拥有二十六, 当然我们这边的权限是用 id 来表示的,二十六号权限 的用户才能够访问啊,所以对于这一块大家啊 一定要理解啊,一定要理解,不然你就嗯不清楚我们后面要做的事情啊,这个其实也好理解,对吧?其他上面都是一些基本的配置啊, 那下面这些的话呢,就是我们再配权限了,就是呃,你的这个页面你只有二十六号权限你才能访问,如果没有权限那不好意思就会跳转到这个页面,他就是告诉你没有权限了。 再往下呢就是一些惯有操作了,对于任何的请求都要去做认证,然后呢,呃,不要忘了去把我们的 csrf 呢给他关掉哈,关闭保护, ok, 那这个时候呢,我们的啊,这一次的吊用就 ok 了啊,这一次的我们的认证的这一块就 ok 了。 呃,然后啊,那接下来呢,我们啊就开始去写具体的业务代码。
hello, 今天给大家分享用 spring boot 整合 r p r region, 实现使用 r p 监控用户访问城市的功能。那我这边呢有一张图啊,比如说我们评论之后,我们在这边呢就会显示自己的一个地址信息。 那首先呢,我们可以直接打开 rpr region 这样的一个项目,然后呢他这边有一个简介啊,他是一个离线 ip 地址定位库和 ip 定位数据管理的一个框架,那他这边呢有一个 deta 文件夹,然后我们点进去,点进去之后呢,他这边有一个 rpr region 的一个叉 d b。 那我这边呢是直接把这样的一个文件啊复制到我们这样的一个目录下,比如我们访问一下哈喽,这个接口,我们在这个方法上呢加了一个注解。访问之后呢,他这边有一个日志啊,显示我们当前的一个 ip 以及解析出来的一个地址。那其实我们主要还是基于 aop 的思想,通过签名编程去实现的。比如说我这边加了一个自定义注解, 然后我们加了一个签名类啊,在这个环绕方法里面呢,我们拿到一个请求,然后拿到对应的 ip 地址,然后通过这样的一个工具类呢去解析这个 ip 地址,我们可以点进去看一下, 那这个方法呢,其实就是根据我们的 ip 地址去查询我们的登录来源,比如说我这边写了一个面方法,我们可以运行一下,看一下这个 ip 地址的一个来源, 那可以看到啊,他的一个来源呢是美国。那如果说大家想要这样的一个 demo 以及之前的 demo 的话呢,可以到这来这,然后给他去发一个消息,像这样就可以拿到我们的 demo。 好,今天的一个分享呢?就到这。
哈喽,之前呢给大家分享过用 redis 进行限流,那今天呢给大家分享用瓜娃的限流工具类 written limiter 进行限流。那比如说我这边有一个方法啊,然后上面有一个注解,这个注解呢是我自定义的注解,里面呢有几个属性,比如说 k 对应的就是我们的方法名, 这个呢是我们每秒的一个限制访问次数,这个呢是我们的一个超时时间单位呢是毫秒。然后这边呢有一个错误消息,如果说我们超过了限流的一个次数呢,这边就会有这样的一个提示信息, 那当然我们也是基于 aop 的一个机制呢去实现的,比如我这边有一个 limit map, 它的 k 呢就是对应的每一个接口,然后它的 y 六值呢就是我们每一个接口对应的令牌筒,然后这边有一个环绕通知的方法啊,我们当然也是拿到我们的千 名,拿到我们的方法,拿到我们方法上面对应的注解,然后注解,如果说不为空的话呢,我们拿到注解上的 k 就是对应的我们每一个接口,然后判断这样的一个抹布中有没有对应的一个接口,如果没有的话呢,我们当然是创建这样的一个令拍筒, 桶的大小呢就是我们注解上标注的每秒的访问次数,然后这边呢创建了令牌桶之后,我们就把它放到 map 中, 然后到这边呢我们拿到我们的抹布中对应的一个令牌筒,然后从这个令牌筒中啊获得我们的令牌,如果拿到的话,我们就正常的执行业务逻辑,如果拿不到的话呢,我们就会有这样的一个提示信息,如果说大家想要这样的一个 demo 以及之前的 demo 的话呢,可以到这来 这,然后给他去发一个消息,像这样就可以拿到我们的 demo。 好,今天的一个分享呢,就到这。
下面我们来聊一下子,不认识 qq 里面的这两种功能,一个呢是身份验证,还有一个是访问控制。 首先我们先来看这么一张图,在这张图里面呢,描述的是用户去访问一个目标链接的正常的时序, 比如说啊,同学们可以思考一下,嗯,我们要去访问我们学校里面的学生系统,或者说我们访问我们公司里面啊,打比方,我们现在是公司里面的一名员工, 那我要去访问公司里面这个 oa 系统啊,我的员工的这样一个办公系统,那无论是什么样的身份啊,他 进到这个界面里面啊,或者说他要进到这个系统里面,首先要做的第一件事情就是用户登录,那我们要去把自己啊的用户名和密码填入到这个系统里面, 然后呢再访问到目标页面,这个是 springs creative 帮我们去实现的第一个功能啊,就是用户的身份验证。 第二个功能是什么呢? subing security 在除了提供了用户验证啊这样一个功能以外,还提供了全线控制啊,或者叫访问控制。这个时候大家来思考一个问题,比如说我们学校里面的 啊,这个教学系统,教学系统,或者说公司里面的 oa 系统也好啊,我们以教学系统为例, 在学校里面,在这个教学系统里面,是不是有可能学生会登录,也有可能老师会登录? 学生在这个系统里面要做的事情是查看自己的学习成绩,但是呢,他不能够去填写学生的成绩, 而填写学生的成绩是不是应该由教师的身份进到这个系统里面去做填写学生这个事情,换句话说,如果你是学生,那么你只能看到自己的成绩,如果你是老师,你是有权限 给学生存录,或者说这个写录学生的成绩。 所以说在一个系统里面,不同的用户身份,他所看到的所能够得到的功能是不一样的, 那这一块怎么去实现呢?很显然, spring security 呢有访问控制这样一个逻辑啊,他提供了角色的权限较艳这一块功能来帮我们去实现,因此这个时候我们再来看这个实序图,就很清晰的, 比如说现在这个身份是学生,好,然后呢,他要去访问给班级里面所 所有学生打分的啊这样一个页面,那这是他的目标资源,他首先用自己的用户名和密码登录到教学系统里面, 登录进去以后,然后呢,这个时候 spring security 呢会去看一下当前你这个用户有没有 访问目标这个页面的权限,就是你有没有给所有学生打分这样一个功能的权限,那发现没有的话呢,教练不通过就返回权限异常, 相反,老师在这个系统里面去访问给学生打分这个页面,那老师呢?登录完以后,纳 spring security 发现老师这个身份是有 这个权限的,那于是乎呢,他就能够放行啊,放到这个打分的这个界面啊,那这个时候老师就能够对学生的成绩进行打分。 好,这样的话呢,大家就很好理解了。那接下来呢,我们来看一下这边的两个内容的介绍。 spring security 两个重要的核心功能就是用户认证和用户授权, 用户认证指的就是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统,那这个很好理解,就是你的用户名和密码得是正确的。 而用户授权呢,指的就是验证某个用户是否有权限执行 操作。在一个系统当中,不同的用户所有的权限是不同的。这个就是我们刚说的学生和老师。那有的学生呢啊,有的用户呢,是不是比如说学生啊,他只能够查看,不能够修改,但是呢有的用户呢,比如说老师啊,既能够查看又能够修改。 所以呢这一块呢,我们讲的就是每个用户每个角色他有自己对应的权限,而用户的认证,用户的授权这两大核心功能 spring security 都帮我们集成好了, 所以接下来我们就要快速的先体验一下 security 这个框架。
今天我们来讲一下 sso 单点的 no, 我们直接对照这个流程图来讲,首先这个单点的 no, 他涉及到三个项目,第一个项目是 sso 服务器项目, 第二个项目是应用程序一项目,第二个第三个项目是应用程序二项目,我们最重要模拟实现的功能就是这个应用程序一登录之后,应用程序二就不需要再次登录了, 也就是所谓的单点登录,就只需要一个系统登录一次,其他系统就不不需要再登录了。好,我们直接来看单码,首先第一步要启动这个 sso 服务器啊,第二步启动这个应用程序一, 那第三步启动这个应用程序二,我们分别找到这三个项目的,这个启动入口类是 s o 服务 后期的提供入口类是这个类,我们直接右键启动就可以了,我们这里已经启动了,这里可以看到启动之后这个端口是八零八五, 然后我们启动应用程序一,这个项目启动入口内是这个类,我们也直接右键启动,启动成功之后就是这个样子,端口是八零八六,然后启动应用程序二,找到启动入口内,这个是启动入口内,也是直接右键启动,启动完之后就是这个样子, 端口是八零八七,然后接着我们就开始就是要访问这个应用程序一,然后我们第一次访问,第一次访问的时候,就比如说我们访问这个页面,直接访问,访问之后 他就跳转到这个 sso 服务器这个登录里面来了,这里需要输入这个用户名密码,然后点登录,我们对着这个流 镜头来看一下,就是第一次访问,然后会跳转到这个 sso 服务器的这个登录页面,并且要输入用户名密码,这个是用户名,这个是密码,就是输入这个用户名和密码, 然后就现在就是登录,登录之后,然后进入授权页面,我们点登录,然后现在就是调整到这个 sso 服务器的授权页面这里,然后点授权之后就可以调整到应用程序页面了, 就这里授权页面,点确认授权,就可以跳转到应用程序页面了,我们来看一下点授权现在就可以访问这个应用程序,这个页面的这个端口是应用程序的端口, 这里授权授权之后,这个 ss 和福气就挑选到应用程序界面。现在的话就是应用程序一第一次访问 的时候就是需要登录,并且需要授权完了之后,然后再调整到应用程序自己的页面,然后我们在第二次访问这个应用程序一,可以可以看到就是现在可以直接访问了, 就是不需要再次登录。接下来我们再访问这个应用程序二,然后第一次访问,现在访问的端口是八零八七,这个是应用程序二的端口,访问之后我们可以看到这个是这个是不需要再次登录, 因为现在不是跳转到登录页面输入用户名密码,而是跳转到这个授权页面,也就是说这个应用程序二访问的时候,就不需要进到这个登录页面输入用户名密码,而是直接就是进入到这个授权页面,点这个确认授权,就可以跳转到这个应用程 程序页面,我们点这个授权,然后现在就是跳转到这个应用程序二的页面了,点授权之后就可以跳转到这个应用程序二的页面了, 所以我们可以看到就是应用程序一,这个应用程序一和应用程序二唯一的区别就是应用程序二就不需要进入这个登录页面,输入应用密密码就不需要再次登录了。 主要是这个区别,也就是也就是所谓的 sso 单点登录就只需要一个系统登录一次,就其他系统就不需要再次登录了, 只需要授权就可以了。然后最后就是稍微说一点,这个实现原理是基于这个 spree si, 是基于 spree security 来实现的。好的,谢谢。
再牛逼的黑客或者是再牛逼的这个安全扫描工具,都不会知道我们软件里面到底有多少个接口。 只有我们程序员自己开发的软件,我们才知道我们软件到底有多少个接口。咱们现在的软件基本上是以网络程序居多, 那网络程序他就涉及到一个问题,他既然暴露在网络当中,就有可能 被黑客攻击,这个是互联网的网络,那如果是在局域网的话,其实他有漏洞的话,也是容易被在局域网被别的呃有病毒啊之类的东西给攻击。假如说我们的软件放到客户那边去, 那客户如果说用相应的呃安全工具去扫描,能够扫描到我们的这个软件,如果说有漏洞的话,必然咱们这个软件将面临一个不合格不合规的问题。那对于我们扎马来讲,我们如何来解决这些 接口是否能够被扫描到的问题呢?而近些年 java 领域写的这种接口多半是以这种 spring mvc 这种居多。那针对于 基于 super mvc 这种框架做出来的软件,我们其实可以通过我们自己对代码的解析进行去 全面的扫描来来识别出所有的接口,并且我们可以写相应的工具去访问所有的接口。那我们访问了之后就知道哪些接口是可以被匿名访问的。 这是一个思路。后面我在直播当中将会讲到怎么来开发这个工具,去解析我们的 spring m m v c 里面的 ctrl 去识别这些接口,并且去访问这些接口。
哈喽,大家好,我是徐树,来给大家介绍一下 spring 部的解决跨越的五种方式。那什么是跨越呢?很好理解,就比方说图令点 com, 想去百度点 com 拿点数据,那么此时呢,就是跨越, 但是除了域名不同以外,还有协议不同,端口不同,二级域名不同, ip 不同,都是跨域。但是我想问大家一个问题,跨域就一定会有异常吗?跨域的异常大家应该都见过,对吧?但是跨域就一定会有异常吗?其实并不是, 跨越异常只有在前端才会发生,就比如说我图令点 com 通过阿贾克斯去访问百度点 com, 此时才会出现跨越异常。但是如果我是在后端, 比如说我通过 raced temply 的,或者通过 http client 去请求其他的域,那么此时虽然是 跨越,但是不会出现异常。所以大家明确一点,跨越只有在前端才会发生。为了本视频的文档我已经整理好了,并且与往期内容一起会放在了视频的最后面,截止放完一定对你有帮助。就是因为浏览器它有一个叫做同源策略的东西, 他发现我们不同玉之间的访问是不安全的行为,他会静止,所以会抛出异常。 但是我们都知道,现在我们的项目基本都是前后端分离的,对吧?前端跟后端呢,可能用的是不同的端口,那么此时就会出现跨越的异常, 那么如何解决呢?徐老师给大家提供了五种跨越的解决方案。首先第一种学生 p, 这种方式呢,是比较老的一种跨越的解决方案,在早期的时候呢,他对各个浏览器的版本兼容性做的比较好,所以得到了广泛的运用, 实现起来呢也并不复杂,需要在前端跟后端都去写相应的代码来进行知识。首先在前端,就比如说我们通过区块瑞的方式,通过阿贾克斯去进行一个跨域的请求,然后呢我们需要指定 data type 回 jason p, 这个时候它会自动啊, 在你请求的时候加上一个叫做 call back 的参数,它的值呢是随机的,当然你也可以通过这两个属性去设置它的名字和值。好吧,那不设置呢,默认就是 call back, 它的值是随机的,那这个参数有什么用呢?它会作为一个密要的形式呢,传到你的后端, 你后端呢,就需要把这个值再返回给前端,这就相当于前后端做了一个握手,那么表示呢,你这种跨域是合法 的,是我认可的,是安全的,就可以进行快与访问了,那么前端实现起来非常的简单,对吧?后端我们 spring 不的也比较简单,只需要呢通过声明一个 coback 参数来接收那个参数,然后呢去返回一个叫做 justin p object 的对象, 将这个 callback 作为第一个参数,然后第二个参数呢,是你需要返回到前端的这样的数据, 那么最终呢,他就会封装成 jason p 的一个数据格式。什么格式呢?就比方说我这个 callback 接收进来,假设是徐述, 那么他最终会将这个数据拼装成徐数,括号里面会放上你第二个参数,所返回到前端的这个数据,这就是 jason p 的数据格式。那么前端接触到 呢,就会认为你这是一个安全的跨越请求,然后就可以正常的去请求访问了。当然这种方式呢,他也有很多弊端,首先他只支持 get 请求,其他的比如说 put post 他都不支持。还有呢, 这种方式他前后端都需需要去写相应的代码存在偶和。就比方说我刚刚说的,他会传一个 callback 的参数,那么假如说你这个参数名字变了, 那么我后端也需要相应的变,对吧?所以说他们存在偶和。那么随着技术发展至今呢,这种方式也已经慢慢的被替代,可以通过这个 cois 的方式呢来进行替代。 这种方式就只需要我们在后端写相应的代码即可,前端不需要有任何的干预,你直接通过阿贾克斯去发起跨越请求就可以了。 这种方式呢,就要比我们之前通过 jason p 还得去单独的去指定 jason p 的支持要简单的多,因为我们只需要在后端去写相应的代码即可。怎么实现呢?那在我们 spring boot 当中要实现这个 cos 的方式呢?有三种 不同的场景,我们自己选择就行了。第一种可以通过这 cross orange 柱结,这样呢就可以设置当前这一个接口支持跨域请求,并且我们还可以设置这个跨域的来源,你是哪一个域名才支持跨域请求,那否则呢,都不支持。 这是第一种,这种是专门针对某一个接口,那如果我想批量的去支持某一批接口来支持跨越呢?那我们可以去配置一个实现了 web mvc 这样的一个病,那么这个病呢,我们去重写这个添加跨域的映射这个方法,然后通过这个注册器呢,我们就可以去添加哪一批接口, 你通过这个前缀去设置一批接口去支持跨域,然后去设置这个跨域的来源,跨域的方法是支持 get post date 还是 pro? 当然你也可以写一个心,代表所有的来源,所有的方法都支持,好吧,那么这样呢,就可以通过一批接口去进行限制, 但是如果你想所有的接口都支持跨语,就可以通过这个给他配置一个过滤器这样的一个病,好吧,给他添加一个 close filter 这样的一个病,通过这个病呢,你就可以去限制所有的接口呢,他 是支持跨越的,然后跨越的来源是什么,跨越的方法是什么等等。那通过 c o s 呢?其实他也有弊端,在发起跨越的请求的时候,他也要通过浏览器去支持, 浏览器一旦发现你请求的是跨域的请求,他会自动的在你的请求头里面去附加一些信息。如果你是一个复杂的一个跨域请求的时候,他有时候还会请求两次,第一次呢, 会发送一个请求方法为 option 的请求,代表呢我当前这个跨越请求后端是否支持,那么第二次才会真正的发起当前的这个跨越请求,然后传仓, 所以说有些复杂的他会传两次,这些都是由浏览器来决定的,所以说他需要浏览器的版本支持,就比如说 i 一的 这个版本就不能低于 i 一十,当然我们目前主流的一些浏览器啊,你像谷歌浏览器啊, i 一啊,对吧?我相信还不会有同学还还在用 i 一 i 一八吧,对不对?当然不排除有些公司需要做的一些项目呢,还要支持 i 一八,对吧?还是有的, 所以说如果你的公司有这些需求的话,那这个 c o s 你就不能去用了,那么徐硕老师呢,推荐你用我们最后的一种方式,通过 nginx 进行反向代理, 通过 n g x 呢,实现起来也非常的简单,你不需要在前端和后端做任何的配置,只需要在 n g x 当中呢去配置一下,就比如说你当前是八零八幺,对吧?你的前端作为用 n g x 作为外本服务器,然后开启八零八幺 的端口,然后呢去监听,比如说你是这个 c o s 或者某一个这个接口开头的,就给他转发到这个后端, 那么我们所有的这个,呃,前端啊,凡是需要请求后端的接口,你都给他加上这个前缀,那么他都会给你呢,给他转发到 转发到我们的这个后端,那么这样呢,就是同一个域了,这样就可以啊,实现我们的这个跨域,好吧,当然使用这个 nginx 啊,你注意 我们访问的是哪里啊?访问的是同样是八幺八幺,也就是说我依然访问我自己的地址,但是呢,我监测到你的地址栏有这个 cois, 他会加你这个请求给转 到八零八零,好吧,这样呢,我们之前说过,只有通过浏览器发起的这个跨域才会有异常,但是我们通过浏览器发起的这个请求是同一个域,对不对?此时呢,浏览器他侦测不到你进行了跨域, 但是呢,我们会在 ng inks 当中这一层给它进行转到我们的后端,但是后端跟后端之间它是不存在跨越的 好吧,通过这种方式呢,就可以有效的去解决我们的这个跨越的异常。这几种方式其实我最推荐大家呢使用 nginx 的这种方式,因为你既 不需要在前端写任何的呃跨越的知识,也不需要在后端去写任何的。这个支持你只需要在 n g x 当中去配一下就行了。我以前很多项目呢,也都是通过这个 n g x 的 这个方式来去实现的。需要本视频视力代码请在评论区回复 nice。
这是一个简单的 spring boot 服务,在浏览器访问服务的接口成功返回结果,如果在 console 里面使用 fat 方法来进行请求,把 local hose 换成幺二七点零点零点幺,会发生什么呢?是的, 这里出现了跨域报错。我们知道跨域是浏览器的一种安全策略,在不同域名、不同协议、 不同端口的情况下就会发生跨越。 logo house 和幺二七点零点零点幺在概念上是同一主机,但从浏览器的角度看,他们被认为是不同的域。 下面给大家演示几种常用的跨域方案解决方案。第一种是项目中最常使用的使用 nginx 反向代理。在 nginx 上处理跨域问题 主要就是这几行配置, allow origin 用于设置允许跨域请求原地址。 allow headers 用于设置跨域允许携带的 header 信息。 allow methods 用于设置跨域允许的请求方法, allow credentials 设置是否允许跨域使用 cookies。 另外一个很重要的事,处理预检请求。当发生跨越条件时候,浏览器会先询问服务器,请求方式是 option, 只有得到肯定答复, 浏览器才会发出正式的 http 请求。所以当请求为 option 请求时候,需求返回一个状态码。二零四,保存设置后重启 injinx 测试一下,我们把请求端口改成 injinx 监听的八八八八,让服务 使用 and drinks 的反向代理 local host 请求没有问题, fetch 的一百二十七余名请求也正常返回。结果,除了 end drinks 方案, 也可以使用 spring 框架本身自带的 at cross origin 注解来处理跨越。这里注解的参数, foreign drinks this is page of origin a law hatters a law methods 和 law credentials 不一样,是使用 adcross origin 注解时, spring 框架会自动处理浏览器发送的预检请求, 我们不需要像 in drinks 那样设置响应预检请求。添加注解后重启服务测试一下同样可以解决跨越问题。除了使用 adcross origin 注解解决单一接口的问题,我们也可以使用全 全局 mvc 配置的方式,通过实现 y bmvc configure 接口注册自定义的拦截器配置需要拦截的接口,还有和之前一样的允许配置。 重启测试一下成功解决跨越问题。上面就是给大家演示的三种跨越问题解决方案,希望对你有所帮助。