启动项目时,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入门 笔记等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)