搜尋

搜尋結果

大倉酒店情人節美饌顯心意
澳城餐飲
LifeMag Editor・2015-01-28

澳門大倉酒店六樓全日餐廳全新開幕 今年情人節,澳門大倉酒店六樓全日餐廳為各位愛侶呈現浪漫情人節精選套餐,全新裝修的餐廳滿溢情人節浪漫氣氛,在醉人的環境下,與愛侶享受大廚精心設計的6道菜晚餐。 情人節晚餐先以新鮮生蠔伴辣茄醬、吞拿魚他他伴欖油魚子醬作頭盤。三隻並列的生蠔,配上冰雪狀的辣蕃茄醬汁,感覺清新特別。至於軟軟的吞拿魚他他上配上脆片,令口感更加豐富,周圍的魚子裝飾令賣相非常吸引。 新鮮生蠔伴辣茄醬 吞拿魚他他伴欖油魚子醬 主菜有燒珍寶大蝦、威靈頓牛扒。珍寶大蝦比非常大隻多肉,而且肉質爽口,配酸辣的醬汁令人開胃。2吋厚的牛扒外圍以火腿和酥皮等包著,多層口感,連伴碟的薯、豆和菇都美不勝收。至於忌廉龍蝦海鮮湯,味道則十分濃,未必適合每個人口味。 燒珍寶大蝦 威靈頓牛扒 甜品則為紅梅熱情果,單是賣相已令人甜到入心,但吃起來甜中帶酸,不會甜到漏,非常出色。 紅梅熱情果 用餐完後,餐廳更會送上心型禮盒,是紅色朱古力甜品,為甜蜜的情人節晚餐劃上完美句號。 浪漫情人節精選套餐包括六道菜餚和兩杯氣泡酒,供應日期為2月14日晚上6時至10時半,收費兩位澳門幣1,388元(另加收10%服務費),預約訂座及查詢:(853)88835126,電郵:terrace@hotelokuramacau.com Text & Photo: Ping

【英國。利物浦】※景點※ Liverpool Metropolitan Cathedral 利物浦大都會教堂 (基督君王都主教座堂) ~ 有別傳統 超級時尚美的天主教堂
走遍世界
80後愛旅行✈️・2019-10-30

物浦大都會大教堂(Liverpool Metropolitan Cathedral) 全名為「基督君王都會大教堂 (Metropolitan Cathedral Church of Christ the King)」 是英國最具特色的羅馬天主教教堂, 利物浦大主教所在地。 建築風格很有現代感, 外觀像一座藝術建築物。 在1967年完工。 這座大都會教堂實現了1930年代時Downey大主教的夢想: 「建立一座當代的大教堂, 扭轉羅馬天主教的給人的傳統形象, 表現教會的創新精神。也藉由這嶄新的建築, 吸引更多人走進教會!」 我們由Liverpool Lime Street Station慢步去向大都會教堂的方向 我們是由Manchester曼徹斯特來利物浦一天遊, 今天的天氣真的非常好~ 陽光普照的利物浦 沿途經過了利物浦大學, 這些以紅磚砌成的建築物很有特色。 大概十幾分鐘就到達了「Liverpool Metropolitan Cathedral 利物浦大都會教堂」 大都會教堂的外觀非常獨特, 像一艘淡灰色的圓形太空船, 頂端收斂成皇冠造型的垂直尖塔。 整個大教堂呈圓錐形, 其底座為平面圓形的, 直徑為195米, 環繞著13個小禮拜堂。 我們繞到教堂的正面入口, 是一幅巨大的石壁 走進內部, 設計師真的打破傳統教堂的模式! 將祭壇設置在正中央, 四周被成排的座椅圍繞。 祭壇上方的尖頂由大片的彩繪玻璃窗構成, 讓陽光能投射到內部 。 閱 讀 全 文

殿堂級鞋履名牌Giuseppe Zanotti於「澳門銀河」開設期間限定店
購物‧時裝
LifeMag Editor・2018-03-05

「時尚匯」購物中心成為大中華區獨家展示全新Picard Collection的銷售點 「澳門銀河TM」綜合渡假城今天熱烈歡迎來自意大利的星級鞋履品牌Giuseppe Zanotti,於澳門的時尚購物熱點「時尚匯」購物中心開設期間限定店,為熱愛高貴奢華及手造鞋履的賓客帶來驚喜。期間限定店由3月1日至4月30日設於翡翠大堂,為即將於5月1日隆重開幕的Giuseppe Zanotti「時尚匯」專門店揭開序幕。 澳門首發的Giuseppe Zanotti期間限定店,展出一系列最著名的男士、女士及童裝鞋履,包括 Star Collection及G Heel Collection等,以及首度於中國、香港及澳門登場的Picard Collection。 為慶祝蜚聲國際的名設計師品牌登陸「時尚匯」,「澳門銀河」特別與澳門麗思卡爾頓酒店的「麗思酒廊」及Giuseppe Zanotti攜手推出「Giuseppe Zanotti 踏進璀璨瑰麗之夜」。由3月14日至 4月30日逢星期三晚上,賓客只需於「麗思酒廊」出示Giuseppe Zanotti的消費單據,即可獲贈主題迎賓飲品一杯;所有穿著高跟鞋的女士惠顧指定雞尾酒將可獲買一送一優惠,或以每杯澳門幣98元*享用其他雞尾酒或有汽葡萄酒。此外,由3月1日至4月30日期間,Giuseppe Zanotti 的顧客憑消費單據於星期三惠顧「麗思酒廊」即可獲精選飲料及小食八折優惠,於其他日子亦可享八五折優惠。 「澳門銀河」零售助理高級副總裁黃興齡表示:「我們熱烈歡迎最受名人追捧的殿堂級鞋履品牌Giuseppe Zanotti,登陸『時尚匯』購物中心。Zanotti先生的設計時尚前衛,深得世界各地的社交名人和潮流達人喜愛,他的品牌影響力在中國的時尚社交圈中也與日俱增。『時尚匯』 是澳門最獲高端品味賓客青睞的購物熱點,我們相信全新的Giuseppe Zanotti期間限定店及即將登場的專門店,將吸引所有熱愛高級鞋履的賓客到訪。」 意大利星級鞋履品牌Giuseppe Zanotti自2000年於米蘭開設首間專門店後,便迅速在世界各地的時裝界崛起。出生於意大利的品牌創辦人Zanotti原是一位DJ,憑著對時裝的熱愛,他先以自由設計師的名義與幾位工匠合作,其後帶著天賦才華及一腔熱誠投身時裝界。Zanotti於90 年代初買下了Vicini鞋廠,希望藉此推動設計和款式的界限,讓行業適應革新過程而非以大規模生產來主導設計。此改革讓工廠得以少量生產不同系列的設計,就好像度身訂造時裝一樣。 Giuseppe Zanotti的知名作品包括極具雕塑感及綴有寶石的高跟鞋,以及前衛時尚的休閒運動鞋。其他生產及銷售產品包括女裝、男裝及童裝鞋履,以及小皮具、包袋、飾物與成衣。Giuseppe Zanotti的出品在全球75個國家有售,其鞋履的設計靈感多源自不同的電影、音樂與藝術作品,為紅地毯上的寵兒。 Picard系列 ─ Promenade水晶綴飾樹枝玻璃涼鞋澳門幣9,800元 Giuseppe Zanotti的 “Promenade” 涼鞋以優雅的透明帶子裝飾雙足,是出席晚宴的首選。 這款意大利手造涼鞋的鞋跟彎曲有致,最適合展示長腿和配襯搖曳生姿的長裙。 迎賓飲品 ─ Polkadots 成份:石榴,草莓,覆盆子,青檸酒 靈感源自Giuseppe Zanotti的Picard系列,取材於女性化的剪影和迷人的效 果,Polkadots雞尾酒既優雅又充滿活力。 迎賓飲品 ─ Paradise 成份:新鮮菠蘿、椰青水、香茅、泰國青檸、蜂蜜及白葡萄酒 從 Giuseppe Zanotti 的 2018 春夏系列中,熱帶及無盡夏日主題獲得啟發,Paradise 雞尾酒以熱帶水果及自家製白酒為主,味道猶如葡萄酒版 piña colada。

真相曝光!劫匪在澳門搶劫310萬後,最終落網於....
其他
澳門生活圈・2019-05-25

近日,澳門娛樂場 似乎進入了緊急狀態 司警一連幾天的出動 掃蕩氹仔一帶不法分子 讓往日的風平浪靜 變成如今的暴風雨 今年,本澳路氹城娛樂場一直透露著負面的消息! 本月18號,4名內地男子在四季酒店附近的天橋底被人用刀襲擊,其中1名男子不治身亡,其餘3人被刀刺傷,案件真相已出(觀看第二版)。 回顧今年2月,同一集團旗下的某酒店客房中發生一起凶殺案,一名活躍於賭場的內地男子被發現伏屍在酒店內的客房中,身上有明顯刀傷。 2019年半年未到,娛樂場酒店內至少發生兩起凶殺案,是酒店安保不妥,還是管理者的疏忽,無論是哪一點,都該嚴肅反省。 作為澳門主要的旅遊中心,安保和管理者占主要地位,確保旅客的人生安全尤其重要,但經最近發生的事件以來,透露出了某些問題... 然而 一波未平一波又起 不良的風氣的趨向 越來越嚴重! 本月24號,路氹城再度發生一則搶劫傷人事件。 當日淩晨5點多,司警接獲報案,指有2名男子在路氹城的四季酒店娛樂場內使用胡椒噴霧傷人並搶劫。 2名陌生男子使用胡椒噴霧噴傷門口的保安,以及一名賭台莊荷搶去賭台珠盤內的310萬籌碼。 當時,匪徒是戴著口罩作案,搶劫成功後,還能乘坐的士逃走,簡直是上演電影大片。 慶幸受傷的保安和莊荷均無大礙,也無需送院! 想跑? 怕是跑不掉了! 司警跨境抓拿匪徒歸案 匪徒在賭場搶劫後,澳門司警馬上出動,根據多方的調查,本澳司警再與珠海公安聯手行動,在澳珠兩地共拘捕4名人士(3男1女),並起回全部涉案籌碼。 被拘捕的2名劫匪分別姓鄧、屈,年齡37及27歲,內地居民,作案後潛逃到珠海落網。 另一名20歲相姓內地女子與鄧某為男女朋友關系,在路氹某娛樂場與負責接贓的40歲何姓男子交收時被司警截獲。 警方以搶劫罪、禁用武器、加重傷害身體完整性對首3名疑犯落案起訴,並對何某控以贓物罪。 劫匪是如何乘順利逃走的? 本月24號淩晨5時22分,案中2名內地漢戴口罩闖入了路氹城的賭場酒店2樓高額投注區,他們先用胡椒噴霧襲擊駐守在投注區外一名保安人員; 再沖入娛樂場其中一張營運中賭台,再用胡椒噴霧襲擊賭台上一名莊荷,迅速搶走了31個面額為10萬港元的現金籌碼後逃走,整個過程當中僅用了2至3分鍾。 期間,娛樂場保安隨即追截,由於酒店內商場有著四通八達的通道,2名劫匪才順利逃往金沙城外,換乘2部的士逃離本澳。 劫匪男扮女裝 隨後,司警立即展開偵查,透過賭場監控片段,發現案中的劫匪鄧某曾男扮女裝進入現場酒店踩線。 直至24號淩晨,帶同胡椒噴霧及口罩到現場,見時機成熟時就開始下手,再按原定計劃路線逃走。 司警隨即根據“天眼”等監控手段,發現涉案2名男子。期間,有人曾在中區某快餐店與涉案一名女子接觸。 2名劫匪曾在澳多次轉乘不同交通工具,不時更換衣著,最終,2人在24號上午先後經關閘離境。 司警掌握2名劫匪身份後,立即通報內地警方協助,珠海警方立即采取行動。 至24號傍晚,珠海警方成功拘捕2名男疑犯,目前由珠海警方對2人作進一步調查。 10萬現金碼被打散 由於相信涉案女子與案件有關,司警透過“天眼”發現女疑犯的行蹤,一直尾隨監視,發現女疑犯案發後曾到路氹城某賭場“打散”一個10萬元籌碼,並在路氹城某賭場透過一內地男子將10萬元籌碼兌換成現金,司警隨即上前拘捕涉兌碼男子。 司警隨後繼續尾隨監視女疑犯,直至24號晚上,司警見時機成熟,立即采取行動,劫匪最終被全數拘捕,司警在何某身上搜出13萬籌碼,並在相某租住酒店房內起回29個十萬籌碼。 仿佛在上演警匪大片 下手前做好了一切計劃 多次踩點,男扮女裝 一切都以為是完美的計劃 豈不料賭場周邊到處都是“天眼” 任由你跑,也跑不了多久 六大博企召開緊急會議 對於24號娛樂場被劫一事,博彩監察協調局及司法警察局均高度關注,立即與6間博彩企業召開緊急會議。 檢討現時娛樂場安保措施及與業界之聯動機制,討論如何防范同類情況再次發生。 博監局局長陳達夫在會上再次督促各博彩企業須持續做好娛樂場安保工作,對各娛樂場的保安措施進行全面檢視,並須積極配合警方的執法工作。博監局會持續與警方保持密切溝通,一如以往全力協助警方的偵查工作。 澳門是各大市民的家庭 也是具有標注性的旅遊城市 你既然在這裏作出不良的行為 司警也是時候清理門戶 殺雞儆猴,以儆效尤 除此之外,司警從本月19號晚開始,一直對皇朝區、新口岸區、氹仔區及路氹金光大道一帶進行掃蕩,打擊犯罪及調查不法行為。 司警多日掃蕩 1 5月19號晚上至20號淩晨 治安警察局澳門警務廳、海島警務廳、情報廳、特警隊、交通廳共派出約220名人員。 行動中一共截查531人(423男108女),其中121人(89男32女)需帶返警局作進一步跟進處理。 經調查後發現共有105人涉及違法違規行為(81名涉嫌從事非法兌換貨幣及不法借貸活動、15名涉嫌從事賣淫活動、1名非法入境、2名逾期逗留、2名非法工作及4名不法持有刷卡終端機),有關人士已被送交相關部門作跟進。 在查車行動方面,警員共截查了82輛車輛,並對當中4宗違例情況作出檢控。 2 5月21號晚上至22號淩晨 治安警察局澳門警務廳及海島警務廳共派出約50名人員。 行動中一共截查109人,其中55人被帶返治安警察局作進一步跟進處理。 經司警調查後,發現共有50人涉及違法違規行為(47名涉嫌從事非法兌換貨幣及3名涉嫌從事賣淫活動),有關人士已被送交相關部門作跟進。 在查車行動方面,交通廳共截查了38輛車輛,並對當中9宗違例情況作出檢控。 3 5月23號晚上至24號淩晨 治安警察局澳門警務廳及情報廳共派出44名人員,分別在新口岸區及路氹金光大道一帶進行反罪惡巡查,打擊犯罪及調查不法行為。 行動中一共截查135人(97男38女),其中53人被帶返治安警察局作進一步跟進處理,經調查後發現共有46人涉及違法違規行為(21名涉嫌從事非法兌換貨幣、2名涉嫌從事賣淫活動及23名涉嫌從事不法借貸,其中1名涉嫌從事不法借貸的人士為非法入境者),有關人士已被送交相關部門作跟進。 在查車行動方面,交通廳共截查了59輛車輛,並對當中4宗違例情況作出檢控。 對於不法分子近日以來的猖獗 治安警察局作出了實際的行動 清理玷汙澳門風氣的不法分子 進行具針對性的反罪惡行動 給市民和旅客一個良好的治安環境 同時,各安保人員也需加強管理 以此進一步保障市民和旅客的安全和利益 這才是本澳該有的旅遊城市風范 素材來源:力報、澳門治安警察局、網絡 圖片來源:力報、澳門治安警察局、表情包 如有侵權,請聯系我們刪除 版權屬於原作者 編輯撰寫:小嚕

險過剃頭!澳門旅遊巴“轉彎直撞”咖啡室,食客:執翻身彩!
其他
澳門生活圈・2019-05-04

五一勞動節小假期 內地旅客在拱北海關現大量人潮 從上往下可以看出 大量旅客正寸步難行 慢慢地向澳門關口挪行 旅客們以小碎步慢慢挪行進澳,大三巴就開始實施人潮管制,新馬路部分路段封閉作臨時行人路。 盡管如此,許多熱門景點仍是人頭湧湧,街巷道路塞滿了人龍。 有旅客就表示,有預料到來澳門會人多擠逼,但沒想到竟是如此「誇張」,笑言場面好似「生化危機」。 據初步資料,至5月2號晚上10點,約有61萬人次經各口岸出入境。 確實如此,也許大家都知道假期會有很多人出行,但是,天知道會有這么多人過澳門,看來,旅客們的時間都堆積到一起去了。 來澳的旅客早上過關要1小時,且人流大咁誇張,原以為澳門比香港生活節奏慢會較休閑,想不到是人山人海的情況。 未想到澳門會比香港更人多擠逼,但也無礙觀賞大三巴,認為人多較熱鬧。不過他是從白鴿巢方向往牌坊,當他見到大三巴街的壯觀人龍時,真系好似“生化危機”。 香港旅客 今次的五一黃金周又將成為一個話題,或許以後還是會有旅客提起這次難忘的經曆。 治安警雖然在五一黃金周做好相關人潮管制,但未能預料的事情也同樣發生在澳門... 回憶起2012年的時候,旅遊巴撞入白鴿巢前地某教會造成22人受傷;2016年旅遊巴撞爆同安街一唐樓基柱並造成32人受傷的嚴重事故。 同樣事件,竟然發生在5月2號,人流量最多的時候。 旅遊巴失控直撞地鋪 5月2號,本澳二龍喉街第三度發生失控旅遊巴鏟上行人路地鋪的恐怖交通意外,尤幸是次只對一地鋪造成損毀外,並無人受傷,但事件已敲響了越來越多車體巨大旅遊巴在本澳路窄多彎環境可能造成意外的警鍾。 據了解,被撞的地鋪餐廳當時有不少食客在用餐,滿載日本旅客的一輛旅遊巴如失控巨龍般直撞向餐廳。 路邊U型防撞欄首先被撞致飛脫,接著餐廳外一道木門和鐵閘也抵受不住巨力撞擊,木門應聲倒下,鐵閘亦扭曲變型。 慣性作用,一到失控,就難以想象... 食客離死神的一步之遙 據悉,這輛旅遊巴載有連司機及導遊在內共45人,在2號早上9點左右,由松山隧道駛出進入荷蘭園,出了隧道後沿二龍喉街左轉進入士多鳥拜斯大馬路,然後往景點區觀光。 但旅遊巴竟然沒有完成向左轉彎動作,而是畢直撞向士多鳥拜斯大馬路地鋪一家咖啡室。 旅遊巴被剎停後,車頭離餐廳外的玻璃窗櫥僅數吋之遙,而坐在最靠近餐廳門口的一位食客,當時正背對門口而坐,倘若旅遊巴餘勢未衰,這名食客可能逃不過一劫。 據旅遊巴上的導遊稱,他當時背向車頭,未有發現異常,但前面的旅客人人大叫,他才驚覺有事發生,慌忙中捉緊扶手,才沒有被旅遊巴急剎造成前沖的物理慣性,給「震出」車頭之外。 大眾食客心驚膽戰 與此同時,咖啡室內的一名女負責人稱,當時咖啡室內約有20名食客在用餐,聽到咖啡室門外發出巨響,才如夢初醒紛紛逃走。 一眾食客看見旅遊巴幾乎直撞進咖啡室,大家都揑了一把冷汗,當中,一名背向咖啡室門外並最靠近咖啡室門口的食客,最是心驚膽跳,因為他差點就與“死神”相見。 事發後,大批消防員趕至現場,治安警則在場維持交通秩序,並暫時封閉一段士多鳥拜斯大馬路,方便善後清理。 45名旅客安陽無恙 由於旅遊巴前方大門在撞擊時損毀沒有打開,全車45人均無法下車,消防員一度大為緊張,幸車內沒有人受傷或不適,消防員多番嘗試後終將車門撬開,被困旅客有秩序地下車,無人需要送院及敷治。 鑒於意外是通往中區及大堂區景點的主要幹道之一,消防迅速調動一輛大型工程車,將失靈旅遊巴拖走檢驗,現場一度堵塞的交通,至事後10點44分方完全解封及恢複暢順。 肇事原因待調查 治安警交通廳代廳長表示,初步懷疑旅遊巴剎掣失靈,肇事本地司機有10多年的駕駛經驗,旅遊巴於2012年出廠,未到驗車期限,至於真正肇事原因,有待進一步檢驗。 事後,因咖啡室鐵閘及大門被毀,現時沒法關上店門,幸好店內陳設並沒有受損,咖啡室負責人指負青旅遊巴的保險公司正處理賠償。 現時,工程公司已進行維修,希望咖啡室能盡快重開。 剛好碰上了黃金周 且人流量最多的地方 澳門人多路窄 多少車輛都出了相關同樣的事情 這次幸虧無大礙 但誰也無法預料下一次同樣的事情不會發生 所以,駕駛員在狹窄彎時轉彎時 還是小心為上,慢行而過! 素材來源:力報、網絡 圖片來源:力報、網絡、表情包 如有侵權,請聯系我們刪除 版權屬於原作者 編輯撰寫:小嚕

【日本。東京】※景點※ 豐洲千客萬來 ~ 晚上東京灣夜景 別有一番風味
走遍世界
80後愛旅行✈️・2025-07-22

東京豐洲的「千客萬來」相信都不用多介紹,它是在東京豐洲市場旁的一個大型複合設施,於2024年開幕。 「豐洲千客萬來」約有70間商店,在這裡可以品嚐到豐洲市場附近特有的新鮮美食! 因此大多數人都一定會選擇白天的時候來這裡享用到來自豐洲市場的新鮮魚獲。 *但我建議大家除了白天來享用美食之外,也花點時間晚上再來一次,你會看到跟白天完全不一樣的「千客萬來」! 要到「豐洲千客萬來」交通非常便利。 從東京市區搭乘地鐵到市場前站,出站後就有天橋連接直達「千客萬來」。 「豐洲江戶前通」是延伸至豐洲場外江戶前市場外側的步道,可一邊欣賞四季更迭的風景,一邊愜意散步。 「豐洲千客萬來」主打江戶時代風格,重現江戶街景。 和白天的「千客萬來」完全不同,沒有熙來攘往的人群,可以這條「豐洲中央大道」拍出充滿江戶風情的照片。 「江戶前廣場時之鐘」 「豐洲千客萬來」在晚上有著獨特的魅力,其中一樣就是頂樓的展望足湯庭園。 「豐洲萬葉俱樂部」是一個溫泉會館,提供來自箱根和湯河原的溫泉水, 設有大型公共浴場、露天浴池、岩盤浴等設施,還有可欣賞360度夜景的展望足湯庭園。 ​ 足湯庭園位於8樓,免費開放,開放時間是09:00-22:00。 有屏幕顯示當刻在足湯庭園的人數 來到足湯庭園的入口,有賣毛巾的自助販賣機,很貼心 像我這種即興來泡腳的人,什麼都不用準備,可以直接在這裡買就行了! 來到8樓的展望足湯庭園,晚上的景色真的超美的!!! 在這裡能夠俯瞰豐洲及360度的東京灣景色,夜間景觀真是美不勝收!! 晚上來到人比早上少太多了,每組人都可以有自己的空間,可以輕鬆的坐著聊天,看風景,渡過美好的一晚。 很清楚的看到台場附近的「彩虹大橋」 雖然餐飲區域通常營業至晚上7、8點左右,選擇一定不及白天時候的豐富。 但為了晚上的東京灣夜景,真的很建議大家晚上再來一次。 最後我們也在「豐洲千客萬來」的「月島もんじゃ 十五夜」吃了文字燒 豐洲千客萬來 東京都江東區豐洲6-5-1 https://www.toyosu-senkyakubanrai.jp/languages/tw/#content_0001 檢視較大的地圖

Spring Boot 05 - 為 http json api 加入登入要求
科技新知
MacauYeah・2024-07-02

本節,我們將為之前的http服務,加入認證機制,只有在資料庫現存的用戶可以登入及訪問我們的json api。 下戴模版 慣例,我們用Spring Initializr (Maven) 下載模版,Dependency主要選擇 Spring Web Spring Boot DevTools Spring Security Controller 跟上節一樣,我們起一個Controller,為簡化測試,我們只做http GET api。 由於本blog對於Source Code的顯示不太友好,有需要看source code的,請到Github查看 //src/main/java/io/github/macauyeah/springboot/tutorial/springbootwebapidata/controller/HomeController.java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api") public class HomeController { @GetMapping("/someRecord/{uuid}") public Map readSomeRecord(@PathVariable String uuid) { return Map.of("ret", "your uuid:" + uuid); } } 準備我們的test case,但這次我們預期它應該要出現登入失敗的結果。 //src/test/java/io/github/macauyeah/springboot/tutorial/springbootwebapidata/controller/HomeControllerTest.java @SpringBootTest @AutoConfigureMockMvc public class HomeControllerTest { @Autowired private MockMvc mockMvc; @Test void testNoLogin() throws Exception { RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/api/someRecord/1234") .contentType(MediaType.APPLICATION_JSON); this.mockMvc.perform(requestBuilder) .andExpect(MockMvcResultMatchers.status().is4xxClientError()) .andExpect(MockMvcResultMatchers.jsonPath("$.ret").doesNotExist()) .andDo(MockMvcResultHandlers.print()); } } 在我們執行上述的測試,test case 成功過了。我們的基本設定跟上一節其實沒有多大改動,為何現在http api會回傳狀態 401? 那是因為我們在依賴中加了,Spring Security,它配合了Spring Web,就會自動為所有api加入權限檢測。我們的測試中,沒有任何用戶登入,當然會出現 http 401。為了讓我們可以好好管理誰可以使用api,我們就來設定一定Security。 我們加一個WebSecurityConfig.java,暫時指定所有的訪問路徑都必需有USER權限,並且用 http basic的方式登入。 //src/main/java/io/github/macauyeah/springboot/tutorial/springbootwebapidata/config/WebSecurityConfig.java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class WebSecurityConfig { @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(authorizeHttpRequests -> { authorizeHttpRequests.requestMatchers("/**").hasRole("USER"); // 所有的訪問路徑都必需有USER權限 }); http.httpBasic(Customizer.withDefaults()); // 使用http basic作為登入認證的方式 return http.build(); } } 上述例子,只是擋了沒有權限的人,我們還需要讓有登入身份的用戶可以成得取限User權限。 我們繼續修改,WebSecurityConfig,加入只在記憶體有效的InMemoryUser import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.provisioning.InMemoryUserDetailsManager; public class WebSecurityConfig { //.. @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); // 我們的密碼不應該明文儲,比較保險,我們使用BCrypt演算法,為密碼做單向加密。 } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withUsername("admin") .password(passwordEncoder().encode("pass")) .roles("USER").build(); // 我們在記憶中體,加入一個測試用的User,它的名字為admin,密碼為pass,權限為User return new InMemoryUserDetailsManager(user); } 然後加入新的測試,直接模擬Role。結果是通過的。 //src/test/java/io/github/macauyeah/springboot/tutorial/springbootwebapidata/controller/HomeControllerTest.java @Test void testLoginWithRoles() throws Exception { RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/api/someRecord/1234") .contentType(MediaType.APPLICATION_JSON).with( SecurityMockMvcRequestPostProcessors.user("someone") .roles("USER", "ADMIN")); // 沒有使用密碼,只使用Role this.mockMvc.perform(requestBuilder) .andExpect(MockMvcResultMatchers.status().is2xxSuccessful()) .andExpect(MockMvcResultMatchers.jsonPath("$.ret").value("your uuid:1234")) .andDo(MockMvcResultHandlers.print()); } 再來一個測試,改用密碼登入,分別輸入錯的和正確的密碼。 @Test void testLoginWithWrongPasswordAndNoRole() throws Exception { RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/api/someRecord/1234") .header("Authorization", "Basic randompass") // 輸入錯的密碼,應該回傳http 401 Unauthorized .contentType(MediaType.APPLICATION_JSON); this.mockMvc.perform(requestBuilder) .andExpect(MockMvcResultMatchers.status().is4xxClientError()) .andDo(MockMvcResultHandlers.print()); } @Test void testLoginWithPassword() throws Exception { RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/api/someRecord/1234") .header("Authorization", "Basic YWRtaW46cGFzcw==") // http basic 就是把 admin:pass 轉成base64 .contentType(MediaType.APPLICATION_JSON); this.mockMvc.perform(requestBuilder) .andExpect(MockMvcResultMatchers.status().is2xxSuccessful()) .andExpect(MockMvcResultMatchers.jsonPath("$.ret").value("your uuid:1234")) .andDo(MockMvcResultHandlers.print()); } 最後,當然是正確的密碼才能通過。若果大家還是半信半疑,我們可以跑起真的正服務(IDE RUN或mvn spring-boot:run),然後用curl去試。 curl http://localhost:8080/api/someRecord/1234 // failed with 401 curl -u "admin:pass" http://localhost:8080/api/someRecord/1234 // successed 使用SQL Database讀取用戶登入資訊 一般而言,我們不可能把所有用戶登資訊打在InMemoryUser中,通常背後有一個資料庫儲存所有的用戶資訊,我們在登入時,讀取它來做對比檢證。 為此,我們在maven中,加入 Spring Data JPA h2 database (或任何你的資料庫,如mysql 、 sql server) 最後一步,我們把InMemoryUser去掉,改為從資料庫讀取。因為原始碼太多,就不全部貼上。最主要的是WebSecurityConfig.java要關掉之前的UserDetailsService,改為提供一個UserServiceImpl類,它會實現UserDetailsService的功能。 @Configuration @EnableWebSecurity public class WebSecurityConfig { // 把原來的Bean先變成註解,其他不變 // @Bean // public UserDetailsService userDetailsService() { // UserDetails user = User.withUsername("admin") // .password(passwordEncoder().encode("pass")) // .roles("USER").build(); // return new InMemoryUserDetailsManager(user); // } } // spring-boot-tutorial/spring-boot-web-api-data/src/main/java/io/github/macauyeah/springboot/tutorial/springbootwebapidata/config/UserServiceImpl.java // other import import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; @Service public class UserServiceImpl implements UserDetailsService { @Autowired PasswordEncoder passwordEncoder; @Autowired UserRepo userRepo; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 因為我們資料庫沒有資料,為了方便測試密碼的加密,我們在java code上直接插入一筆資料。 UserEntity defaultUser = new UserEntity(); defaultUser.setUsername("admin"); defaultUser.setPassword(passwordEncoder.encode("pass")); defaultUser.setRole("USER"); defaultUser.setUuid(UUID.randomUUID().toString()); userRepo.save(defaultUser); // 上述為測試用插入資料,不應該出現在正式使用環境中。 UserEntity user = userRepo.findOneByUsername(username) .orElseThrow(() -> new UsernameNotFoundException(username + " not found")); // 找找資料庫有沒有正在登入的該名使用者username List authorities = List.of(new SimpleGrantedAuthority("ROLE_" + user.getRole())); LOG.debug("got user uuid:{}, username:{}, role:{} from database", user.getUuid(), username, user.getRole()); // 如果前面的 findOneByUsername 有結果回傳,我們就給它一個ROLE_XXX的權限。 return new User(username, user.getPassword(), authorities); // 這裏從沒有檢查過密碼是否有匹配,全部交給Spring Security去做 } } //spring-boot-tutorial/spring-boot-web-api-data/src/main/java/io/github/macauyeah/springboot/tutorial/springbootwebapidata/entity/UserEntity.java // spring-boot-tutorial/spring-boot-web-api-data/src/main/java/io/github/macauyeah/springboot/tutorial/springbootwebapidata/repo/UserRepo.java 上述段落中,筆者省略了UserEntity和UserRepo,它們只是一般的spring-data-jpa概念,有需要可以經文末的連結查看完全原始碼。最需要注意的,是UserEntity的password欄位,在資料庫中是以加密的方式儲存。我們在配匹登入者與資料庫記錄時,也沒有自行檢驗密碼的需要。我們只是在加密過的密碼回傳給Spring Security,Spring框架會自行把登入者輸入的密碼與加密了的密碼作比較。

歡迎光臨,這裡是什麼都有書店
其他
皓芯・2022-07-01

「歡迎光臨,這裡是什麼都有書店!」你想找什麼書?你有想要看的書嗎?在《什麼都有書店》裡,不管你有什麼理由,不管是哪一類型,只要你能想像到的書,這家書店都有賣!沒有你找不到,只有你不知道的書。 在小鎮的一隅,有間奇妙的書店,只要有客人走進來說出:「請問有沒有關於??的書?」老闆都會回應客人的詢問回答:「有喔!」無論是只有在月光下才能閱讀的書?必須一人拿一半才能讀的書?自由變換封面的書?老闆都會找到拿給客人看。 韓國資深出版人金彥鎬:當一個人在人生路上陷入徬徨之際,最好的去處非書店莫屬;被無以言說的孤寂圍困之時,能讓靈魂得到撫慰的空間也是書店。只要世界上依然有這樣的書店存在著,人類就有希望。 作者吉竹伸介,日本插畫家,作品涵蓋素描集、童書插畫、裝飾畫及廣告藝術等各種領域。主要的著作有《做一個機器人假裝是我》、《爺爺的天堂筆記本》等。本書發揮他最擅長的觀察能力,與天馬行空的奇思妙想,開了一間「什麼都有書店」。如果真的有這間書店,還真想前往一探究竟。 書店是城市的縮影,而每間書店帶著特有的味道,每一間書店背後都有說不完的故事,這本《什麼都有書店》,相信喜歡閱讀、愛書之人也會喜歡,甚至你會見識到書店婚禮。 歡迎你拜訪這家「什麼都有書店」,帶走你心目中最想擁有的書,讓每位作書人的用心和心聲,都能被看到。 不過故事最後唯獨有一本書是買不到的,老闆回答:「啊,目前還沒有這本書。」到底客人是問了什麼樣的書籍呢?答案就留給你閱讀本書探索吧! 《什麼都有書店》 作者: 吉竹伸介 譯者: 王蘊潔 繪者: 吉竹伸介(Shinsuke Yoshitake) 出版社:三采 出版日期:2018/09/07 ISBN:9789863429814 訂購地點: 鞠智繪本屋 圖片來源:博客來

雅辰酒店舉辦西洋書法新書發佈會
文化創意
文創遊樂場 // 米米 Esther Lim・2021-09-12

本月11日澳門雅辰酒店再次為大家體驗藝術文化,於乘風廊酒吧舉辦由澳門字體設計學會及亞洲十大沾水筆製作職人兼資深西洋書法家阿堅奴先生新書發佈會。 (澳門字體設計學會及阿堅奴贈送西洋書法畫給雅辰酒店) 阿堅奴早在2016 年他開始自學研究沾水筆製作工藝,於 2017 年於日本瓷器發源地 - 有田町開發彌足珍貴的有田燒沾水筆產品,今年他正式推出澳門首本亦是全澳唯一之西洋書法書籍《澳 門「字」傳 - 銅版雕刻手寫體-「守」篇》。西洋書法最早期是由傳教士馬禮遜帶到澳門的。 (很多歷史名人都有寫西洋書法) 澳門雅辰酒店總經理溫誠睿先生表示﹕「感到十分榮幸,把西洋書法的世界帶到酒店。寫西洋書法是文化和身份的象徵,箇中工藝之美必須傳承。今次酒店聯合策劃的字藝體驗專屬工作坊,是澳門美好生活Boa Vida的完美典範,讓酒店和其他客人能夠親身感受到澳門這個小城尚在的珍貴藝術。」 (雅辰酒店贈送月餅,月餅盒由本澳多位藝術家設計) 西洋書法體驗工作坊將於9月25日,10月9日及16日(星期六) 舉行;費用每位為380元,報名電話:66678217。 (書法家阿堅奴先生自製的沾水筆) (澳門字體設計學會在本澳也舉辦相關活動,讓更多人認識字體發展的歷史。)