登录注册鉴权与认证
登录注册实现:
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
shiro安全框架
服务器端对此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社区,因为它的⼴泛使⽤,⽂档也⾮常的全⾯。⼆者从社区⽀持来看,⼏乎不相上下。但是从社区发展的⾓度看,Sprin
g 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()匹配时才应⽤它们。
authenticated()要求在执⾏该请求时,必须已经登录了应⽤,否则会出现如下错误。permitAll()⽅法允许请求没有任何的安全限制。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。