符合中小企业对网站设计、功能常规化式的企业展示型网站建设
本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...
商城网站建设因基本功能的需求不同费用上面也有很大的差别...
手机微信网站开发、微信官网、微信商城网站...
创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!
目前累计服务客户近1000家,积累了丰富的产品开发及服务经验。以网站设计水平和技术实力,树立企业形象,为客户提供成都网站设计、成都网站建设、外贸网站建设、网站策划、网页设计、网络营销、VI设计、网站改版、漏洞修补等服务。成都创新互联始终以务实、诚信为根本,不断创新和提高建站品质,通过对领先技术的掌握、对创意设计的研究、对客户形象的视觉传递、对应用系统的结合,为客户提供更好的一站式互联网解决方案,携手广大客户,共同发展进步。这篇文章主要介绍如何实现SpringSecurity+JWT认证流程,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
纸上得来终觉浅,觉知此事要躬行。
楔子本文适合:对Spring Security有一点了解或者跑过简单demo但是对整体运行流程不明白的同学,对SpringSecurity有兴趣的也可以当作你们的入门教程,示例代码中也有很多注释。
本文代码:码云地址 GitHub地址
大家在做系统的时候,一般做的第一个模块就是认证与授权模块,因为这是一个系统的入口,也是一个系统最重要最基础的一环,在认证与授权服务设计搭建好了之后,剩下的模块才得以安全访问。
市面上一般做认证授权的框架就是shiro
和Spring Security
,也有大部分公司选择自己研制。出于之前看过很多Spring Security
的入门教程,但都觉得讲的不是太好,所以我这两天在自己鼓捣Spring Security
的时候萌生了分享一下的想法,希望可以帮助到有兴趣的人。
Spring Security
框架我们主要用它就是解决一个认证授权功能,所以我的文章主要会分为两部分:
我会为大家用一个Spring Security + JWT + 缓存的一个demo来展现我要讲的东西,毕竟脑子的东西要体现在具体事物上才可以更直观的让大家去了解去认识。
学习一件新事物的时候,我推荐使用自顶向下的学习方法,这样可以更好的认识新事物,而不是盲人摸象。
注:只涉及到用户认证授权不涉及oauth3之类的第三方授权。
1. :book:SpringSecurity的工作流程想上手 Spring Security 一定要先了解它的工作流程,因为它不像工具包一样,拿来即用,必须要对它有一定的了解,再根据它的用法进行自定义操作。
我们可以先来看看它的工作流程:
在Spring Security的
官方文档上有这么一句话:
Spring Security's web infrastructure is based entirely on standard servlet filters.
Spring Security 的web基础是Filters。
这句话展示了Spring Security
的设计思想:即通过一层层的Filters来对web请求做处理。
放到真实的Spring Security
中,用文字表述的话可以这样说:
一个web请求会经过一条过滤器链,在经过过滤器链的过程中会完成认证与授权,如果中间发现这条请求未认证或者未授权,会根据被保护API的权限去抛出异常,然后由异常处理器去处理这些异常。
用图片表述的话可以这样画,这是我在百度找到的一张图片:
如上图,一个请求想要访问到API就会以从左到右的形式经过蓝线框框里面的过滤器,其中绿色部分是我们本篇主要讲的负责认证的过滤器,蓝色部分负责异常处理,橙色部分则是负责授权。
图中的这两个绿色过滤器我们今天不会去说,因为这是Spring Security对form表单认证和Basic认证内置的两个Filter,而我们的demo是JWT认证方式所以用不上。
如果你用过Spring Security
就应该知道配置中有两个叫formLogin
和httpBasic
的配置项,在配置中打开了它俩就对应着打开了上面的过滤器。
formLogin
对应着你form表单认证方式,即UsernamePasswordAuthenticationFilter。httpBasic
对应着Basic认证方式,即BasicAuthenticationFilter。换言之,你配置了这两种认证方式,过滤器链中才会加入它们,否则它们是不会被加到过滤器链中去的。
因为Spring Security
自带的过滤器中是没有针对JWT这种认证方式的,所以我们的demo中会写一个JWT的认证过滤器,然后放在绿色的位置进行认证工作。
知道了Spring Security的大致工作流程之后,我们还需要知道一些非常重要的概念也可以说是组件:
Authentication
对象会放在里面。Authentication
,返回一个认证完成后的Authentication
对象。上下文对象,认证后的数据就放在这里面,接口定义如下:
public interface SecurityContext extends Serializable { // 获取Authentication对象 Authentication getAuthentication(); // 放入Authentication对象 void setAuthentication(Authentication authentication); }