登录注册鉴权与认证

登录注册实现:

 

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工作流程图

  • 用户导航到登录页,输入用户名、密码,进行登录
  • 服务器验证登录鉴权,如果该用户合法,根据用户的信息和服务器的规则生成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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值