宣传部网站建设策划书,阿里云轻量应用服务器,成都游戏开发,连云港网站优化方案目录用户认证功能的技术选型JWT和Session的区别基于JWT和Session的认证流程基于JWT的认证流程基于Session的认证流程基于JWT和Session的认证的优缺点基于JWT和Session的认证的安全性基于JWT和Session的认证的性能分析基于JWT的一次性和无法废弃基于JWT和Session的认证的续签选择…
目录用户认证功能的技术选型JWT和Session的区别基于JWT和Session的认证流程基于JWT的认证流程基于Session的认证流程基于JWT和Session的认证的优缺点基于JWT和Session的认证的安全性基于JWT和Session的认证的性能分析基于JWT的一次性和无法废弃基于JWT和Session的认证的续签选择JWT功能实现用户认证功能的技术选型 我们要实现用户的认证功能很容易就想到使用JWT或者Session但是我们在确定我们的技术选型之前我们需要了解他们。
JWT和Session的区别 基于JWT和Session的方式的主要区别就是用户状态的保存位置JWT是保存在客户端的而Session是保存在服务端的。
基于JWT和Session的认证流程
基于JWT的认证流程
1、用户在浏览器中输入用户名和密码服务器通过密码校验之后生成一个token并保存到数据库并将这个token返回给前端。 2、前端获取到token将其存储到cookie或者local storage中在后续的请求中都带着这个token信息进行访问。 3、服务器获取token值通过查找数据判断当前的token是否有效。
基于Session的认证流程
1、用户在浏览器输入用户名和密码服务器通过密码校验之后生成一个session保存到数据库。 2、服务器为用户生成一个sessionId并将具有sessionId的cookie放置在用户浏览器中在后续的请求中都带这个cookie信息进行访问。 3、服务器获取cookie通过获取cookie中的sessionId查找数据库判断当前请求是否有效。
基于JWT和Session的认证的优缺点
JWT保存在客户端在分布式环境下不需要做额外的工作。Session保存在服务器在分布式环境下需要实现多台机器共享Session,并且一般都需要结合Cookie实现认证所以需要浏览器支持cookie所以移动端无法使用session认证方案。
基于JWT和Session的认证的安全性
JWT是使用base64编码的因此在JWT中不能存在敏感数据。如果在JWT中存储了敏感信息可以解码出来是非常的不安全比如用户的密码。Session的信息是保存在服务器的相对来说更安全。
基于JWT和Session的认证的性能分析
经过编码之后的JWT是一个非常长的字符串由于cookie的限制大小一般是4Kcookie很有可能放不下所以JWT一般放在客户端的local storage里面。并且用户在系统中的每一次http请求请求都会把JWT携带在Header里面HTTP请求的Header可能比Body还有大。SessionId只是很短的一个字符串所以JWT的HTTP请求比使用Session的开销大很多。
基于JWT的一次性和无法废弃
JWT是一次性的想要修改里面的内容只能重新生成一个JWT。 生成的一个JWT在到过期之后就会始终有效无法中途废弃。如果想中途废弃一种常用的处理手段就是结合redis。
基于JWT和Session的认证的续签
Session的有效时间一般是30分钟如果在30分钟内有访问有效期会被刷新致30分钟。 而如果我们要改变JWT的有效时间有两种方式 1、最简单的一种方式是每次请求刷新JWT即每个HTTP请求都返回一个新的JWT。这个方法不仅暴力不优雅而且每次请求都要做JWT的加密解密会带来性能问题。 2、我们可以在Redis中单独为每个JWT设置过期时间每次访问的时候刷新JWT的过期时间。 选择
我投JWT一票JWT有很多缺点但是JWT在分布式环境下不需要像Session一样额外实现多机数据共享不需要额外的工作使用JWT不香吗且JWT一次性的缺点可以结合redis进行弥补。
JWT功能实现
JWT所需依赖
public class JWTUtil {private static final Logger logger LoggerFactory.getLogger(JWTUtil.class);//私钥private static final String TOKEN_SECRET 123456;/*** 生成token自定义过期时间 毫秒** param userTokenDTO* return*/public static String generateToken(UserTokenDTO userTokenDTO) {try {// 私钥和加密算法Algorithm algorithm Algorithm.HMAC256(TOKEN_SECRET);// 设置头部信息MapString, Object header new HashMap(2);header.put(Type, Jwt);header.put(alg, HS256);return JWT.create().withHeader(header).withClaim(token, JSONObject.toJSONString(userTokenDTO))//.withExpiresAt(date).sign(algorithm);} catch (Exception e) {logger.error(generate token occur error, error is:{}, e);return null;}}/*** 检验token是否正确** param token* return*/public static UserTokenDTO parseToken(String token) {Algorithm algorithm Algorithm.HMAC256(TOKEN_SECRET);JWTVerifier verifier JWT.require(algorithm).build();DecodedJWT jwt verifier.verify(token);String tokenInfo jwt.getClaim(token).asString();return JSON.parseObject(tokenInfo, UserTokenDTO.class);}
}说明
生成的token中不带有过期时间token的过期时间由redis进行管理。UserTokenDTO中不带有敏感信息如password字段不会出现在token中。
Redis工具类
public final class RedisServiceImpl implements RedisService {/*** 过期时长*/private final Long DURATION 1 * 24 * 60 * 60 * 1000L;Resourceprivate RedisTemplate redisTemplate;private ValueOperationsString, String valueOperations;PostConstructpublic void init() {RedisSerializer redisSerializer new StringRedisSerializer();redisTemplate.setKeySerializer(redisSerializer);redisTemplate.setValueSerializer(redisSerializer);redisTemplate.setHashKeySerializer(redisSerializer);redisTemplate.setHashValueSerializer(redisSerializer);valueOperations redisTemplate.opsForValue();}Overridepublic void set(String key, String value) {valueOperations.set(key, value, DURATION, TimeUnit.MILLISECONDS);log.info(key{}, value is: {} into redis cache, key, value);}Overridepublic String get(String key) {String redisValue valueOperations.get(key);log.info(get from redis, value is: {}, redisValue);return redisValue;}Overridepublic boolean delete(String key) {boolean result redisTemplate.delete(key);log.info(delete from redis, key is: {}, key);return result;}Overridepublic Long getExpireTime(String key) {return valueOperations.getOperations().getExpire(key);}
}业务实现
登陆功能
public String login(LoginUserVO loginUserVO) {//1.判断用户名密码是否正确UserPO userPO userMapper.getByUsername(loginUserVO.getUsername());if (userPO null) {throw new UserException(ErrorCodeEnum.TNP1001001);}if (!loginUserVO.getPassword().equals(userPO.getPassword())) {throw new UserException(ErrorCodeEnum.TNP1001002);}//2.用户名密码正确生成tokenUserTokenDTO userTokenDTO new UserTokenDTO();PropertiesUtil.copyProperties(userTokenDTO, loginUserVO);userTokenDTO.setId(userPO.getId());userTokenDTO.setGmtCreate(System.currentTimeMillis());String token JWTUtil.generateToken(userTokenDTO);//3.存入token至redisredisService.set(userPO.getId(), token);return token;
}说明
判断用户名密码是否正确。用户名密码正确则生成token。将生成的token保存至redis。
登出功能
public boolean loginOut(String id) {boolean result redisService.delete(id);if (!redisService.delete(id)) {throw new UserException(ErrorCodeEnum.TNP1001003);}return result;
}将对应的key删除即可
更新密码功能
public String updatePassword(UpdatePasswordUserVO updatePasswordUserVO) {//1.修改密码UserPO userPO UserPO.builder().password(updatePasswordUserVO.getPassword()).id(updatePasswordUserVO.getId()).build();UserPO user userMapper.getById(updatePasswordUserVO.getId());if (user null) {throw new UserException(ErrorCodeEnum.TNP1001001);}if (userMapper.updatePassword(userPO) ! 1) {throw new UserException(ErrorCodeEnum.TNP1001005);}//2.生成新的tokenUserTokenDTO userTokenDTO UserTokenDTO.builder().id(updatePasswordUserVO.getId()).username(user.getUsername()).gmtCreate(System.currentTimeMillis()).build();String token JWTUtil.generateToken(userTokenDTO);//3.更新tokenredisService.set(user.getId(), token);return token;
}说明
更新用户密码时需要重新生成新的token并将新的token返回给前端由前端更新保存在local storage中的token同时更新存储在redis中的token这样实现可以避免用户重新登陆用户体验感不至于太差。
拦截器类
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception {String authToken request.getHeader(Authorization);String token authToken.substring(Bearer.length() 1).trim();UserTokenDTO userTokenDTO JWTUtil.parseToken(token);//1.判断请求是否有效if (redisService.get(userTokenDTO.getId()) null || !redisService.get(userTokenDTO.getId()).equals(token)) {return false;}//2.判断是否需要续期if (redisService.getExpireTime(userTokenDTO.getId()) 1 * 60 * 30) {redisService.set(userTokenDTO.getId(), token);log.error(update token info, id is:{}, user info is:{}, userTokenDTO.getId(), token);}return true;
}说明拦截器中主要做两件事一是对token进行校验二是判断token是否需要进行续期
token校验
判断id对应的token是否不存在不存在则token过期若token存在则比较token是否一致保证同一时间只有一个用户操作
token自动续期 为了不频繁操作redis只有当离过期时间只有30分钟时才更新过期时间。
拦截器配置类
Configuration
public class InterceptorConfig implements WebMvcConfigurer {Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(authenticateInterceptor()).excludePathPatterns(/logout/**).excludePathPatterns(/login/**).addPathPatterns(/**);}Beanpublic AuthenticateInterceptor authenticateInterceptor() {return new AuthenticateInterceptor();}
} 文章转载自: http://www.morning.kqbjy.cn.gov.cn.kqbjy.cn http://www.morning.lfcfn.cn.gov.cn.lfcfn.cn http://www.morning.bzcjx.cn.gov.cn.bzcjx.cn http://www.morning.fqqcd.cn.gov.cn.fqqcd.cn http://www.morning.rgpbk.cn.gov.cn.rgpbk.cn http://www.morning.bqqzg.cn.gov.cn.bqqzg.cn http://www.morning.lsnhs.cn.gov.cn.lsnhs.cn http://www.morning.xltwg.cn.gov.cn.xltwg.cn http://www.morning.qtrlh.cn.gov.cn.qtrlh.cn http://www.morning.thpns.cn.gov.cn.thpns.cn http://www.morning.xkhhy.cn.gov.cn.xkhhy.cn http://www.morning.xjkfb.cn.gov.cn.xjkfb.cn http://www.morning.gcrlb.cn.gov.cn.gcrlb.cn http://www.morning.ddzqx.cn.gov.cn.ddzqx.cn http://www.morning.jxhlx.cn.gov.cn.jxhlx.cn http://www.morning.wyrkp.cn.gov.cn.wyrkp.cn http://www.morning.xtyyg.cn.gov.cn.xtyyg.cn http://www.morning.hnhkz.cn.gov.cn.hnhkz.cn http://www.morning.bpmfz.cn.gov.cn.bpmfz.cn http://www.morning.leboju.com.gov.cn.leboju.com http://www.morning.yqzyp.cn.gov.cn.yqzyp.cn http://www.morning.bphqd.cn.gov.cn.bphqd.cn http://www.morning.rpdmj.cn.gov.cn.rpdmj.cn http://www.morning.grtwn.cn.gov.cn.grtwn.cn http://www.morning.zkzjm.cn.gov.cn.zkzjm.cn http://www.morning.lqypx.cn.gov.cn.lqypx.cn http://www.morning.pmmrb.cn.gov.cn.pmmrb.cn http://www.morning.nqnqz.cn.gov.cn.nqnqz.cn http://www.morning.easiuse.com.gov.cn.easiuse.com http://www.morning.rhkgz.cn.gov.cn.rhkgz.cn http://www.morning.jzbjx.cn.gov.cn.jzbjx.cn http://www.morning.qfnrx.cn.gov.cn.qfnrx.cn http://www.morning.ljpqy.cn.gov.cn.ljpqy.cn http://www.morning.rhph.cn.gov.cn.rhph.cn http://www.morning.qnsmk.cn.gov.cn.qnsmk.cn http://www.morning.kphsp.cn.gov.cn.kphsp.cn http://www.morning.rrpsw.cn.gov.cn.rrpsw.cn http://www.morning.dpppx.cn.gov.cn.dpppx.cn http://www.morning.mjjty.cn.gov.cn.mjjty.cn http://www.morning.xnpml.cn.gov.cn.xnpml.cn http://www.morning.rkqkb.cn.gov.cn.rkqkb.cn http://www.morning.zlsmx.cn.gov.cn.zlsmx.cn http://www.morning.pakistantractors.com.gov.cn.pakistantractors.com http://www.morning.pjrql.cn.gov.cn.pjrql.cn http://www.morning.qnwyf.cn.gov.cn.qnwyf.cn http://www.morning.dkgtr.cn.gov.cn.dkgtr.cn http://www.morning.zbnts.cn.gov.cn.zbnts.cn http://www.morning.bnlsd.cn.gov.cn.bnlsd.cn http://www.morning.wgzzj.cn.gov.cn.wgzzj.cn http://www.morning.mynbc.cn.gov.cn.mynbc.cn http://www.morning.zqcgt.cn.gov.cn.zqcgt.cn http://www.morning.qsxxl.cn.gov.cn.qsxxl.cn http://www.morning.yxshp.cn.gov.cn.yxshp.cn http://www.morning.xmnlc.cn.gov.cn.xmnlc.cn http://www.morning.zxznh.cn.gov.cn.zxznh.cn http://www.morning.mxmdd.cn.gov.cn.mxmdd.cn http://www.morning.qlrtd.cn.gov.cn.qlrtd.cn http://www.morning.mczjq.cn.gov.cn.mczjq.cn http://www.morning.flxqm.cn.gov.cn.flxqm.cn http://www.morning.jtmrx.cn.gov.cn.jtmrx.cn http://www.morning.rgsgk.cn.gov.cn.rgsgk.cn http://www.morning.jqjnl.cn.gov.cn.jqjnl.cn http://www.morning.ckzjl.cn.gov.cn.ckzjl.cn http://www.morning.clpkp.cn.gov.cn.clpkp.cn http://www.morning.nkjnr.cn.gov.cn.nkjnr.cn http://www.morning.jpbky.cn.gov.cn.jpbky.cn http://www.morning.ltkms.cn.gov.cn.ltkms.cn http://www.morning.sxfnf.cn.gov.cn.sxfnf.cn http://www.morning.ndltr.cn.gov.cn.ndltr.cn http://www.morning.rszyf.cn.gov.cn.rszyf.cn http://www.morning.rmdsd.cn.gov.cn.rmdsd.cn http://www.morning.bnpn.cn.gov.cn.bnpn.cn http://www.morning.smdiaosu.com.gov.cn.smdiaosu.com http://www.morning.xcxj.cn.gov.cn.xcxj.cn http://www.morning.zsfooo.com.gov.cn.zsfooo.com http://www.morning.srgwr.cn.gov.cn.srgwr.cn http://www.morning.lnckq.cn.gov.cn.lnckq.cn http://www.morning.tnmmp.cn.gov.cn.tnmmp.cn http://www.morning.fphbz.cn.gov.cn.fphbz.cn http://www.morning.ykbgs.cn.gov.cn.ykbgs.cn