spring boot java jwt,Spring Boot+Spring Security+Jwt

一: RestApi接口增加JWT认证功能

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

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

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

内容是一个正确的JWT格式

检查签名

检查claims

检查权限

处理登录

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

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

attemptAuthentication :接收并解析用户凭证。

successfulAuthentication :用户成功登录后,这个方法会被调用,我们在这个方法里生成token。

二:授权验证

用户一旦登录成功后,会拿到token,后续的请求都会带着这个token,服务端会验证token的合法性。

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

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

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

三:SpringSecurity配置

通过SpringSecurity的配置,将上面的方法组合在一起。

这是标准的SpringSecurity配置内容,就不在详细说明。注意其中的

.addFilter(new JWTLoginFilter(authenticationManager()))

.addFilter(new JwtAuthenticationFilter(authenticationManager()))

这两行,将我们定义的JWT方法加入SpringSecurity的处理流程中。

四:简单测试

下面对我们的程序进行简单的验证:

{

"timestamp": 1567564486909,

"status": 401,

"error": "Unauthorized",

"message": "Full authentication is required to access this resource",

"path": "/users/userList"

}

curl http://localhost:8080/users/userList

原因就是因为这个url没有授权,所以返回401

b1f8ef5a0a982834e0e085de2f937a3c.png

2.注册一个新用户

curl -H "Content-Type: application/json" -X POST -d '{

"username": "admin",

"password": "password"

}' http://localhost:8080/users/signup

aca7ee739d0a67579aee1d7d095a1c12.png

3.登录,会返回token,在http header中,Authorization: Bearer 后面的部分就是token

curl -i -H "Content-Type: application/json" -X POST -d '{

"username": "admin",

"password": "password"

}' http://localhost:8080/login

温馨提醒:这里的login方法是spring specurity框架提供的默认登录url

11b1ed2051aaeb4882b4f9d27976b5f9.png

4.用登录成功后拿到的token再次请求/users/userList接口

4.1将请求中的XXXXXX替换成拿到的token

4.2这次可以成功调用接口了

curl -H "Content-Type: application/json"

-H "Authorization: Bearer XXXXXX"

"http://localhost:8080/users/userList"

cd2e136fbed34cced2c36635ff3bd9a9.png

5.设置了1分钟后Token过期,如果1分钟后再次请求/users/userList接口返回Token过期的异常提示如下图:

dd6ca87b9d9fc1c21aac9dc161de093a.png

五:建议及改进

若您有任何建议,可以通过发送邮件至827358369@qq.com向我反馈。本人承诺,任何

建议都将会被认真考虑,优秀的建议将会被采用,但不保证一定会在当前版本中实现。

587c8534c6749ba204b013fb5efe50dc.png

703fb3639c867ddc61d2f903cbe62294.png

b6d04db974cb87b9ef8b1da8fc9c3cd9.png

温馨提示:这里的登录接口还是使用的默认地址,如果你的token过期了,需要你重新登录生成新的token.

七:联系作者(微信) 18611966723

八:增加了刷新token的机制

5637bf24e04fc2f932ebd353fb728e8c.png

6f1121b097db0440c376c97b22470ea3.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值