zoukankan      html  css  js  c++  java
  • API权限控制与安全管理

     

     摘自网上

    一、API权限控制范围

    1、首先验证web端请求参数:

    (1)web请求参数:渠道、ServiceName、版本、Airline、时间戳(yyyyMMddhhmmssSSS)、reqXML、Language、签名

           (2)请求不能为空,并且格式是否符合要求

    2、验证渠道+IP是否在白名单中:

        (1)API项目启动时,将API_CHANNEL_INFO表数据,缓存到内存中

    (2)根据Airline+渠道,去内存中取出授权服务器IP列表,并验证请求IP是否在列表中

    3、验证签名:

    (1)Web请求签名规则:Airline+”|”+渠道+”|”+版本+”|”+ServiceName+”|”+Language+”|”+Token+”|”+时间戳+”|”+reqXML

    (2)根据Airline+渠道,去缓存中取出Token,再将Token解密取出来的Token是加密的,需要解密)

    (3)API根据签名规则拼字符串,并用SHA256算法加密,然后验证web传过来的签名和API生成的签名是否一致

    4、验证并发:

    (1)先验证单机总并发量(service级+version的并发)

    (2)再验证(渠道+service+version)的并发

    (3)只做单机并发限制,默认认为每个服务器分的总并发数都是相同的

    5、验证service授权:

          (1)API项目启动时,将service授权表数据,缓存到内存中

    (3)根据Airline+渠道+ServiceName+版本,去内存里数据中取值,如果取到值,并且值中的STATUS状态是可用,才说明该ServiceName有访问权限

    6、登录接口调整:

          (1)判断用户名密码是否正确:密码在数据库里是加盐(盐:账号创建时间),再用sha256算法加密)

    (2)验证成功后,redis里需要存数据(KEY是渠道+userid,对应的值有logintime+lasttime),并设置超时时间(不同的渠道有自己的redis超时时间,超时时间值在API_CHANNEL_INFO表里存放)

    (3)[1]

    7、其它接口调整:

    (1)API入口需要校验请求的接口是否需要校验登录(在Service授权表中存放了每个接口是否需要校验的标识)

    (2)如果接口需要校验登录:要判断userid在redis里是否存在。若不存在,要返回需要登录的提示;若存在,需要更新redis里的lasttime,并且重置超时时间

    (3)如果接口不需要验证登录,但是是已经登录的情况下,也要去重置redis超时时间

    8、备注:

    (1)API需要一个刷缓存接口(刷新所有服务器上的缓存)

    (2)需要RES底层提供API_CHANNEL_INFO、API_SERVICE_AUTH、API_SERVICE_INFO这3个表数据的接口 

    二、数据库

    1、渠道信息表(API_CHANNEL_INFO) 

    AIRLINE

    字符串

    航空公司二字码,如:CA

    CHANNEL

    字符串

    渠道

    CHANNEL_TYPE

    字符串

    渠道类型

    TOKEN

    字符串

    TOKEN

    LOGIN_TIME_OUT

    字符串

    登录超时时间

    REQUEST_SERVER_IP

    字符串

    授权服务器IP列表,多个以;分隔

    注:联合主键是:AIRLINE+CHANNEL

    2、Service授权表(API_SERVICE_AUTH)

    AIRLINE

    字符串

    航空公司二字码,如:CA

    CHANNEL

    字符串

    渠道

    SERVICE_NAME

    字符串

    请求操作类型

    MAX_ASSIGN_NUM

    字符串

    最大并发数

    IS_NEED_LOGIN

    字符串

    请求操作是否需要登录:0或null需要,1不需要

    VERSION

    字符串

    授权版本

    STATUS

    字符串

    状态(0 可用;1 不可用)

    注:联合主键是:AIRLINE+CHANNEL+SERVICE_NAME+VERSION

    3、Service信息表(API_SERVICE_INFO)

    AIRLINE

    字符串

    航空公司二字码,如:CA

    SERVICE_NAME

    字符串

    请求操作类型

    MAX_ASSIGN_NUM

    字符串

    单机最大总并发数

    VERSION

    字符串

    授权版本

    注:联合主键是:AIRLINE+SERVICE_NAME+VERSION



    [1] 删除此条变更。因为:假设两个用户ua(用户名:user、密码:pwd)、ub(用户名:userb、密码:pwdb)。a正常登录系统。但b使用用户名user登录系统,则会登录失败。如果此时删除对应的redis缓存的话,将会把a从系统中删除,而不是b)

  • 相关阅读:
    protobuf(Protocol Buffers)java初体验
    排序(6)---------归并排序(C语言实现)
    JSP/Servlet-----charset 、pageEncoding差别
    [Android] Android开发优化之——对界面UI的优化(2)
    [Android] Android开发优化之——对界面UI的优化(1)
    [Android] Android开发优化之——从代码角度进行优化
    Android开发优化之——对Bitmap的内存优化
    Java 如何有效地避免OOM:善于利用软引用和弱引用
    开源中国源码学习(八)——枚举类
    Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
  • 原文地址:https://www.cnblogs.com/thingk/p/6855987.html
Copyright © 2011-2022 走看看