交通信息資源平臺-接口授權(quán)與鑒權(quán)詳細設(shè)計-v1.0(20160413)_第1頁
交通信息資源平臺-接口授權(quán)與鑒權(quán)詳細設(shè)計-v1.0(20160413)_第2頁
交通信息資源平臺-接口授權(quán)與鑒權(quán)詳細設(shè)計-v1.0(20160413)_第3頁
交通信息資源平臺-接口授權(quán)與鑒權(quán)詳細設(shè)計-v1.0(20160413)_第4頁
交通信息資源平臺-接口授權(quán)與鑒權(quán)詳細設(shè)計-v1.0(20160413)_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、編號:ehl-ep-rd-0a1密級:交通信息資源平臺接口授權(quán)與鑒權(quán)詳細設(shè)計vi. 0擬制人: 胡綱飛審核人:批準(zhǔn)人:2016 年 03 月 28 日北京易華錄信息技術(shù)股份有限公司文件變更記錄變更類型:*a -增加m 修訂d 刪除版本號日期變更類型修改人摘要審核人備注v0. 82016/03/28a張雷元,張韌,胡綱飛創(chuàng)建交通信息資源平臺接口授權(quán)與鑒權(quán)詳細設(shè)計vi. 02016/4/11m徐立峰、張韌修改數(shù)據(jù)庫設(shè)計表,調(diào)整申請表與訪問授權(quán)表目錄1資源平臺授權(quán)流程12授權(quán)功能設(shè)計22.1功能設(shè)計22.1.1授權(quán)管理22.1.1.1接口使用中請22.1.1.1.1原型設(shè)計22.1.1.1.2功能操

2、作設(shè)計22.1.1.2接口申請審核32.1.1.2.1原型設(shè)計32.1.1.2.2功能操作設(shè)計42.1.2參數(shù)配置42.1.2.1接口標(biāo)識配置42.1.2.1.1原型設(shè)計42.1.2.1.2功能操作設(shè)計52.2數(shù)據(jù)庫設(shè)計52.2.1 外掛接口 申請表(t_ims_appwform) 52.2.2 外部接口定義表(t_ims_info) 62.2.3外部接口訪問授權(quán)表(t_ims_permit) 72.2.4本地接口訪問控制表(暫時不用考慮)83鑒權(quán)功能設(shè)計84附錄134.1授權(quán)碼生成規(guī)則(無錫所提供)134.2基礎(chǔ)應(yīng)用系統(tǒng)接口說明191資源平臺授權(quán)流程現(xiàn)由于本次共同開發(fā)的平臺的部局端尚未實現(xiàn),

3、所以采用接口授權(quán)功能在當(dāng)?shù)刭Y源平 臺(易華錄)上實現(xiàn),流程大致如下:1)廠商在資源平臺填寫接口申請信息2)當(dāng)?shù)刭Y源平臺的系統(tǒng)管理員審核后,生成接口訪問控制信息3)廠商可以在“接口使用授權(quán)查詢"頁面,查詢到j(luò)kxlh (接口序列號)授權(quán)系統(tǒng)流程圖階段階段接口方法實現(xiàn)射一接口標(biāo)識配置調(diào)用接口提供接口標(biāo)識信息接口申請打印授權(quán)碼圖1.12授權(quán)功能設(shè)計2.1功能設(shè)計2.1.1授權(quán)管理2.1.1.1接口使用申請2016.04.11 星期一 ©疫權(quán)哉6接口使用申遣6接口 3?核康請6孩標(biāo)識配查調(diào)用疚件開發(fā)單位:易華錄調(diào)用炊件開發(fā)單位易華泉無場所謁用早位無塔支隊無錫支隊ip范國記錄狀態(tài)序列

4、號127 0 0 1-127.0 0 255127 0 0.1,127.0 0 5,127 0 0 204未生成序列號xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx圖2.1調(diào)用軟件開發(fā)單位:易華錄使用單位:總隊ip:)ip 范圍ip列表127.0 0.1至127.0.255.255使用起止時間:至系統(tǒng)功能描述:使用接口列表:84c01; 84c02提交 | 關(guān)閉 |圖2.1.ll2功能操作設(shè)計o接口標(biāo)識接口名稱訪問次數(shù)限制狀態(tài)84c01交通流監(jiān)測設(shè)備狀態(tài) 信息-1啟用84c02檢刪器1分鐘原始數(shù)據(jù)-1啟用72c02實肘過車記錄信息200信用(1)通過調(diào)用軟件開發(fā)單位可查詢出所有申

5、請的調(diào)用方,輸出列表:調(diào)用軟件開發(fā)單位、調(diào)用單位、ip范圍、記錄狀態(tài)、序列號,如圖2.1(2)圖2.2為新增申請頁面輸入項:調(diào)用軟件開發(fā)單位、調(diào)用單位、ip、使用起止時間、系統(tǒng)功能描述、使用接 口列表;輸入項說明:調(diào)用軟件開發(fā)單位,必填項,數(shù)據(jù)來源是從無錫所廠家表同步過來的數(shù)據(jù);調(diào)用單位,必填項,為機構(gòu)表的數(shù)據(jù); ip,必填項,分兩種選擇:ip范圍和ip列表,入庫規(guī)則為范圍用“”分隔, 列表用“;"分隔,如 127.0.0.1 127.0.1.255, 127.0.0.1; 127.0.0.5; 127.0.0.7起始時間,必填項; 使用接口列表,必填項,數(shù)據(jù)來源tjmsjnfo,點

6、擊文本框彈出右側(cè)接口 列表。(3)編輯功能分為兩種:未生成序列號與己生成已生成序列號:在編輯頁面中,調(diào)用軟件開發(fā)單位、使用單位為不可編輯狀態(tài); 編輯保存后,將sqlx字段更新為2;2.l1.2接口申請審核2.1.1.2.1原型設(shè)計2016.04.11®offintfiu中請參致配置j殖口審核由甫管理調(diào)用軟件開發(fā)單位:易華柔調(diào)用牧件開發(fā)畢位易華景無愕所調(diào)用畢位無螺支隊無螺支從ip范園127 0 0 1-127 0 0 255127 0 0 1 127 00 5 127 00204iff南核南核圖2.3127 0.0 1至 127.0 256255使用起止時間:至系統(tǒng)功能插述:84c01

7、; 84c02使用接口列表:審核狀態(tài):接口標(biāo)識接口名稱訪問次數(shù)限制狀態(tài)84c01交通流監(jiān)測設(shè)備狀態(tài) 信息-1啟用84c02檢瑚器1分鐘原始數(shù)據(jù)-1啟用72c02實時過車記錄信息200啟用申核意見:同意不同意提交關(guān)閉圖2.42.1.l2.2功能操作設(shè)計(1) 通過調(diào)用軟件開發(fā)單位可查詢出所有申請的調(diào)用方,輸出列表:調(diào)用軟件開發(fā) 單位、調(diào)用單位、ip范圍,如圖2.3(2) 圖2.4為審核頁面輸入項:審核狀態(tài)、審核意見,其他項為只讀屬性;。(3) 審核通過后,生成授權(quán)碼(序列號),生成規(guī)則參考4.12.1.2參數(shù)配置2.1.2.1接口標(biāo)識配置2.1.2.1.1原型設(shè)計2016.04.11©

8、©ewes6接口侵用中請6接口末核康語圖2.52.1.2.1.2功能操作設(shè)計(1)通過接口標(biāo)識、接口名稱(支持模糊查詢)可查詢出所有接口標(biāo)識列表,輸出 列表:接口標(biāo)識、接口名稱、訪問限制次數(shù)、狀態(tài)、封裝類、實現(xiàn)方法,如圖2.1(2)點擊新增按鈕后,在列表中新增一行輸入項:接口標(biāo)識、接口名稱、訪問限制次數(shù)、狀態(tài)、封裝類、實現(xiàn)方法; 輸入項說明:接口標(biāo)識,必填項,由實現(xiàn)接口的公司提供;接口名稱,必填項; 訪問限制次數(shù),必填項,1表示不限制,必須為數(shù)字封裝類,調(diào)用接口映射的class; 實現(xiàn)方法,調(diào)用接口映射的實現(xiàn)方法。(3)點擊編輯,可以對列表中的結(jié)果直接修改并保存。2.2數(shù)據(jù)庫設(shè)計2.

9、2.1 外掛接口 申請表(t_ims_applyform),序號字段編碼字段名稱類型是否為空備注1xtlb系統(tǒng)類別varchar2(2)no枚舉字典2azdm安裝點代碼varchar2(6)no3dyrjkfdw調(diào)用軟件開發(fā)單位varchar2(12)no關(guān)聯(lián)廠商表id,與無錫所同步4dyzdw調(diào)用者單位varciiar2(12)noid,用戶單位,如支隊、大隊,關(guān)聯(lián)部門表id5kfwjk可訪問接口varchar2(2000)no6ipipvarchar2(2000)no、表示范圍,如127.0.0.廣127. 0. 0. 255;“;"表示ip集合,如127.0.0.1; 127.

10、0.0.27jkqsrq調(diào)用者起始ii期dateno8jkjzrq調(diào)用者截止日期dateno9sqlx申請類型char (1)yes1:新申請,2:調(diào)整申請10jlzt記錄狀態(tài)char(l)yes0:未生成序列號,1:已生成序列號,2:不同意11gxsj更新時間dateno12bz備注varchar2(4000)yes13spyj審批意見varchar2(500)yes注:聯(lián)合主鍵:xtlb+azdm+ dyrjkfdw+ dyzdw1. azdm(安裝點代碼):可以先寫死,為當(dāng)?shù)氐男姓^(qū)劃2. dyrjkfdw (調(diào)用軟件開發(fā)單位):訪問公安網(wǎng)平臺廠商表3. kfwjk (可訪問接口):為一

11、組接口信息json字符串,解決廠商與接口多對多的關(guān)系kfwjk示例如下:'60w01': ' jkmc': '非現(xiàn)場違法待篩選寫入接口 ','gpfwcsxz' :, zt' : t,60w02 : 'jkmc': '非現(xiàn)場違法待審核寫入接 口 ', gpfwcsxz': t ,、zt' : t,' 63q01 : ' jkmc' :' 客運車輛信息核查接口gpfwcsxz : 't , ' zt : t 4. 同一個廠家,一個

12、調(diào)用單位,一個系統(tǒng)分配一個授權(quán)碼。2.2.2外部接口定義表(t_ims_info)序號字段編碼字段名稱類型是否為空備注1jkid接口 idvarchar2(5)no由系統(tǒng)類別+一位級別代 碼+兩位接曰順序號組成 (參照監(jiān)管系統(tǒng)),c:支隊、 b:總隊,a:部局,如01a01 代表機動車部局端提供的 接口2jkmc接口名稱varchar2(128)no3xtlb系統(tǒng)類別varchar2(2)no枚舉字典4jkzt接口狀態(tài)varchar2(1)no1:啟用,0:未啟用5jklb接口類別varchar2(1)no1:寫入接口,2:查詢接口6fzl封裝類varchar2(500)yes接口映射的cla

13、ss類7sxl實現(xiàn)方法varchar2(500)yes實現(xiàn)接口的具體方法8gxsj更新時間dateno9zgpfwcsxz最高頻訪問次數(shù)限制numberno-1為不限制10bz備注varchar2(4000)yes注:1. 主鍵為jkid2. 該表定義系統(tǒng)向外提供的接口信息2.2.3外部接口訪問授權(quán)表(t_ims_permit)序號字段編碼字段名稱類型是否為空備注1jkxlh序列號varchar2(256)no2xtlb系統(tǒng)類別varchar2(2)no3azdm安裝點代碼varchar2(6)no4dyrjkfdw調(diào)用軟件開發(fā)單位varchar2(12)no關(guān)聯(lián)廠商表id,與無錫所同步5dy

14、zdw調(diào)用者單位varchar2(12)no用戶單位,如支隊、大隊,關(guān)聯(lián)部門表id7kfwjk可范圍接口varchar2(2000)no8ipipvarchar2(2000)no表示范圍,如127.0.0. t127. 0. 0. 255;“;”表示ip集合,如127.0.0. 1; 127.0. 0.210jkqsrq調(diào)用者起始日期dateno11jkjzrq調(diào)用者截止日期dateno13gxsj更新時間dateno14bz備注varchar2(4000)yes2.2.4本地接口訪問控制表(暫時不用考慮)序號字段編碼字段名稱類型是否為空備注1xtlb系統(tǒng)類別varciiar2(2)n2azd

15、m安裝點代碼varchar2(6)n3dyrjkfdw調(diào)用者發(fā)證機關(guān)varchar2(12)n省集中模式的填寫發(fā)證機關(guān)頭4dyfzjgvarchar2(10)n5jkid接口編號varchar2(5)n6zt狀態(tài)char(l)n7gpfwcsxz高頻訪問次數(shù)限制numbern8zjfwsj最近訪問時間datey9drfwcs當(dāng)日訪問次數(shù)numbery10bz調(diào)用者起始日期varchar2(400)y注:1. 該表維護的是本地接口訪問控制信息,對外部接口訪問授權(quán)表中的可訪問接口(kfwjk) 詳細信息進行維護,比如在一些大城市中為了減小系統(tǒng)壓力,對于部局端已經(jīng)審核過 的外部接口授權(quán)信息(外部接口

16、訪問授權(quán)表中的kfwjk字段定義的接口),當(dāng)?shù)亟痪?可以自己啟停對某些廠商某幾個接口(zt字段)2. 現(xiàn)由于本次共同開發(fā)的平臺的部局端尚未實現(xiàn),這張表可以先不實現(xiàn)3鑒權(quán)功能設(shè)計具體可以參考以下代碼,綠色部分為具體鑒權(quán)點和校驗邏輯,青綠色部分可以先不實現(xiàn)*判斷* param bdfzjge-hualu* param jkxlhstr* param jkidstr* param xtlb* param remotelp* param webappcontext* re turn*/private dhresult checkvalid(string bdfzjg, string jkxlhstr,

17、 string jkidsh; string xtlb, stringremotelp, webapplicationcontext webappcontext) (dbresult r = new dbresult();r.setcode(l);r.selmsg,”);iryif(!stnngutil.checkbn(jkxlhstr)(throw new exception(”未輸入接口序列號”);if(!s"ingutil.checkbn(jkidst,)throw new exception未輸入接口 idn);contentquefydaocontent query dao

18、=(contentquerydao)vvebappcontext.etbean(contentquerydao.class);controlquerydaocont rolquery dao=(controlquerydao)webappcontext.getbean( controlquerydao. class);appformjg writedaoappformjg writedao=(appformjgwritedao)webappcontext.getbean(appformjgwritedao.class);hfquerydao hfquerydao = (hfquerydao)w

19、ebappcontext.etbean(hfquerydao.class);control ctl = controlquefydcio.queiycontrolbyjklxh(jkjclhstr);throw new exception/接口序列號不存在;appformjg appformjg = new appformjg(); appfonnjg.setxtlbf ctl.getxtlbo);appfo rmjg. set a zdm (ctl.getazdm(); cippfonnj.setdyrjkfdw(ctl.etdyijkfdw();cippfimtijg.setdyjgjlg

20、ddyfzjgo);control jkxlh = appformjg writ edao. quety control jkjclh(appformjg);if(jkxlh = null.throw new except驗證接口序列號異常,);if(!jkxlhstr. equals(jkxlh.getjkxlh()throw new exception(”接口序列號小合法);control jyw = controlquerydao. querycontroljyw( appformjg);可以不考慮,if(jyw = null)throw new exception(”接口校驗位被非法修

21、改、int idx = ctl.gdkjvjk().mdexof(”" + jkidstr + 、:”);if(idx <= 0)throw new exception("該接曰序列號不適用于該接曰id");string strkfwjk = ctl.getkfwjk(). replace al 1( ",jsonobject kfwjkjson = jsonobject.fromobject(strkfwjk);jsonobject curjkidjson - (jsonobject)kfwjkjson.get(jkidstr);string z

22、t = (string)curjkidjson.get(ffztf,);".equals(zt) throw new exception部局己對該序列號停用木接!t);hf chf =hfquery dao. queiyhf(ctl. getxtlh(),ctl.getazdm(),ctl.getdyrjkfdw(),ctl.getdyfzjgo, jkidstr);if(!nl,"quals(chf.getzt()throw new exception(”當(dāng)前系統(tǒng)已對該序列號停用本接口;/xuxd 20140902增加ip地址邏輯判斷,支持ip歹u表方式,為列表時jsip

23、='equals( ctl.getjsip()&&ctl.getjsipf). equals("-'') if( ctl.getksip(). indexof( remotelp)<0)throw new excepticm(”不是合法的ip 地址st ring remotelps = remotelp.split( rr);st ring ksips = ctl.getksip().split(”);st ring jsips = ctl.getjsip( ).split(”);longf / rips = new long4;long

24、f kips = new long4;long jips = new long4;ti = 0; i <4; i+ +ripsi = long. valueof( remotelpsf i );kipsi = long. valueof( ksips i);iips/ i = long. valueof(jsips i j);long rip = (ripso « 24) + (rips « 16) + (rips2 « 8) + rips3;long kip = (kipso « 24) + (kipsl « 16) + (kips2

25、« 8) + kips;long jip = (jipsoj « 24) + (jips 1 « 16) + (jips2 « 8) + jips3;if (rip < kip | rip >jip)(throw new exception/1、是合法的 ip 地址long curtime - system. currenttimemillis();imestamp.valueof(ctl.getjkqsrq() + rr 00:00:00").gettbne() > curtimethrow new exception

26、9;接曰尚未啟用if (timestamp, valueof(ctl.getjkjzrq() + " 23:59:59,).gettime() < curtime) throw new exception(”接口已過申請期限”);content ent = contentqueiydcio.getcontent(jkidstr);throw new except接口不存在,或接口被非法修改if (timestamp. valueof( cnt.getjkyxqf) ).gettime() < curtime)!throw new exception(”接口己過有效期”);

27、if(!nlh. equals(cnt.getjkzt()(throw new exception("部局未啟用該接口catch(exception e)r.setcode(-l);nsetmsgf e.getmessage();return r;4.1授權(quán)碼生成規(guī)則(無錫所提供)java代碼:public control querycontroljkxlh(appformjg bean) throws exception (string jkxlhsql = hselect ews_pkg. createewsjkxlh (?) jkxlh from dualn;control j

28、kxlh = (control)this. jdbctemplate. queryforbean(jkxlhsql, new object bean. getxtlbo + bean, get azdm () + bean. getdyr jkfdw() + bean. getdyfzjg(), control, class);if (jkxlh = null | !stringutil. checkbn(jkxlh. getjkxlho) (throw new runtimeexception (,r計算接 口序列號錯誤!”);return jkxlh;)function get_encry

29、pt(arg_instr in varchar2) return varchar2 isbeginif raw key is null thengetrawkey;end if;return rawtohex(utl_raw. bit_xor(utl_raw. cast_to_raw(arg_instr),raw_key);end get encrypt;生成接口序列號function createewsjkxlh(plaintext varchar2) return varchar isciphertext varchar2 (256);beginciphertext := getencry

30、pt(plaintext);if length (ciphertext) > 256 thenciphertext :二 substr (ciphertext, 1, 256);end if;return ciphertext;end;*判斷* param bdfzjg* param jkxlhstr* ©param jkidstr* param xtlb* param remotetp* param webappcontext* ©return*/private dbresult checkvalid(string bdfzjg, string jkxlhstr,

31、string jkidstr, string xtlb, string remotetp, webapplicationcontext webappcontext) ( dbresult r = new dbresult();r. setcode (1);r. setmsg(,rm);try (if (istringutil. checkbn(jkxlhstr)(throw new exception(m未輸入接口序列號”);if(istringutil. checkbn(jkidstr)(throw new exception(m未輸入接口 id");contentquerydao

32、contentquerydao=(contentquerydao)webappcontext. getbean(contentquerydao. class);controlquerydaocontrolquerydao=(controlquerydao)webappcontext. getbean(controlquerydao. class);appformjgwritedaoappformjgwritedao=(appformjgwritedao)webappcontext. getbean(appformjgwritedao. class);hfquerydaohfquerydao=(

33、hfquerydao)webappcontext. getbean(hfquerydao. class);control ctl = controlquerydao.querycontrolbyjklxh(jkxlhstr); if(ctl = null) (throw new exception(m接口序列號不存在”);)appformjg appformjg = new appformjgo;appformjg. setxtlb(ctl. getxtlbo);appformjg. setazdm(ctl. getazdmo);appformjg. setdyrjkfdw(ctl. getd

34、yrjkfdw();appformjg. setdyfzjg(ctl. getdyfzjgo);control jkxlh = appformjgwritedao. querycontroljkxlh(appformjg); if (jkxlh = null) (throw new exception(m驗證接口序列號異?!?;if (! jkxlhstr. equals (jkxlh. getjkxlh () (throw new exception (m接口序列號不合法”);control jyw = controlquerydao. querycontroljyw(appformjg);

35、 if(jyw = null) throw new exception(m驗證接口校驗位異?!?;if (! jyw. getjyw(). equals (ctl. getjywo) (throw new exception(h接口校驗位被非法修改");)int idx = ctl. getkfwjko. indexof (,r'n + jkidstr + "':”);if(idx <= 0) (throw new exception(m該接口序列號不適用于該接口 id");string strkfwjk = ctl. getkfwjk().

36、 replaceall(n ”,jsonobject kfwjkjson = jsonobject. fromobject(strkfwjk);jsonobject curjkidjson = (jsonobject)kfwjkjson. get(jkidstr);string zt 二(string)curjkidjson. get (nztk);if (! t. equals (zt) (throw new exception (m部局已對該序列號停用本接口”);elsehf chf = hfquerydao. queryhf (ctl. getxtlbo , ctl. getazdmo

37、, ctl. getdyrjkfdw(), ctl. getdyfzjgo , jkidstr);if(chf != null)(if (! t equals(chf. getzt () ( throw new exception(,r當(dāng)前系統(tǒng)已對該序列號停用本接口 ”);/xuxd 20140902增加ip地址邏輯判斷,支持ip列表方式,為列表時 f ijsip=-;if (!" equals (ctl. getjsip () )&&ctl. getjsip (). equals ("-")(if(ctl. getksip(). indexof

38、(remotelp)<0) throw new exception (h不是合法的 ip 地址”);else (string remotelps = remotelp. split(m. n);stringe ksips = ctl. getksip(). split (n. n);stringe jsips = ctl. getjsip(). split (n. h);long rips = new long4;long kips = new long4;long jips = new long4;for (int i = 0; i < 4; i+) ripsi=long. va

39、lueof (remotelpsi);kipsti=long. valueof(ksipsi);jipsti=long. valueof(jsipsi);long rip =(rips024)(ripsl16)+ rips3;+ kips3;+ jips3;long kip =long jip(kipseo(jipsoif (rip < kip24)24)rip > jip) (kipsti16)+ (rips 2 << 8)+ (kips 2 « 8)+ (jips2 « 8)throw new exception(,f不是合法的 ip 地址”)long curtime 二 system. currenttimemi11is();if(timestamp. valueof(ctl. g

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論