网站防篡改设备(篡改常识的系统最新章节)

什么是Api接口幂等? 简单来说Api接口幂等在有限的时间内限制接口访问请求,限制ip访问次数,不限制平台访问,都可以拿到数据。一个接口不可以重复表单提交,生产一次消费一次。 用户场景:同一时间重复提交多次请求。 什么是数据篡改? api接口数据篡改,脚本文件,篡改接口参数进行服务器数据窃取,严重的数据篡改会导致数据库宕机,程序软件崩溃。 想到这里都知道后台api接口幂等多重要了吧。今天给大家讲非…

什么是Api接口幂等?

简单来说Api接口幂等在有限的时间内限制接口访问请求,限制ip访问次数,不限制平台访问,都可以拿到数据。一个接口不可以重复表单提交,生产一次消费一次。

用户场景:同一时间重复提交多次请求。

什么是数据篡改?

api接口数据篡改,脚本文件,篡改接口参数进行服务器数据窃取,严重的数据篡改会导致数据库宕机,程序软件崩溃。

想到这里都知道后台api接口幂等多重要了吧。今天给大家讲非对称加密实现后台接口api幂等。

实现思路:jtw+ 验证标识+签名密钥+当前时间戳+存放过期时间+AES 实现加密算法token。

实现步骤:1,用户登录成功后,生产加密token存放redis.

2,下次登录检验token 是否过期,过期请重新登录。

3,用户登录存在有效期,不需要登录。(这里就是单点登录方式)

code核心实现类:


import io.jsonwebtoken.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.stream.Collectors;

@Component
public class JWTTokenUtils {

	public static final String AUTHORIZATION_HEADER = \"x-token\";

	public static final String AUTHORIZATION_TOKEN = \"x-token\";
	private final Logger logger = LoggerFactory.getLogger(JWTTokenUtils.class);
	private static final String AUTHORITIES_KEY = \"auth\";
	private String secretKey; // 签名密钥
	private long tokenValidityInMilliseconds; // 失效日期
	private long tokenValidityInMillisecondsForRememberMe; // (记住我)失效日期

	@PostConstruct
	public void init() {
		this.secretKey = \"isoftstone.huwei\";
		int secondIn1day = 1000 * 60 * 60 * 24;
		this.tokenValidityInMilliseconds = secondIn1day * 2L;
		this.tokenValidityInMillisecondsForRememberMe = secondIn1day * 7L;
	}

	// 创建Token
	public String createToken(Authentication authentication, Boolean rememberMe) {
		String authorities = authentication.getAuthorities().stream() // 获取用户的权限字符串,如 USER,ADMIN
				.map(GrantedAuthority::getAuthority).collect(Collectors.joining(\",\"));
		long now = (new Date()).getTime(); // 获取当前时间戳
		Date validity; // 存放过期时间
		if (rememberMe) {
			validity = new Date(now + this.tokenValidityInMilliseconds);
		} else {
			validity = new Date(now + this.tokenValidityInMillisecondsForRememberMe);
		}
		return SysConst.SYS_COMPANY_HEAD+\".\"+ Jwts.builder() // 创建Token令牌
				.setSubject(authentication.getName()) // 设置面向用户
				.claim(AUTHORITIES_KEY, authorities) // 添加权限属性
				.setExpiration(validity) // 设置失效时间
				.signWith(SignatureAlgorithm.HS512, secretKey) // 生成签名
				.compact();
	}

	// 获取用户权限
	public Authentication getAuthentication(String token) {
		logger.info(\"JWTTokenUtils Start Get User Auth\");
		// 解析Token的payload
		Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();
		Collection<? extends GrantedAuthority> authorities = Arrays
				.stream(claims.get(AUTHORITIES_KEY).toString().split(\",\")) // 获取用户权限字符串
				.map(SimpleGrantedAuthority::new).collect(Collectors.toList()); // 将元素转换为GrantedAuthority接口集合
		User principal = new User(claims.getSubject(), \"\", authorities);
		return new UsernamePasswordAuthenticationToken(principal, null, authorities);
	}
	/**
	 * 解析token获取用户编码
	 * @param token
	 * @return
	 */
	public String getAuthSubject(String token) {
		Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();
		return claims.getSubject();
	}
	
	public String resolveToken(HttpServletRequest request){
        String bearerToken = request.getHeader(AUTHORIZATION_HEADER);         //从HTTP头部获取TOKEN
        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(SysConst.SYS_COMPANY_HEAD)){
            return bearerToken.substring(bearerToken.indexOf(\".\")+1, bearerToken.length());                              //返回Token字符串,去除Bearer
        }
        String jwt = request.getParameter(AUTHORIZATION_TOKEN);               //从请求参数中获取TOKEN
        if (StringUtils.hasText(jwt) && jwt.startsWith(SysConst.SYS_COMPANY_HEAD)) {
            return jwt.substring(bearerToken.indexOf(\".\")+1, jwt.length());
        }
        return null;
    }

	// 验证Token是否正确
	public boolean validateToken(String token) {
		try {
			Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token); // 通过密钥验证Token
			return true;
		}  catch (MalformedJwtException e) { // JWT格式错误
			logger.info(\"Invalid JWT token.\");
			logger.trace(\"Invalid JWT token trace: {}\", e);
		} catch (ExpiredJwtException e) { // JWT过期
			logger.info(\"Expired JWT token.\");
			logger.trace(\"Expired JWT token trace: {}\", e);
		} catch (UnsupportedJwtException e) { // 不支持该JWT
			logger.info(\"Unsupported JWT token.\");
			logger.trace(\"Unsupported JWT token trace: {}\", e);
		} catch (IllegalArgumentException e) { // 参数错误异常
			logger.info(\"JWT token compact of handler are invalid.\");
			logger.trace(\"JWT token compact of handler are invalid trace: {}\", e);
		}catch (SignatureException e) { // 签名异常
			logger.info(\"Invalid JWT signature.\");
			logger.trace(\"Invalid JWT signature trace: {}\", e);
		}
		return false;
	}
}

redis写入缓存:

   RedisModel model = new RedisModel();
   model.setModelName(token);
   model.setModelKey(\"userInfo\");
   Map<String,Object> params = new HashMap<String,Object>();
   params.put(\"userName\", customerDto.getUsername());
   CustomerVo customerVo = new CustomerVo();
   customerVo.setEmail(customerDto.getEmail());
   customerVo.setPhone(customerDto.getPhone());
   CustomerVo userInfo = customerService.queryUserByUserName(customerVo);
   Map<String,Object> userToken = new HashMap<String,Object>();
   userToken.put(\"userToken\", token);
   userToken.put(\"userInfo\", userInfo);
   model.setModelData(userToken);
   model.setTimeoutType(\"M\");
   model.setTimeout(redisTokenTimeOut);
   resultMap.setCode(CommonResultStatus.SUCCESS.getCode());
   resultMap.setMessage(CommonResultStatus.SUCCESS.getMessage());
   //写入为hash实体
   redisTemplate.opsForHash().put(model.getModelName(), model.getModelKey(), model.getModelData());
   redisTemplate.expire(model.getModelName(), model.getTimeout(), TimeUnit.MINUTES);
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
 public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
	public static final String AUTHORIZATION_HEADER = \"x-token\";//Authorization

	//允许访问的路径
	private static final String[] AUTH_WITHOUTLIST = {
			// -- swagger ui
			\"/v2/api-docs\", \"/swagger-resources\", \"/swagger-resources/**\", \"/configuration/ui\",
			\"/configuration/security\", \"/swagger-ui.html\", \"/webjars/**\",
			// other public endpoints of your API may be appended to this array
			\"/druid/**\",\"/health\",\"/info\",\"/info/**\",//druid sql 监听
			\"/hystrix\",\"/hystrix/**\",\"/error\",\"/loggers\",\"/loggers/**\",
			\"/service-registry/instance-status\",\"/hystrix.stream\",\"/turbine/**\",\"/turbine.stream\",
			\"/autoconfig\",\"/archaius\",\"/beans\",\"/features\",\"/configprops\",\"/mappings\",\"/auditevents\",
			\"/env\",\"/env/**\",\"/metrics\",\"/metrics/**\",\"/trace\",\"/trace/**\", \"/dump\",\"/dump/**\", \"/jolokia/**\",
			\"/info/**\",\"/activiti/**\", \"/logfile/**\", \"/refresh\",\"/flyway/**\", \"/liquibase/**\",\"/heapdump\",\"/heapdump/**\",
			\"/v1/authcenter/login\",\"/v1/authcenter/fiberhomeLogin\",\"/v1/authcenter/registered\",//登录URL
			\"/v1/authcenter/queryAuthInfo\",//鉴权URL
			\"/u/sms/sendPhone\",\"/citry/getChineseProvinces\",\"/code/getCaptchaImage\",\"/u/sms/forgetEmailPwd\",
			\"/u/sms/sendEmail\",\"/citry/getOtherCoutryList\",\"/upload/pngDir/*\",\"/job/getJobList\",\"/u/sms/sendLoginEmail\",
			\"/v1/authcenter/queryUserInfoByMap\",\"/v1/authcenter/forgetPwd\",
			\"/diagram-viwmer/**\",\"/editor-marketing/**\",
			\"/modeler.html\",
			\"/actuator/health\"
	};

	@Autowired
	private SecurityUserDetailsService securityUserDetailsService;
	@Autowired
	private AuthLogoutSuccessHandler authLogoutSuccessHandler;
	@Autowired
	private JWTTokenUtils tokenProvider;



	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		//自定义获取用户信息设置密码加密  和默认用DaoAuthenticationProvider加密任选
		auth.userDetailsService(securityUserDetailsService).passwordEncoder(passwordEncoder());
	}

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		// 配置请求访问策略
		// 关闭CSRF、CORS
		http.cors().disable().csrf().disable()
				// 由于使用Token,所以不需要Session
				.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
				// 验证Http请求
				.authorizeRequests()
				// 允许所有用户访问首页 与 登录
				.antMatchers(AUTH_WITHOUTLIST).permitAll()
				// 其它任何请求都要经过认证通过
				.anyRequest().authenticated().and()
				// 用户页面需要用户权限
				// 设置登出
				.logout().logoutSuccessHandler(authLogoutSuccessHandler).permitAll();
		// 添加JWT filter 在
		http.addFilterBefore(new JwtAuthenticationTokenFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class);
	}


//判断是否有权限分三步 
后台security 已经对地址做了拦截了,请求头必须设置请求参数参数
1:判断token是否存在(security 已实现)
2:token是否有效(基于redis) 
3:访问API是否有权限

缓存结构:

[
  \"java.util.HashMap\",
  {
    \"userToken\": \"ISOFTSTONE.eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0MmRkMGJlZmQwNDg0MmMyODhiN2QxZjVkYTcwMWNjNiIsImF1dGgiOiJ1c2VyIiwiZXhwIjoxNjM1MjMyMzk4fQ.9VqMD0vyu-pe42moNd1QeNWP4KrBvvNYJKDQdQPDi_YKKXPG3l90dNn5wgK2rZXs471Pmeby-BdHPHd2-iNKfA\",
    \"userInfo\": [
      \"com.common.vo.CustomerVo\",
      {
        \"id\": \"42dd0befd04842c288b7d1f5da701cc6\",
        \"createTime\": [
          \"java.util.Date\",
          \"2021-06-10\"
        ],
        \"updateTime\": [
          \"java.util.Date\",
          \"2021-06-10\"
        ],
        \"deleted\": 0,
        \"phone\": \"13797004616\",
        \"password\": \"123456\",
        \"email\": \"sunlin@fiberhome.com\",
        \"status\": \"3\",
        \"isEnable\": \"1\",
        \"userType\": \"1\",
        \"roleId\": null,
        \"country\": null,
        \"provinces\": null,
        \"company\": null,
        \"jobs\": null,
        \"realName\": \"孙\",
        \"fiberhomeEmail\": null,
        \"department\": null,
        \"registerWay\": null,
        \"onlineTime\": null,
        \"expireDate\": null,
        \"registerIp\": null,
        \"language\": null,
        \"equipmentType\": null,
        \"accountType\": null,
        \"platformType\": null,
        \"companyType\": null,
        \"userdesc\": null,
        \"userid\": \"0210990342\",
        \"typeConfig\": null,
        \"isActive\": \"1\",
        \"postname\": \"副总经理\",
        \"did1\": \"701387\",
        \"dname1\": \"财务管理部\",
        \"did2\": null,
        \"dname2\": null,
        \"did3\": null,
        \"dname3\": null,
        \"did4\": null,
        \"dname4\": null,
        \"postid\": \"803711\"
      }
    ]
  }
]

接口实现返回:

x-token:ISOFTSTONE.eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0MmRkMGJlZmQwNDg0MmMyODhiN2QxZjVkYTcwMWNjNiIsImF1dGgiOiJ1c2VyIiwiZXhwIjoxNjM1MjMyNTMzfQ.4QzaY_ln-EVukG6Hnbx-mRl2nUB0Eu6jJxIN0KHigzLfqZH7aXt1aId0RhRvS-o5Vf7cVp5jd9cqpkQwfp724A

后台api接口幂等防止数据篡改,看完发现心领神会

请求其他接口访问,加入到请求头Headers里面即可。我们的api接口幂等就实现完成了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年5月6日 上午11:05
下一篇 2022年5月6日 上午11:08

相关推荐

  • 新型商业模式有哪些,三种种常见的商业模式介绍

    俗话说360行,行行出状元,也就是说在我们日常生活中有不低于360种生意,很多人想创业,却不知道做什么,踌躇满志,却又无从下手。其实归根到底,是缺少一套商业模式。商业模式作为中小企业赋能的工具,决定着企业未来的盈利与发展方向。 那么商业模式都有哪些呢?其实把所有的商业模式归类汇总,可以分为六大模式:互联网模式、连锁化模式、直销化模式、金融化模式、投行化模式、国际化模式。 其中,互联网模式、连锁化模…

    2022年9月4日
    1230
  • 余额宝10000元一天收益多少,盘点2020支付宝新规

    众所周知,随着科技不断的发展、网络不断的普及,人们的日常生活可谓是日新月异,但要说到21世纪对人们生活影响最大的是什么?那么肯定就是移动支付的出现了,不仅让我们告别了出门带着沉重的钱包,而且也让大家在家就可以购买到各地的美食、心仪的衣服等,不仅十分的便利,同时安全系数更高。因此,移动支付在我国的普及率已经达到了73%,相当于有超过十亿的人正在使用着移动支付。 说到支付软件,相信大家最常用的就是支付…

    2022年9月3日
    450
  • 大学生网上创业的特点是什么,大学生网上创业成功案例分享

    家具一般实体店经营的比较多,网上经营的较少,可能是因为运费成本或者其他的问题导致了这个问题吧,而下面就是一则靠在网上卖家具致富的案例。 林佐义,他出身于一个贫困的家庭,2007年5月,在众多同学忙着找实习单位时,他却坚定创业信念,刚好手头有08年的学费——1.1万元,就以此作为创业基金,来到顺德乐从开设小型网站建设工作室。 林佐义告诉我们,也许是因为自己性格比较孤僻,担心无法与同事相处融洽;也许是…

    2022年6月18日
    500
  • 小程序和app的设计区别(7种不同类别对比)

    微信小程序推出的时间已经很长了,曾经还因为跳一跳这个小游戏火了一把。而针对微信小程序究竟能不能代替APP,以及替代程度有多高也有不少人进行了分析。从2017年1月9日微信小程序与用户见面到现在已经过去了1年多,这期间小程序的功能日益完善,那么现在小程序和APP相比还有多大的差别呢?本文将带您了解。 一、微信小程序的发展 从百度指数可以清晰的看出微信小程序的发展历程,最高峰出现在2017年1月9日,…

    2022年10月16日
    650
  • yy是什么,看完你就懂了

    模型一:付费用户身份 本文讨论的YY用户源于YY音乐社区和YY直播。 用户身份宏观上可分为观众和主播。YY的运营体系分别赋予这2种身份更丰富的层级关系。 1、观众身份 “观众”的定义,就是观看直播的人。观众的诉求和对应的行为一般包括: 对应以上场景,YY为观众定义了:贵族、守护者、珍爱团粉丝三类付费身份。 贵族: 贵族的付费方式为:首开+续费,按月开通,通过返券的方式刺激续费,首开和续费均有返券。…

    2022年9月17日
    1930
  • 老花镜哪种好(推荐一款实用老花镜)

    U-CLASS优卡诗眼镜是国内眼镜行业领先品牌,秉承健康舒适的设计理念,致力于为人们的眼睛提供最优的佩戴体验和视觉享受。在成功推出UC品牌防蓝光眼镜之后,UC品牌眼镜再度续写辉煌,关爱中老年人的工作和生活,隆重推出UC品牌舒适型防蓝光老花镜。 一则世界卫生组织(WHO)爱眼协会的研究报告最近在网络上不胫而走——研究表明,2006年至2008年,因蓝光辐射每年导致全球超过3万人失明。爱眼协会在200…

    2022年10月25日
    430
  • 淘宝是怎么赚钱的,淘宝平台盈利模式介绍

    淘宝小二角度分享一下,经历过淘宝一步一步成长起来,真的不容易。 要说淘宝的盈利问题,不得不先介绍阿里的奶牛文化,阿里B2B业务在从资本市场(软银等)拿到钱后,用资本市场的钱,把阿里B2B业务养成奶牛(盈利),就开始靠阿里B2B赚来的钱,孵化淘宝网,当时电商巨头eBay如日中天,在中国也是to C的老大,用蚂蚁跟大象对比都不为过,正是淘宝免费策略+阿里B2B这头奶牛的现金投入,淘宝这支蚂蚁雄兵把eB…

    2022年6月27日
    6370
  • 网站建设有多少公司,服务器一键建站工具

    现在的网站不在只是公司的形象展示,更多用于线上运营推广,为企业线上业绩带来前所未有的助力作用!网站建设公司十佳排行榜!网站建设公司制作网站的最佳流程!小编今天就带大家一起共同分享,希望能为大家带来实质性的作用! 网站建设域名的购买 一.域名的购买。 域名都不陌生,就是地址栏里面输入的那一串字母,域名是需要注册购买的,建议域名自己注册购买,不要找代理商,现在的域名注册平台,自己注册一个账号就可以选购…

    2022年6月3日
    460
  • 站长挖词工具有哪些,常用的五个工具推荐

    身为一名站长,了解并熟悉seo优化推广工作中需要使用到seo工具,更能利于seo工作,通过关键词数据将网站排发挥的尽其所长。 近日,我发现有很多刚从事seo工作不久的新人,他们不知如何去寻找网站核心关键词以及如果查询网站收录情况、网站外链、关键词数据分析等等,针对这种情况,在此罗列一些seo辅助工具供大家了解学习,通过了解seo辅助工具可以让你的seo工作更佳轻松便捷。 关键词分析,在网站优化前期…

    2022年9月2日
    520
  • 企业交税是怎么算的,企业缴税计算方法

    一、各种税的计算方式 1、增值税 (1)一般纳税人 应纳税额=销项税额—进项税 销项税额=销售额×税率此处税率为17% 组成计税价格=成本×(1+成本利润率) 组成计税价格=成本×(1+成本利润率)÷(1—消费税税率) (2)进口货物 应纳税额=组成计税价格×税率 组成计税价格=关税完税价格+关税(+消费税) (3)小规模纳税人 应纳税额=销售额×征收率 销售额=含税销售额÷(1+征收率) 2、消…

    2022年8月18日
    510

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信