spring security和jwt整合的方法是什么


这篇文章主要介绍了spring security和jwt整合的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇spring security和jwt整合的方法是什么文章都会有所收获,下面我们一起来看看吧。json web token (JWT),是为了在网络环境中传递声明而设计的一种基于JSON的开放标准(RFC 7519),该token 被设计为紧凑且安全的.特别使用于分布式站点的登陆(SSO)
场景.JWT一般被用来在服务提供者和服务认证者之间传递身份信息,以便可以从服务器获取资源.也可以增加一些额外的其它业务逻辑所必需的声明信息.
该token可直接被用于认证,也可用于被加密.基于token的鉴权机制也是类似于http协议无状态的,它不需要在服务段保留用户的认证信息或者鉴权信息.这就意味着基于token认证机制的用户就不必考虑在哪一台服务器登录了.
这就为应用的扩展提供了遍历.认证流程:这个token必须在每次请求时传递给服务端,它应该保存在请求头里面.另外,服务器端要支持 CORS(跨来源资源共享策略) ,一般我们在服务器上这么做就可以了, Access-Control-Allow-Origin: *jwt的三个组成部分共同构成了一个 签名信息 signature**这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串.
然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。**注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,
所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。一般是在请求头里加入Authorization,并加上Bearer标注:如下:我们之前介绍过,Spring security是基于过滤器(Filter)的,使用过滤器我们可以很容易的拦截某些请求.
因此通过上面对jwt的了解,我们就可以在过滤器中处理token的生成和校验.大致流程如下:1.当用户进行提交登陆表单时,自定义一个拦截器JWTLoginFilter进行表单参数的获取.2.验证提交的用户名密码是否正确.3.如果登陆成功,使用jwt颁发一个token给客户端,之后的客户端请求都要带上这个token.4.token验证:再自定义一个过滤器JWTAuthenticationFilter,当用户访问需要认证的请求时,拦截该请求,并进行token校验.我们为了简化开发使用spring boot进行项目的快速搭建.需要引入如下依赖:之后我们创建一个controller进行不同级别的验证.接下来就是配置我们的安全管理类 SecurityConfig :可以看到我们的Security继承了 WebSecurityConfigurerAdapter ,关于WebSecurityConfigurerAdapter我们之前的文章已经介绍过,
我们重点关注的是重载的两个 configure() 方法.configure(HttpSecurity http): 这个方法配置了对请求的拦截配置,在这里我们又添加了两个自定义的过滤器,JWTLoginFilter 和JWTAuthenticationFilter,
分别负责登录时用户名密码的验证,和拦截请求时对token的验证.configure(AuthenticationManagerBuilder auth): 这个方法有点奇怪,我们并没有使用之前介绍几种的用户存储,而是使用了一个authenticationProvider()
方法,并传入了一个我们自定义的 AuthenticationProvider 类型的对象作为参数.稍后我们会详细介绍这个类到底是什么.我们可以看到 JWTLoginFilter 继承了 UsernamePasswordAuthenticationFilter,
并且重写了它的 attemptAuthentication() 方法和 successfulAuthentication() 方法.在 attemptAuthentication()方法中,我们就可以得到 /login 提交的用户名和密码信息,但这里我们并没有返回一个认证后的 Authentication,
这是为什么呢?原因就在于,我们在 SecurityConfigure 的方法中,使用了一个自定义的 AuthenticationProvider 实现类,如:那么 AuthenticationProvider 用来干嘛的呢? 查看他的源码可以发现:AuthenticationProvider(身份验证提供者) 顾名思义,可以提供一个 Authentication 供Spring Security的上下文使用.通过 supports 方法我们对特定的 Authentication进行认证,如果返回 true,就交给 authenticate(Authentication authentication) 方法,
此方法一个完全经过身份验证的对象,包括凭证。如下我们自定义的 CustomAuthenticationProvider:
*如果这个AuthenticationProvider支持指定的身份验证对象,那么返回true。
*返回true并不能保证身份验证提供者能够对身份验证类的实例进行身份验证。
*它只是表明它可以支持对它进行更深入的评估。身份验证提供者仍然可以从身份验证(身份验证)方法返回null,
*以表明应该尝试另一个身份验证提供者。在运行时管理器的运行时,可以选择具有执行身份验证的身份验证提供者。
*
*@paramauthentication
*@return
@Override
publicbooleansupports(Class>authentication){
returnauthentication.equals(UsernamePasswordAuthenticationToken.class);
}

/**
*验证登录信息,若登陆成功,设置Authentication
*
*@paramauthentication
*@return一个完全经过身份验证的对象,包括凭证。
*如果AuthenticationProvider无法支持已通过的身份验证对象的身份验证,则可能返回null。
*在这种情况下,将会尝试支持下一个身份验证类的验证提供者。
*@throws
@Override
publicAuthenticationauthenticate(Authenticationauthentication)throwsAuthenticationException{
//获取认证的用户名&密码
Stringusername=authentication.getName();
Stringpassword=authentication.getCredentials().toString();

//通过用户名从数据库中查询该用户
UserDetailsuserDetails=userDetailsService.loadUserByUsername(username);

//判断密码(这里是md5加密方式)是否正确
StringdbPassword=userDetails.getPassword();
StringencoderPassword=DigestUtils.md5DigestAsHex(password.getBytes());

if(!dbPassword.equals(encoderPassword)){
thrownewUsernameIsExitedException(“密码错误”);
}

//还可以从数据库中查出该用户所拥有的权限,设置到authorities中去,这里模拟数据库查询.
ArrayListauthorities=newArrayList();
authorities.add(newGrantedAuthorityImpl(“ADMIN”));

Authenticationauth=newUsernamePasswordAuthenticationToken(username,password,authorities);

return可见我们在这个 AuthenticationProvider 中对 UsernamePasswordAuthenticationToken 进行认证,在 authenticate(Authentication authentication)方法中, authentication 就是 我们之前返回的 UsernamePasswordAuthenticationToken,我们可以得到登陆的用户名和密码,进行真正的认证.如果认证成功 就给改 UsernamePasswordAuthenticationToken 设置对应的权限,最后把已经认证的 UsernamePasswordAuthenticationToken 返回即可.还有我们在通过用户名从数据库查找用户时,返回了一个 UserDetails 对象,关于UserdDetails对象,我们之前的文章已经介绍过,不懂得可以去查看一下.最后,当 CustomAuthenticationProvider 认证成功之后,JWTLoginFilter 中的 successfulAuthentication() 方法机会执行,因此我们就可以在这里设置token了,如下:我们使用JWT构造了一个token字符串,并把它放在了http请求头中返回给了客户端.至此我们的登陆认证并返回 token就已经完成了,接下来就是客户端携带这已经获得token访问需要认证的资源时,我们需要对改token进行验证了.由此可以看到 JWTAuthenticationFilter 继承了 BasicAuthenticationFilter,BasicAuthenticationFilter 用来处理一个HTTP请求的基本授权标头,将结果放入安全上下文。
总之,这个过滤器负责处理任何具有HTTP请求头的请求的请求,以及一个基本的身份验证方案和一个base64编码的用户名:密码令牌。
如果身份验证成功,那么最终的身份验证对象将被放入安全上下文。因此我们就可以继承 BasicAuthenticationFilter 并重写 doFilterInternal()方法,在该方法中进行token的验证,如果验证成功,将结果放入安全上下文,如:到此,我们就使用Spring Security + JWT ,搭建了一个安全的 resultful api ,接下来我们就进行简单的测试,这里我是用postman,这是一个非常好用的 http 调试工具.
我们现在数据库的users表中插入一条用户信息,用户名:itguang免费云主机域名 密码: 123456,接下来,打开post满,访问 localhost/login?username=itguang&password=123456如下:我们可以看到响应头中多了一个token
properties
token →Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJpdGd1YW5nIiwiZXhwIjoxNTE0OTU2NjI3fQ.PIiH7dRrVgPc88kOPtGzvrqZf5l87FRe3h7s9YZVb2zkL_XwRc_v3uhn23bmKqu7G0pSZngdnX0rh_kT1YDwww

这就是我们使用jwt生成的token,现在是加密状态,接下来我们再访问 localhost/admin ,并把这个token放到 请求头中,如下:会看到返回了正确的字符串,但是如果我们不带该token值呢?浏览器访问: http://localhost/admin ,会发现403,明显的没有权限禁止访问,这正是我们想要的结果.关于“spring security和jwt整合的方法是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“spring security和jwt整合的方法是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。

相关推荐: 怎么用vue监听屏幕尺寸变化

今天小编给大家分享一下怎么用vue监听屏幕尺寸变化的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.首先,新建一个html项目,并在项目中引入v…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/12 18:43
下一篇 02/12 18:43

相关推荐