不少人都想了解java:shiro应用程序——1的话题,本文主要关于shiro身体乳保质期8GH这样的题进行详细的解,希望能帮到大家!
第10章Springboot+Shiro+Jwt前后端分离认证
1.前后端会话分离题
【1】题追踪
之前我们实现了分布式会话缓存,但是我们发现这个功能的实现是基于浏览器的cookie机制。这意味着用户禁用cookie后,我们的系统将遇到其他会话的题。
【2】解决方案
我们的前端可以是Web、Android、iOS等应用程序,同时每个接口都提供无状态的响应方法。在这里我们提供了基于JWT的令牌创建解决方案。
1.用户登录后,获取当前会话的sessionId,根据sessionId使用JWT进行签名,设置过期时间等于会话过期时间,并返回token。2.保存令牌。每当发送请求时,我们都会将其传递到标头中。JwtToken3和ShiroSessionManager继承DefaultWebSessionManager,重写getSessionId方法,检测header中是否传入了JwtToken。如果是,则解码JwtToken并使用JwtToken作为SessionId。4.重写Shiro的默认过滤器,以支持检查jwtToken有效性并返回JSON。支持JwtAuthcFilter:实现是否需要登录的过滤。拒绝时,如果header中有JwtToken,则返回对应的json。JwtPermsFilter:实现资源是否存在。过滤或拒绝时,如果header中有JwtToken,则返回对应的json。JwtRolesFilter:实现是否对该角色进行过滤。拒绝时,如果标头中有JwtToken,则返回相应的json2和JWT摘要。
JWTJSONWebTokens(JWT)是一种轻量级、安全的跨传输格式,它定义了一种紧凑且独立的方式来在不同实体之间安全地传输信息。用于在Web环境中的两个实体之间传输数据的标准。实际发送的是一个字符串。
从广义上讲,JWT是一个标准名称。
狭义上,JWT代表用于传递的令牌字符串。
JWT由三部分组成标头、负载和签名。
标头
保存两个变量
密钥
计算
有效载荷
我们存储了很多东西,基本信息如下
发行者是这个“令牌”所属的用户。通常是用户ID
创建时间,即token被创建的时间
到期时间。令牌过期的会话的过期时间。
唯一标识,通常可以使用算法来生成唯一标识。
签名
它是通过上述两种算法对头部进行加密而创建的,用于比较信息并防止头部和负载被篡改。
然后对这三条信息进行加密以生成JwtToken字符串。该字符串被发送到客户端,客户端将其存储在本地。当客户端发起请求时,可以通过cookie或标头将请求传递到服务器。有效负载内容必须解密才能由服务器验证。
3.智威汤逊集成
【1】Jwt属性
配置类用于支持yaml文件配置
包comitheimashiroconfig;导入lombokData;导入orgspringframeworkbootcontextpropertiesConfigurationProperties;导入javaioSerialized;/说明jw配置文件/DataConfigurationPropertiesprefix=34;公共类JwtProperties实现了可序列化[2]JwtTokenManager。
负责代币发行、分析和验证。
包comitheimashirocoreimpl;导入comauth0jwtJWT;导入comauth0jwtJWTVerifier;导入comauth0jwtalgorithms算法;导入comitheimashiroconfigJwtProperties;导入comitheimashirouutilsEncodesUtil;导入iojsonwebtokenClaims;导入iojsonwebtokenJwtBuilder;导入iojsonwebtokenJwts;导入iojsonwebtoken签名算法;导入组织springframeworkbeansfactoryannotationAutowired;导入组织springframeworkbootcontextEnablePropertiesEnableConfigurationProperties;orgspringframeworkstereotypeService;导入javautilDate;导入javautilHashMap;导入javautilMap;导入javautilUUID;Service34;EnableConfigurationProperties公共类JwtTokenManager很久了毫秒=系统当前时间毫秒;字符串base64EncodedSecretKey=EncodesUtilencodeHexjwtPropertiesgetBase64EncodedSecretKeygetBytes;JwtBuilderbuilder=JwtsbuildersetClaimsclaimssetIdsessionId//2通常为JWT设置唯一标识符。必须是独一无二的。该方法可以生成唯一的标识符。此时保存的是sessionId,登录成功后重写setIssuedAtnewDatenowMillis//1这是将当前系统时间转换为毫秒创建的iat。setSubjectiss//3signWithSignatureAlgorithmHS256为发行者,即JWT是谁,base64EncodedSecretKey;//这是用于生成jwt的算法和密钥。如果ttlMillisgt;=0返回buildercompact;/描述解析令牌参数jwtToken返回令牌/publicClaimsdemoTokenStringjwtToken/描述验证令牌是否合法参数jwtToken返回令牌/publicbooleanisVerifyTokenStringjwtToken4、覆盖DefaultWebSessionManager
ShiroSessionManager主要是从jwtToken中添加jti作为会话的唯一标识符。
包comitheimashirocoreimpl;导入comitheimashiroutilsEmptyUtil;导入iojsonwebtokenClaims;导入orgapacheshirowebservletShiroHttpServletRequest;导入orgapacheshirowebsessionmgtDefaultWebSessionManager;导入orgapacheshirowebutilWebUtils;导入orgspringframeworkbeansfactoryannotationAutowired;导入导入javaxservletServletRequest;导入javaxservletServlet响应;导入javaioSerialized;/描述Jwt会话管理/覆盖publicclassShiroSessionManagerDefaultWebSessionManagerextendsAutowiredJwtTokenManagerjwtTokenManager;覆盖受保护的可序列化getSessionIdServletRequest请求、ServletResponse响应else5.重写默认过滤器
BaseResponse返回统一的json对象。
packagecomitheimashirocorebase;importcomitheimashiroutilsToString;importlombokAllArgsConstructor;importlombokData;/描述基返回包/Datapublic类BaseResponse扩展ToString公共BaseResponseInteger代码,字符串msg,字符串日期。[1]JwtAuthc过滤器
要检查颁发的jwtToken是否合法,请使用wtTokenManagerisVerifyTokenjwtToken,如果拒绝则返回相应的json数据类型。
导入包comitheimashirocorefilter;comalibabafastjsonJSONObje