Security+JWT

Security為Spring自帶的權限框架,相似的還有shiro。該框架原理為過濾器攔截請求進行處理。

用户填入用户名密码后,与数据库里存储的用户信息进行比对,如果通过,则认证成功。传统的方法是在认证通过后,创建sesstion,并给客户端返回cookie。

现在我们采用JWT来处理用户名密码的认证。区别在于,认证通过后,服务器生成一个token,将token返回给客户端,客户端以后的所有请求都需要在http头中指定该token

服务器接收的请求后,会对token的合法性进行验证。

验证的内容包括:内容是一个正确的JWT格式、检查签名、检查claims、检查权限、处理登录

具體實現:

一、框架自帶

在Secrity的配置類中,攔截“/login”請求,並添加兩個過濾器

SecurityConfig

创建一个类JWTLoginFilter,核心功能是在验证用户名密码正确后,生成一个token,并将token返回给客户端:

该类继承自UsernamePasswordAuthenticationFilter,重写了其中的2个方法:

attemptAuthentication :接收并解析用户凭证。(該類繼承的父類默認的攔截請求為/login post


接收/login

successfulAuthentication :用户成功登录后,这个方法会被调用,我们在这个方法里生成token。用户一旦登录成功后,会拿到token,后续的请求都会带着这个token,服务端会验证token的合法性。

創建Token的方法Jwts.builder()

successfulAuthentication

创建JwtAuthenticationFilter类,我们在这个类中实现token的校验功能。

该类继承自BasicAuthenticationFilter,在doFilterInternal方法中,从http头的Authorization 项读取token数据,然后用Jwts包提供的方法校验token的合法性。

解析Token的方法Jwts.parser()

JwtAuthenticationFilter
驗證方法

如果校验通过,就认为这是一个取得授权的合法请求。

二、自定義

在SecurityConfig的白名單中添加自定義的登陸請求

JWTAuthenticationFilter、JWTLoginFilter就不會攔截

白名單
自定義接口

三、Token驗證


验证Token请求

请求被Security的JWTAuthenticationFilter拦截

JWTAuthenticationFilter

你可能感兴趣的:(Security+JWT)