登录注册实现:
1.Spring security + JWT权限认证:https://www.jianshu.com/p/d5bc4a9235cc
2.Spring security + JWT例子:https://github.com/echisan/springboot-jwt-demo/
3.SpringBoot中使用Shiro和JWT做认证和鉴权:https://www.jianshu.com/p/0b1131be7ace , Spring Security做JWT认证和授权:https://www.jianshu.com/p/d5ce890c67f7
4.token和session机制:https://www.cnblogs.com/belongs-to-qinghua/p/11353228.html
https://www.cnblogs.com/yanggb/p/10940975.html
https://blog.csdn.net/mydistance/article/details/84545768
https://www.cnblogs.com/sablier/p/11099909.html
https://www.zhihu.com/question/21385375
CSRF(跨站请求伪造)攻击
CSRF攻击的大致方式如下:某用户登录了A网站,认证信息保存在cookie中。当用户访问攻击者创建的B网站时,攻击者通过在B网站发送一个伪造的请求提交到A网站服务器上,让A网站服务器误以为请求来自于自己的网站,于是执行响应的操作,该用户的信息边遭到了篡改。总结起来就是,攻击者利用用户在浏览器中保存的认证信息,向对应的站点发送伪造请求。用户的认证是通过保存在cookie中的数据实现,在发送请求时,只要浏览器中保存了对应的cookie,服务器端就会认为用户已经处于登录状态,而攻击者正是利用了这一机制。
JWT:JSON Web Token // 是一种具体的Token实现框架
OAuth2:Open Authorization // 是一种授权协议,是规范,不是实现
Spring Security OAuth2:Spring 对 OAuth2 的开源实现,优点是能与Spring Cloud技术栈无缝集成
jwt是基于token的认证协议的实现,OAuth2是一种授权框架,提供了一套详细的授权协议标准(指导)。
springboot登录认证:
一.session:
当用户第一次通过浏览器使用用户名和密码访问服务器时,服务器会验证用户数据,验证成功后在服务器端写入session数据,向客户端浏览器返回sessionid,浏览器将sessionid保存在cookie中,当用户再次访问服务器时,会携带sessionid,服务器会拿着sessionid从数据库获取session数据,然后进行用户信息查询,查询到,就会将查询到的用户信息返回,从而实现状态保持。
问题:1、服务器压力增大:通常session是存储在内存中的,每个用户通过认证之后都会将session数据保存在服务器的内存中,而当用户量增大时,服务器的压力增大。
2、CSRF跨站伪造请求攻击:session是基于cookie进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。
3、扩展性不强:如果将来搭建了多个服务器,虽然每个服务器都执行的是同样的业务逻辑,但是session数据是保存在内存中的(不是共享的),用户第一次访问的是服务器1,当用户再次请求时可能访问的是另外一台服务器2,服务器2获取不到session信息,就判定用户没有登陆过。
二、token认证:
基于Token的身份验证是无状态的,不将用户信息存在服务器或Session中。客户端通过cookie、sessionStorage、localStorage都可以进行存储。No Session意味着程序可以根据需要去增减机器,而不用去担心用户是否登陆的问题。基于Token的身份验证的过程如下:
1.用户通过用户名和密码发送请求。
2.程序验证登陆信息,并返回一个签名的Token给客户端。
3.客户端存储Token。
4.客户端再次发起HTTP请求,将Token附加在请求中,服务端验证Token并返回数据。
(1)token生成(2)鉴权与认证
1)token生成:JWT(Json Web Token),它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证 token的正确性,只要正确即通过验证。在分布式系统中,很好地解决了单点登录问题,解决了session共享的问题。
- 用户导航到登录页,输入用户名、密码,进行登录
- 服务器验证登录鉴权,如果该用户合法,根据用户的信息和服务器的规则生成JWT Token
- 服务器将该token以json形式返回(不一定要json形式,这里说的是一种常见的做法)
- 用户得到token,存在localStorage、cookie或其它数据存储形式中。
- 以后用户请求/protected中的API时,在请求的header中加入 Authorization: Bearer xxxx(token)。此处注意token之前有一个7字符长度的 Bearer
- 服务器端对此token进行检验,如果合法就解析其中内容,根据其拥有的权限和自己的业务逻辑给出对应的响应结果。
- 用户取得结果
jjwt结构包含三部分:header头部,payload负载,signature签名
在header中通常包含了两部分:token类型和采用的加密算法,对这部分内容使用 Base64Url 编码组成了JWT结构的第一部分。
Token的第二部分是payload负载,它包含了claim, Claim是一些实体(通常指的用户)的状态和额外的元数据,有三种类型的claim: reserved , public 和 private 。
Reserved claims: 这些claim是JWT预先定义的,在JWT中并不会强制使用它们,而是推荐使用,常用的有 iss(签发者) , exp(过期时间戳) , sub(面向的用户) , aud(接收方) , iat(签发时间) 。
Public claims:根据需要定义自己的字段,注意应该避免冲突。
Private claims:这些是自定义的字段,可以用来在双方之间交换信息。
负载需要经过 Base64Url 编码后作为JWT结构的第二部分。
创建签名signature需要使用编码后的header和payload以及一个秘钥,使用header中指定签名算法进行签名。签名用于验证消息的发送者以及消息是没有经过篡改的。
(2)鉴权与认证:
安全框架:
安全框架,简单说是对访问权限进行控制,应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。
用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码,系统通过校验用户名和密码来完成认证过程。
用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。
(2.1)Spring Security:
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC(控制反转),DI( 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。它是一个轻量级的安全框架,它确保基于Spring的应用程序提供身份验证和授权支持。它与Spring MVC有很好地集成,并配备了流行的安全算法实现捆绑在一起。安全主要包括两个操作“认证”与“验证”(有时候也会叫做权限控制)。“认证”是为用户建立一个其声明的角色的过程,这个角色可以一个用户、一个设备或者一个系统。“验证”指的是一个用户在你的应用中能够执行某个操作。在到达授权判断之前,角色已经在身份认证过程中建立了。
Spring security 是基于filter的,filter按照顺序去执行,根据filterChain去调用下一个filter,Spring Security 在 Filter 中创建 Authentication 对象,并调用 AuthenticationManager 进行校验。Spring Security有一个filterChain去管理filter,根据需要的功能在配置中配置。
(2.2)Shiro:
Apache Shiro是一个强大且易用的Java安全框架,能够非常清晰的处理身份验证、授权、管理会话以及密码加密。利用其易于理解的API,可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
Shiro 主要分为两个部分就是认证和授权,查询数据库做相应的判断,Shiro是一个框架,其中的内容需要自己的去构建,前后是自己的,中间是Shiro帮我们去搭建和配置好的。
(2.3)比较:
Shiro特点:
1、易于理解的 Java Security API;
2、简单的身份认证(登录),支持多种数据源(LDAP,JDBC,Kerberos,ActiveDirectory 等);
3、对角色的简单的签权(访问控制),支持细粒度的签权;
4、支持一级缓存,以提升应用程序的性能;
5、内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境;
6、异构客户端会话访问;
7、非常简单的加密 API;
8、不跟任何的框架或者容器捆绑,可以独立运行。
Spring Security特点:
除了不能脱离Spring,shiro的功能它都有。
而且Spring Security对Oauth、OpenID也有支持,Shiro则需要自己手动实现。Spring Security的权限细粒度更高。
通常来说,shiro入门更加容易,使用起来也非常简单,这也是造成shiro的使用量一直高于Spring Security的主要原因。
Spring Security依托于Spring庞大的社区支持,这点自不必多说。shiro属于apache社区,因为它的广泛使用,文档也非常的全面。二者从社区支持来看,几乎不相上下。但是从社区发展的角度看,Spring Security明显更占优势,随着Spring Cloud、Spring Boot、Spring Social的长足进步,这种优势会越来越大。Spring Security未来在于Spring系列框架集成的时候一定会有更好的融合性,前瞻性、兼容性。
Spring Security因为它的复杂,所以从功能的丰富性的角度更胜一筹。Spring Security默认含有对OAuth2.0的支持,与Spring Social一起使用完成社交媒体登录也比较方便。shiro在这方面只能靠自己写代码实现。Spring Security提供更多安全性支持。
将authorizeRequests().antMatchers()用于将授权应用于您在antMatchers()中指定的一个或多个路径。 如permitAll()或hasRole('USER3')。 仅在第一个http.antMatcher()匹配时才应用它们。
https://www.codenong.com/35890540/
authenticated()要求在执行该请求时,必须已经登录了应用,否则会出现如下错误。permitAll()方法允许请求没有任何的安全限制。
https://blog.csdn.net/z1790424577/article/details/80739123