搜尋

搜尋結果

澳門人玩信用卡 - 永亨銀聯鑽石 日常消費5%回贈
生活在我城
MO560・2019-10-27

澳門信用卡推薦 - 永亨銀聯鑽石 日常消費5%回贈! MO560 教你信用卡的正確玩法 -------------------- 1. 簡介 雖然澳門永亨信用卡的市場佔有率不算太高,不過投放在信用卡上的推廣優惠上並不差,用得適宜的話亦算是一個不錯的選擇,小編自己有時候都挺喜歡用的。 澳門華僑永亨的信用卡全部都是以現金回贈或積分的形式去「玩」的,一律不能儲亞洲萬里通里數。故此,對於飛行里數的玩家來說,永亨卡並不會是個好選擇喔,因為它不能帶你環遊世界、亦不能讓你在飛行時享受商務/頭等艙,更不用說任何的花式兌換。相反,如果你只想要簡單的現金回贈、不想花時間研究飛行里數、又或者不是經常去旅遊的話,永亨卡也許會成為你的好夥伴。 今次的主角 - 澳門華僑永亨銀行 銀聯鑽石信用卡,其實已經推出很久了,它並不是一張新卡,不過小編相信接下來的2020年還會繼續保持優惠。永亨銀聯鑽石主打日常消費5%回贈,包括超市、百貨公司、油站、電器店、電訊公司和週末泊車,十分推薦作為部份日常消費時使用的。有些時候遇到其他信用卡不適合的情況下,或是想開通PPS幫AE還款時,它亦是一個好選擇。 緊貼最新最潮澳門信用卡、飛行里數、旅遊資訊,就記得讚好MO560的Facebook! 如想查看更多詳情,請到MO560的網站查看。 -------------------- 2. 特點 2.1 指定類別10倍分﹝5%回贈﹞ 指定類別包括:超市、百貨公司、油站、電器店、電訊公司、週末泊車不設最低消費要求每月額外分上限為40000分﹝即MOP$200回贈﹞ 以上「指定類別」一律只適用於澳門本地的消費;「電訊公司」包括消費、繳費、自動轉帳;「週末泊車」指星期六、日於停車場及咪錶的消費。 所有以上指定類別的交易都有5%回贈!每月回贈上限為40000分﹝即MOP$200﹞,除非要購買大型、高價電器之外,否則都足夠應付每月日常消費了。 緊貼最新最潮澳門信用卡、飛行里數、旅遊資訊,就記得讚好MO560的Facebook! 如想查看更多詳情,請到MO560的網站查看。 -------------------- 2.2 餐飲2倍分﹝1%回贈﹞ 餐飲包括:本地食肆、海外食肆不設最低消費要求每月額外分上限為40000分﹝即MOP$200回贈﹞ 所有餐飲的交易都有1%回贈。每月回贈上限為40000分﹝即MOP$200﹞。這個優惠算是一般般啦,如果沒有其他卡可用的情況下才會考慮。 緊貼最新最潮澳門信用卡、飛行里數、旅遊資訊,就記得讚好MO560的Facebook! 如想查看更多詳情,請到MO560的網站查看。 -------------------- 3. 小編推薦的其他優惠 3.1 海外交易1.5倍分 所有澳門永亨的信用卡都享有海外交易1.5倍分不設最低消費要求不設上限 緊貼最新最潮澳門信用卡、飛行里數、旅遊資訊,就記得讚好MO560的Facebook! 如想查看更多詳情,請到MO560的網站查看。 -------------------- 3.2 消費送免費機場Lounge 永亨自己並沒有送Lounge!永亨自己並沒有送Lounge!永亨自己並沒有送Lounge!小編這裡提及的送機場Lounge是由銀聯自己提供的,銀聯送Lounge的政策每年都會變,2018是免費送3次港澳的,而今年的政策是 – 詳情 緊貼最新最潮澳門信用卡、飛行里數、旅遊資訊,就記得讚好MO560的Facebook! 如想查看更多詳情,請到MO560的網站查看。 -------------------- 4. 關於永亨銀聯鑽石信用卡的常見疑問 小編在MO560的網站中已經幫大家整理了一堆關於永亨銀聯鑽石的常見疑問,例如: 多倍分(5%回贈)相關問題。 每10000分換$50現金。 積分有效期。 年薪要求。 詳情請轉到MO560的網站中查看。 緊貼最新最潮澳門信用卡、飛行里數、旅遊資訊,就記得讚好MO560的Facebook! 如想查看更多詳情,請到MO560的網站查看。 -------------------- 喜歡小編的文章嗎?比個Like支持我啦 :) Facebook: MO560Instagram: mo560_travelWebsite: https://motravel.info 想追蹤最新最潮澳門信用卡、飛行里數、旅遊資訊?將MO560設定為 「搶先看/See First」!

澳門聖誕節吃喝玩樂懶人包2020
節慶盛事
Cheers!・2020-12-22

再過幾日就是聖誕節,如果大家還未想好如何慶祝聖誕節的話,一定要留意以下小編為大家預備好的澳門聖誕節懶人包2020,祝大家聖誕快樂 Merry Christmas! 【澳門聖誕大餐2020】自助餐、Fine Dine|高質餐廳推介! 澳門有這麼多間高質素餐廳,想必大家一定好難決定要去那間餐廳食聖誕大餐,所以小編精選了以下10多間高質素的澳門餐廳,有聖誕自助餐亦有套餐,一定有間啱您心意! 更多澳門高質餐廳推介:【澳門聖誕大餐2020】自助餐、Fine Dine|高質餐廳推介! 澳門聖誕節打卡熱點大合集2020|轉轉音樂盒/巨型聖誕樹/冬日嘉年華 食完聖誕大餐後當然要出去行一行,消化一下。澳門各區已經擺放了好多色彩繽紛的聖誕燈飾裝置,有巨型聖誕樹、會轉動的音樂盒、小朋友放電玩雪的地方等等,大家一於開心快樂地去影相打卡啦! 更多澳門聖誕打卡熱點推介:澳門聖誕節打卡熱點大合集2020|轉轉音樂盒/巨型聖誕樹/冬日嘉年華 2020聖誕美甲款式!手繪可愛、温柔唯美、成熟氣質,10款不同美甲風格推介! 聖誕節出去影相打卡,別忘記要為十隻指尖換上聖誕主題。小編特別為喜歡扮靚的女士們搜集了10款不同的美甲風格,其中有氣質超顯的「星光璀璨雪絨花」及走可愛手繪風格的「彩虹雲朵」,更多其他聖誕美甲款式的介紹可到這篇文章參考。 更多聖誕美甲款介紹:2020聖誕美甲款式!手繪可愛、温柔唯美、成熟氣質,10款不同美甲風格推介! 聖誕親子專題 澳門3間聖誕親子烘焙體驗班 臨近聖誕節,各位父母可能會為小朋友挑選聖誕禮物而煩惱,與其買玩具,不如和小朋友一齊參加烘焙體驗班。不但可以增進親子之間的感情,還可以培養小朋友的專注力和自信心。完成作品後還可以帶回家跟家人分享,齊齊過歡樂滿分的聖誕節。 更多澳門親子烘焙班介紹,請到這篇文章了解:聖誕親子專題 澳門3間聖誕親子烘焙體驗班 【聖誕禮物攻略】山羊、豬都可以送?今年的聖誕禮物也太特別了吧! 還未買聖誕禮物給朋友家人?不用擔心,還有時間。樂施會特別提供12份非常有意義的聖誕禮物,就連山羊和豬都可以送,為弱勢家庭提供幫助。這麼有意義的聖誕禮物,收到一定會份外開心。 更多特別有意義的禮物可到這篇文章了解:【聖誕禮物攻略】山羊、豬都可以送?今年的聖誕禮物也太特別了吧!

香港帝京酒店帝京軒。與朋友一起品嚐得獎口碑菜式
全球飲食
蘇蘇・2019-09-15

朋友約蘇蘇去旺角的帝京酒店吃飯聚舊,聽說早前酒店中餐廳帝京軒於HOFEX《2019年度香港國際美食大獎》榮獲三金兩銀一銅的獎項,還有他們的素菜也是做得很著名的,所以來嚐嚐呢。 Hofex 金獎醇酒盛宴 椰醋梨香花。梅酒醋魷魚。陳醋鮮鮑魚 很漂亮的擺盤,顏色漂亮得愛不釋手,單是眼觀都已經讓蘇蘇胃口大開,椰醋梨香花口感爽脆,吃過之後一口椰香,是很棒的開胃菜;那個通透的水晶球是用梅酒啫喱做成的,包裹著好像在翩翩起舞的螢光魷魚,捨不得的一口咬破它,口腔滿滿的都是甜甜酸酸的梅子香味;陳醋鮮鮑魚口感軟糯,新鮮可口。 Hofex 金獎醇酒盛宴 洛神花山藥。花雕蟹鉗凍。腐乳法式田螺 又是一道先讓眼睛先吃的菜式,就好像一幅畫一樣,蘇蘇很喜歡吃山藥(即新鮮淮山),記得之前在澳門某酒店的餐廳有一道很愛的藍梅山藥,甜甜的十分好吃,但後來因工序繁複就取消了。這個洛神花山藥外形好像花朵一樣,外層以洛神花汁浸泡而成的,味道是甘甜中带點微酸,口感是粉粉的但清新,很好吃。那個腐乳法式田螺很有驚喜,想不到腐乳配法式做法的田螺味道是很配合的。 青心席說 舞茸天婦羅。焦糖脆蟲草花。梅子鹽燒松茸 現在流行素食,既是環保也為健康,但想不到菇菌種類用天婦羅、焦糖脆和梅子鹽燒是很好吃的,味道也有很大的分別。 青心席說 海茸昆布淮山南瓜盅 蘇蘇很喜歡吃南瓜,這個南瓜盅也是素食的,用了海茸、昆布、淮山做湯料,口感層次豐富,還加上點點金箔,增添高貴。 青心席說 猴頭菇牛肝獅子頭 上海的獅子球蘇蘇吃很多了,也是喜愛的菜式之一,不過素食的還是第一次,用猴頭菇和牛肝菌打造而成的獅子球,如果服務員沒有說明,蘇蘇真的以為是真的豬肉未,碗子下還有明火暖著,很貼心呢。 Hofex 金獎醇酒盛宴 杏香芝心蝦棗。北海雲丹燒蝦頭。胡椒虎蝦球 其實就是大虎蝦三食,蝦頭加雲丹(即海膽)燒得香脆,用胡椒調味的虎蝦球,讓口中都是滿滿胡椒和爽口的蝦肉,還有用蝦肉手打而成的芝心蝦棗,喜歡吃蝦的朋友一定不要錯過。 不要看每一道的菜式都只是一點點的,吃到這裡我們已經很飽了,連點了的青菜也吃不下了。 不過有說甜品是另一個胃的,而且聽說這裡的甜品十分有特色,怎可以錯過呢? 青心席說 蝶豆花薏仁糕。脆豆腐花。桃膠栗子甘露 蝶豆花薏仁糕很漂亮啊,而且十分爽甜;桃膠栗子甘露是護膚良品,小小的一碗絕對沒有負擔,最特別就是脆豆腐花,想不到豆腐花可以做成這樣呢,一口咬下去外皮是脆脆的,裡面是嫩嫩的,很好吃啊!!! 得獎菜式果然名不虛傳,有創意又漂亮又好吃,而素菜方面以創新手法成名,透過食物表達對生命的一種態度與認知,大廚們真是花了不少心思,一邊分享一邊想念著,遲些時間要再去。 帝京軒 地址︰旺角太子道西193號帝京酒店3樓 電話︰+852 2622 6161 ~~~~~~~~~~ 更多各地吃喝玩樂、美容、潮流、旅遊、演藝、文化、生活或購物資訊、心情話語文章等,繼續以一文多發形式發放於中、港、澳三地多個高人氣時尚生活網站的專欄內,詳情請點擊蘇蘇的 新浪微博: 『蘇蘇的部落』http://www.weibo.com/susannakl/profile Facebook: https://www.facebook.com/sososusanna Instagram: http://instagram.com/sososusanna 時尚生活專欄和部落格: ELLE HK 台灣痞客邦 中國163.com。LOFTER 中國攜程氫氣球 (網站及手機Apps) 中國搜狐新聞網 (網站及手機Apps) 澳門人氣資訊網站CTM。LifeMag 聯絡及邀約: susannakL88@yahoo.com.hk

澳門四季酒店夏日海鮮盛宴
澳城餐飲
蘇蘇・2019-08-08

相對附近地區,在澳門的酒店內吃自助餐可謂是性價比最高,選擇繁多,豐儉由人,澳門朋友不是都與朋歡聚吃自助餐是平常事,外地來的朋友來澳門旅遊吃自助餐也是必會安排的節目。 今次想跟大家分享一下澳門四季酒店鳴詩餐廳的自助餐,該餐廳只提供自助餐,早、午晚都有供應,每隔3個月左右就會轉一次主題,所以每次去吃都有新鮮感,而鳴詩最著名的就是他們的海鮮和日式刺身,出品既新鮮又種類繁多,供應可以說是源源不絕。 蘇蘇和家人都很喜歡吃海鮮,但是如果一家人去餐廳吃,單是4人份量的海鮮盤至少也要兩千元(澳門幣) 吧,所以如果是去自助餐廳吃的,每人只是數百元,實在實惠很多,當然,最重要的是餐廳提供的海鮮質素非常不錯。 海鮮很豐富吧,生蠔、扇貝、鮑魚、大蝦、青口、螺,甚至麵包蟹和琵琶蝦都有供應,喜歡吃蟹黃的,一定會很滿足,這就是我喜愛這裡的原因。 品嚐海鮮又怎麼可以沒有香檳呢,來碰一杯味道更好。 沙拉吧和水果吧應有盡有,蘇蘇每次來都一定吃的火腿拼蜜瓜,還有小龍蝦沙拉、藜麥沙拉、自製凱撒沙拉等。 日本刺身和壽司一樣精彩,重點是十分新鮮。 燉湯也有兩款選擇,我選了人參燉烏雞滋補一下。 除了海鮮冷盤之外,海鮮的煮法也蠻多選擇的,而且是即點即煮啊! 選用多款鮮嫩的海鮮配以大廚李師傅特意從家鄉馬來西亞帶來的秘製調味,精心炮製了讓蘇蘇和家人垂涎的海鮮煲仔菜,包括法國螃蟹配阿薩姆酸辣魚醬煲及馬來西亞咖喱鮮蝦雞煲等。 蘇蘇發現了一件事,就是麵檔的配料讓我眼前一亮,別人家的大都是肉丸、豆腐乾、雲吞、蔬菜等,而這裡的是鮑魚、海班、大蝦呢! 熱盤還有很多很多的,好像葡式的、西式的、中式的、日式的、馬來西亞的等等,絕對是多不勝數,食物種類繁多,可惜的是蘇蘇的肚子容量有限,所以只能選自己喜愛吃的,以下的就是個人精選。 吃飽之後休息一會,先吃點水果,特別蘇蘇最愛的鳳梨,幫助消化一下,再接再厲。 最後就是自助餐的另一個重頭戲,四季酒店的葡撻、木糠布丁、葡式焦糖布丁、水果麵包布丁等招牌葡式甜品是不能不吃的,還有 Tiramisu、慕絲蛋糕、芝士蛋糕、水果忌廉蛋糕、朱古力噴泉、雪糕等,選擇非常豐富,這次還有炒雪糕呢,最後的最後,蘇蘇就是捧著大肚子回家去,之後只好更努力去做運動了。 一直以來,澳門四季的鳴詩自助餐廳都是蘇蘇和家人的澳門3大自助餐廳選擇之一,食物種類繁多不止,服務也是賓至如歸。不得不提,鳴詩自助晚餐每日只有一場,從晚上 6 時開始直到10時, 4個 小時任你的肚子發揮! 時間: 18:00-22:00 價格: 澳門幣638 + 10% ,12歲以下兒童澳門幣 319 + 10% (每次價格可能因為食物主題而稍作調整) ~~~~~~~~~~ 更多各地吃喝玩樂、美容、潮流、旅遊、演藝、文化、生活或購物資訊、心情話語文章等,繼續以一文多發形式發放於中、港、澳三地多個高人氣時尚生活網站的專欄內,詳情請點擊蘇蘇的 新浪微博: 『蘇蘇的部落』http://www.weibo.com/susannakl/profile Facebook: https://www.facebook.com/sososusanna Instagram: http://instagram.com/sososusanna 時尚生活專欄和部落格: ELLE HK ELLE CHINA 台灣痞客邦 中國攜程氫氣球 中國163.com。LOFTER 中國搜狐新聞網 (網站及手機Apps) 澳門人氣資訊網站CTM。LifeMag 聯絡及邀約: susannakL88@yahoo.com.hk

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框架會自行把登入者輸入的密碼與加密了的密碼作比較。