上节里面,我们已经将基本的前端VUE+ElementUI整合到了一起。并且通过axios发送请求到后端API。
解决跨域问题后、成功从后端获取到数据。
在之前,我们的API都是一种裸奔的方式。谁都可以访问,肯定是不安全的。所以我们要引入安全校验框架。
因为HTTP是一种无状态的协议。所以服务端不知道这个请求是谁发过来的,有好多人访问服务器,但是对于服务器来说,这些人我都不认识。就需要一种东西来给每个人加一个ID。
session(会话)是一种客户端发起请求后,服务端用来识别用户的东西,可以保存一些用户的基本信息。比如ID什么的
cookie是一种客户端浏览器用来记录和保存信息的东西。简单理解,如图所示。
当然,默认的cookie里面总会包含一串JSESSIONID
Session:每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。
CSRF:因为是基于cookie来进行用户识别的,cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。
肯定是原有的session认证的方式存在弊端、我们就需要采取一种新的方式来进行验证。JWT
JWTtoken由三部分构成:
头部一般包含加密算法和类型。例如
//secret为加密算法的密钥Stringsignature=HMACSHA512(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)我们来参考一个生成的JWT实例
注意,我这里使用回车、一般三部分都是通过标点进行分割的。
引入到mall-security并且添加一个配置文件。
断言可以理解为:若当前行不符合判断条件、则抛出异常。或者直接使用断言来抛出一个异常。比如账号不存在,直接抛出一个异常即可。
全局异常处理:全局异常处理,在全局统一拦截异常信息,并通过{code=500,message="errormessage"}的方式返回给前端做出提示即可。
Springboot对于全局异常的处理、简直是简单的不得了~
断言则是,判断某一条件是否成立、如果不成立则抛出异常的一种更加简单的方式。就不用每次都写thrownewxxxException
简而言之就是:一种非常优美的方式抛异常(偷懒的)
token检验包含:当前token是否有效(能顺利从token取出我们的sub)、以及检验其是否过期无效等。
@OverridepublicUmsAdminTokenBOumsAdminLogin(UmsAdminLoginParamparam){//通过用户名获取userDetailUserDetailsuserDetails=this.findUserDetailByUserName(param.getUsername());//基本校验用户名和密码if(!passwordEncoder.matches(param.getPassword(),userDetails.getPassword())){Asserts.fail("用户名密码错误");}//这里暂时不开启权限,后面再修改UsernamePasswordAuthenticationTokenauthentication=newUsernamePasswordAuthenticationToken(userDetails,null);//将构建的用户信息加入springsecuritycontext上下文SecurityContextHolder.getContext().setAuthentication(authentication);Stringtoken=defaultTokenServer.generateToken(userDetails);returnUmsAdminTokenBO.builder().token(token).tokenHeader(jwtConfig.getTokenHeader()).build();}SecurityConfig接下来。就是配置一个全局的SecurityConfig
publicclassSecurityConfigextendsWebSecurityConfigurerAdapter{}主要还是需要重写configure()方法。获取一个registry实例。将我们的拦截信息加入到里面。
然后我们每一个请求首先会进入JwtAuthenticationTokenFilter也就是我们上面写的这个。
检查当前请求有没有携带token要是带了token那就检查它,检查成功就从数据库查出来这个人。把这个人注入到我们的SpringSecurityContext里面。
要是没带、或者验证错误~。那上下文也就没有这个用户的信息了。所以这个请求只能返回403
这里使用的是:PasswordEncoder接口实现类下的BCryptPasswordEncoder,当然,你肯定要在使用之前要用@Bean
@BeanpublicPasswordEncoderpasswordEncoder(){returnnewBCryptPasswordEncoder();}