「干货」SpringBoot+SpringSecurity+Jwt权限认证-认证

「干货」SpringBoot+SpringSecurity+Jwt权限认证-认证,第1张

启动项目时,SpringBoot自动检索所有带@Configuration的注解,所以就将我们的WebSecurityConfig给加载了,这个config中,我们需要在configure(AuthenticationManagerBuilder auth)方法中注册一个继承自UserDetailsService的接口,这个接口中只有一个方法,那就是使用username获取到数据库中用户信息并返回成UserDetail实体。这个方法需要我们按照我们的不同业务场景重写

WebSecurityConfig

MyUserDetailsService

其实如果去掉上面的将自定义的JWT过滤器加入到过滤链中的话,这个认证过程已经完成了。使用下面的代码就可以调用起整个认证程序。

核心代码

这一行就会将username和password放到认证程序中进行认证。

也就是需要我们自己的逻辑让他去触发这个代码的实现。就可以自动完成认证程序了。就会触发使用username获取到数据库用户信息,然后经过密码加密比对之后会将认证结果返回。

我们整合JWT其实也很简单,其实就是将JWT的登录部分的 *** 作,使用过滤器封装,将该过滤器放到整个认证的过滤链中

SpringSecurity过滤器的配置无非以下几个条件

先解决逻辑上以上三个问题的答案

针对以上解答,下面用代码来做展示(ps:序号依次对应上面)

完成了以上的配置,前台就可以使用/login/user来进行登录 *** 作了。登录成功会返回一个JSON对象来供前端判断成功与否

全部代码奉上,随意写的注释有点多,不看的可以给删掉

用户发起登录请求,服务端创建一个加密后的jwt信息,作为token返回值,在后续请求中jwt信息作为请求头,服务端正确解密后可获取到存储的用户信息,表示验证通过;解密失败说明token无效或者已过期。

加密后jwt信息如下所示,是由分割的三部分组成,分别为Header、Payload、Signature。

eyJhbGciOiJIUzI1NiJ9eyJqdGkiOiJqd3QiLCJpYXQiOjE0NzEyNzYyNTEsInN1YiI6IntcInVzZXJJZFwiOjEsXCJyb2xlSWRcIjoxfSIsImV4cCI6MTQ3MTMxOTQ1MX0vW-pPSl5bU4dmORMa7UzPjBR0F6sqg3n3hQuKY8j35o

Header包含两部分信息,alg指加密类型,可选值为HS256、RSA等等,typ=JWT为固定值,表示token的类型。

{

"alg": "HS256",

"typ": "JWT"

}

Payload是指签名信息以及内容,一般包括iss (发行者), exp (过期时间), sub(用户信息), aud (接收者),以及其他信息,详细介绍请参考官网。

{

"sub": "1234567890",

"name": "John Doe",

"admin": true

}

Signature则为对Header、Payload的签名。

HMACSHA256( base64UrlEncode(header) + "" + base64UrlEncode(payload), secret)

在jwt官网,可以看到有不同语言的实现版本,这里使用的是Java版的jjwt。话不多说,直接看代码,加解密都很简单:

/

创建 jwt

@param id

@param subject

@param ttlMillis

@return

@throws Exception

/

public String createJWT(String id, String subject, long ttlMillis) throws Exception {

SignatureAlgorithm signatureAlgorithm = SignatureAlgorithmHS256 ;

long nowMillis = System currentTimeMillis();

Date now = new Date( nowMillis);

SecretKey key = generalKey();

JwtBuilder builder = Jwts builder()

setId(id)

setIssuedAt(now)

setSubject(subject)

signWith(signatureAlgorithm, key);

if (ttlMillis >= 0){

long expMillis = nowMillis + ttlMillis;

Date exp = new Date( expMillis);

buildersetExpiration( exp);

}

return buildercompact();

}

/

解密 jwt

@param jwt

@return

@throws Exception

/

public Claims parseJWT(String jwt) throws Exception{

SecretKey key = generalKey();

Claims claims = Jwts parser()

setSigningKey( key)

parseClaimsJws( jwt)getBody();

return claims;

}

加解密的key是通过固定字符串转换而生成的;subject为用户信息的json字符串;ttlMillis是指token的有效期,时间较短,需要定时更新。

这里要介绍的token刷新方式,是在生成token的同时生成一个有效期较长的refreshToken,后续由客户端定时根据refreshToken来获取最新的token。浏览器与服务端之间建立sse(server send event)请求,来实现刷新。关于sse在前面博文中有介绍过,此处略过不提。

JWT 其全称为:JSON Web Token,JWT是一个“认证规范”。 简单地说就是 JSON 在 Web 上的一种带签名的标记形式。官方的定义如下:

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties

即:JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。

基于token的鉴权机制类似于>

以上就是关于「干货」SpringBoot+SpringSecurity+Jwt权限认证-认证全部的内容,包括:「干货」SpringBoot+SpringSecurity+Jwt权限认证-认证、如何在Java 中创建和验证JWT、JWT入门 笔记等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9733638.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存