Security為Spring自帶的權限框架,相似的還有shiro。該框架原理為過濾器攔截請求進行處理。
用户填入用户名密码后,与数据库里存储的用户信息进行比对,如果通过,则认证成功。传统的方法是在认证通过后,创建sesstion,并给客户端返回cookie。
现在我们采用JWT来处理用户名密码的认证。区别在于,认证通过后,服务器生成一个token,将token返回给客户端,客户端以后的所有请求都需要在http头中指定该token。
服务器接收的请求后,会对token的合法性进行验证。
验证的内容包括:内容是一个正确的JWT格式、检查签名、检查claims、检查权限、处理登录
具體實現:
一、框架自帶
在Secrity的配置類中,攔截“/login”請求,並添加兩個過濾器
创建一个类JWTLoginFilter,核心功能是在验证用户名密码正确后,生成一个token,并将token返回给客户端:
该类继承自UsernamePasswordAuthenticationFilter,重写了其中的2个方法:
attemptAuthentication :接收并解析用户凭证。(該類繼承的父類默認的攔截請求為/login post)
successfulAuthentication :用户成功登录后,这个方法会被调用,我们在这个方法里生成token。用户一旦登录成功后,会拿到token,后续的请求都会带着这个token,服务端会验证token的合法性。
創建Token的方法Jwts.builder()
创建JwtAuthenticationFilter类,我们在这个类中实现token的校验功能。
该类继承自BasicAuthenticationFilter,在doFilterInternal方法中,从http头的Authorization 项读取token数据,然后用Jwts包提供的方法校验token的合法性。
解析Token的方法Jwts.parser()
如果校验通过,就认为这是一个取得授权的合法请求。
二、自定義
在SecurityConfig的白名單中添加自定義的登陸請求
JWTAuthenticationFilter、JWTLoginFilter就不會攔截
三、Token驗證
请求被Security的JWTAuthenticationFilter拦截