搜尋

搜尋結果

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查看 srcmainjavaiogithubmacauyeahspringboottutorialspringbootwebapidatacontrollerHomeController.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 @RequestMappingquot;apiquot; public class HomeController @GetMappingquot;someRecorduuidquot; public Map readSomeRecord@PathVariable String uuid return Map.ofquot;retquot;, quot;your uuidquot; uuid; 準備我們的test case,但這次我們預期它應該要出現登入失敗的結果。 srctestjavaiogithubmacauyeahspringboottutorialspringbootwebapidatacontrollerHomeControllerTest.java @SpringBootTest @AutoConfigureMockMvc public class HomeControllerTest @Autowired private MockMvc mockMvc; @Test void testNoLogin throws Exception RequestBuilder requestBuilder = MockMvcRequestBuilders.getquot;apisomeRecord1234quot; .contentTypeMediaType.APPLICATION_JSON; this.mockMvc.performrequestBuilder .andExpectMockMvcResultMatchers.status.is4xxClientError .andExpectMockMvcResultMatchers.jsonPathquot;$.retquot;.doesNotExist .andDoMockMvcResultHandlers.print; 在我們執行上述的測試,test case 成功過了。我們的基本設定跟上一節其實沒有多大改動,為何現在http api會回傳狀態 401? 那是因為我們在依賴中加了,Spring Security,它配合了Spring Web,就會自動為所有api加入權限檢測。我們的測試中,沒有任何用戶登入,當然會出現 http 401。為了讓我們可以好好管理誰可以使用api,我們就來設定一定Security。 我們加一個WebSecurityConfig.java,暫時指定所有的訪問路徑都必需有USER權限,並且用 http basic的方式登入。 srcmainjavaiogithubmacauyeahspringboottutorialspringbootwebapidataconfigWebSecurityConfig.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 securityFilterChainHttpSecurity http throws Exception http.authorizeHttpRequestsauthorizeHttpRequests gt; authorizeHttpRequests.requestMatchersquot;quot;.hasRolequot;USERquot;; 所有的訪問路徑都必需有USER權限 ; http.httpBasicCustomizer.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.withUsernamequot;adminquot; .passwordpasswordEncoder.encodequot;passquot; .rolesquot;USERquot;.build; 我們在記憶中體,加入一個測試用的User,它的名字為admin,密碼為pass,權限為User return new InMemoryUserDetailsManageruser; 然後加入新的測試,直接模擬Role。結果是通過的。 srctestjavaiogithubmacauyeahspringboottutorialspringbootwebapidatacontrollerHomeControllerTest.java @Test void testLoginWithRoles throws Exception RequestBuilder requestBuilder = MockMvcRequestBuilders.getquot;apisomeRecord1234quot; .contentTypeMediaType.APPLICATION_JSON.with SecurityMockMvcRequestPostProcessors.userquot;someonequot; .rolesquot;USERquot;, quot;ADMINquot;; 沒有使用密碼,只使用Role this.mockMvc.performrequestBuilder .andExpectMockMvcResultMatchers.status.is2xxSuccessful .andExpectMockMvcResultMatchers.jsonPathquot;$.retquot;.valuequot;your uuid1234quot; .andDoMockMvcResultHandlers.print; 再來一個測試,改用密碼登入,分別輸入錯的和正確的密碼。 @Test void testLoginWithWrongPasswordAndNoRole throws Exception RequestBuilder requestBuilder = MockMvcRequestBuilders.getquot;apisomeRecord1234quot; .headerquot;Authorizationquot;, quot;Basic randompassquot; 輸入錯的密碼,應該回傳http 401 Unauthorized .contentTypeMediaType.APPLICATION_JSON; this.mockMvc.performrequestBuilder .andExpectMockMvcResultMatchers.status.is4xxClientError .andDoMockMvcResultHandlers.print; @Test void testLoginWithPassword throws Exception RequestBuilder requestBuilder = MockMvcRequestBuilders.getquot;apisomeRecord1234quot; .headerquot;Authorizationquot;, quot;Basic YWRtaW46cGFzcw==quot; http basic 就是把 adminpass 轉成base64 .contentTypeMediaType.APPLICATION_JSON; this.mockMvc.performrequestBuilder .andExpectMockMvcResultMatchers.status.is2xxSuccessful .andExpectMockMvcResultMatchers.jsonPathquot;$.retquot;.valuequot;your uuid1234quot; .andDoMockMvcResultHandlers.print; 最後,當然是正確的密碼才能通過。若果大家還是半信半疑,我們可以跑起真的正服務(IDE RUN或mvn springbootrun),然後用curl去試。 curl httplocalhost8080apisomeRecord1234 failed with 401 curl u quot;adminpassquot; httplocalhost8080apisomeRecord1234 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.withUsernamequot;adminquot; .passwordpasswordEncoder.encodequot;passquot; .rolesquot;USERquot;.build; return new InMemoryUserDetailsManageruser; springboottutorialspringbootwebapidatasrcmainjavaiogithubmacauyeahspringboottutorialspringbootwebapidataconfigUserServiceImpl.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 loadUserByUsernameString username throws UsernameNotFoundException 因為我們資料庫沒有資料,為了方便測試密碼的加密,我們在java code上直接插入一筆資料。 UserEntity defaultUser = new UserEntity; defaultUser.setUsernamequot;adminquot;; defaultUser.setPasswordpasswordEncoder.encodequot;passquot;; defaultUser.setRolequot;USERquot;; defaultUser.setUuidUUID.randomUUID.toString; userRepo.savedefaultUser; 上述為測試用插入資料,不應該出現在正式使用環境中。 UserEntity user = userRepo.findOneByUsernameusername .orElseThrow gt; new UsernameNotFoundExceptionusername quot; not foundquot;; 找找資料庫有沒有正在登入的該名使用者username List authorities = List.ofnew SimpleGrantedAuthorityquot;ROLE_quot; user.getRole; LOG.debugquot;got user uuid, username, role from databasequot;, user.getUuid, username, user.getRole; 如果前面的 findOneByUsername 有結果回傳,我們就給它一個ROLE_XXX的權限。 return new Userusername, user.getPassword, authorities; 這裏從沒有檢查過密碼是否有匹配,全部交給Spring Security去做 springboottutorialspringbootwebapidatasrcmainjavaiogithubmacauyeahspringboottutorialspringbootwebapidataentityUserEntity.java springboottutorialspringbootwebapidatasrcmainjavaiogithubmacauyeahspringboottutorialspringbootwebapidatarepoUserRepo.java 上述段落中,筆者省略了UserEntity和UserRepo,它們只是一般的springdatajpa概念,有需要可以經文末的連結查看完全原始碼。最需要注意的,是UserEntity的password欄位,在資料庫中是以加密的方式儲存。我們在配匹登入者與資料庫記錄時,也沒有自行檢驗密碼的需要。我們只是在加密過的密碼回傳給Spring Security,Spring框架會自行把登入者輸入的密碼與加密了的密碼作比較。

台北自助餐-響食天堂
全球飲食
Gloriaice・2016-11-03

年尾旅行旺季,台北是熱門首選旅行地 在台北當地有食過當地自助餐嗎? 對比港澳價錢真的經濟,食物味道質素不錯及種類較很多,位于台北信義ATT 4 FUN百貨6F 的饗食天堂 自助美饌 出發台北前預訂,一進門職員們接待進去,每位職員熱情的說 quot;歡迎光臨quot;,一走進大門內的時候看到大型的甜品櫃,裡面全是色彩繽紛甜品間直俘虜少女心! 空間隔出了好幾區位置,感覺一間間的大包廂,很適合多人聚會場合,店內還有靠窗座位,可以看見車水馬龍市區夜景,還可以看到台北101 店內環境古典歐式裝修,環境典雅精緻! 海鮮船盤,冷盤 當中船上有牛蟳,淡菜,海瓜子,花枝,小章魚,蝦蟹等 再加上以生菜仿水草的假植物妝飾,像一個大型海鮮水族箱 各種海鮮,熟食,刺身,烤鵝等,真是有種感覺走進美食嘉年華一樣,今晚與好友真的要吃過夠,肥死都沒所謂的境界,活著就是吃得快樂! 當晚吃得最多的都是刺身類,還有罕有的生牛刺身 生牛刺身很Juice,一點都不像生,口感有點像炭燒感,真的超級回味. 當中有饗食天堂2016季節限定新菜,韓式鮮蚵等小食盤,多款特式壽司 熱食區多款菜色選擇,還有圖上的烤鴨!現場即時製作 還有多款熱湯,有中式,日式等 沙拉,生果,果汁 多種蛋糕,芝士,甜品,還有現炒雪糕 飯後可在ATT內走走,有很多賣衣服,精品等商戶。 海外客人可以email響食天堂客服預訂及詢問~(響食天堂在台還有其他分店)感謝今次為我服務的客服及現場工作人員服務用餐~個人口味,不同人有異)#台北市信義商圈 #響食天堂 #ATT4FUN #台北自助餐午餐星期一至五11301400 NT698下午茶星期一至五14201620 NT538 晚餐星期一至五 17302130 NT798 週六日例假午餐11301400 NT798下午茶14201620 NT638晚餐17302130 NT898(以上價格是一位價錢另需加10%服務費) 專頁:httpswww.facebook.comeatogether地址:台北市信義區松壽路12號6樓ATT 4 FUN百貨6F官網:httpwww.eatogether.com.twshop.phpmID=1amp;sub=1amp;shopID=10預訂:service@eatogether.com.twATT4FUNhttpwww.att4fun.com.tw

[大和見聞] 九州特色列車 - 「翡翠山翡翠」 with 熊本市
走遍世界
君尋・2020-08-10

續上篇。 結束在別府短暫的旅程。筆者再次乘坐特色列車「九州橫斷特急」。這次的目的地是阿蘇。 由於當時九州橫斷特急全線仍未復運(因早幾年的熊本地震),筆者無法按原定的鐵道路線,直接由別府坐火車到熊本,須由阿蘇轉乘旅遊巴出發到熊本。不過現在已經恢復正常了。 人煙稀少的阿蘇站 除筆者外亦有很多人在阿蘇坐巴士到熊本 阿蘇一望無際的環境,多數遊客都會用自駕遊方式到此一遊 第二天在熊本市內遊玩,去了仍在整修中的熊本城,及到熊本熊Square和部長見面,當然還有著名的商店街。 正在進行擴建工程的熊本站 期間限定的風景,維修中的熊本城 很多可以參觀的地方和路線都在進行維修工程 在熊本熊square與熊本熊會面 熊本市內的其中一主要交通工具路面電車 當然不能不來商店街 隔天早上便乘另一列特色列車「翡翠山翡翠」,由熊本往南向人吉出發。 列車:特色列車「翡翠山翡翠」 路線:熊本縣熊本市 gt; 熊本縣人吉市 乘搭時期:2018年夏 「翡翠山翡翠」以兩種飛越人吉地區的雀鳥翡翠和山翡翠為主題命名,因此列車上的裝潢都看到兩種雀鳥的身影。而以兩輛車廂構成的「翡翠山翡翠」,前後車廂分別以深綠和深藍色為主色調,一邊代表翡翠,另一邊代表山翡翠,非常有意思。 前方車頭的山翡翠 車廂側身印上代表列車主題的兩種雀鳥 內裡裝修亦非常豪華 滿滿特色的內裝 另一側車廂的翡翠 關於人吉及另一列特色列車 SL人吉,可參考這篇文章 特色列車之旅仍會繼續下去... To be continued...... 關於大和見聞 本欄目專門分享筆者遊日的心得記錄,包括但不限於古城、列車、食物、各類型的觀光景點。

【日本。四國自駕】<活動> 德島祖谷 Forest Adventure 新體驗 ~ 非常適合親子活動 齊來親親大自然!
走遍世界
80後愛旅行✈️・2020-01-22

去德島縣祖谷,大家都必定會去「祖谷藤蔓橋 」這個景點! 在這裡再為大家介紹一個「祖谷藤蔓橋 」附近的一個全新景點,是一個集多項活動於一身,能夠讓大人小孩玩一整天的地方 「Forest Adventure」。 「Forest Adventure」是一個以森林歷險為主的森林遊樂品牌,在日本已有超過三十個地方有它的設施,從北海道到沖繩都有~ 祖谷的「Forest Adventure」是在2017年7月才開幕的,網上的資料不多, 我們也是開車過路時才發現的,因為覺得十分適合親子活動,所以決定回來一定要介紹給大家!! 「Forest Adventure」祖谷是在祖谷ふれあい公園内,大門就很有大自然的感覺!! 進去後看到「Forest Adventure」有很多不同的戶外活動用品,例如:攀爬、飛索等的用品。 在剛剛的地方跟工作人員說了我們想玩小卡車後,就跟著工作人員走過這條「祖谷ロマン橋」。 這條連接「Forest Adventure」主樓和玩小卡車的「祖谷ロマン橋」, 我覺得稱為「天空之橋」一點也不為過,在這橋上看出去的風景超美的~ 走過「祖谷ロマン橋」後,我們來到了對岸!你沒看錯,這裡養的不是小狗 而是羊 好可愛 直接在自動機上買票,然後把票給工作人員就可。 大人 500 円 小孩 300 円 當時就只有我一個乘客  工作人員把小卡車調回閘口 上車囉~一輛小卡車最多可以坐2個人,有小孩的話可以一前一後坐。 最大乘載量是140KG 閱 讀 全 文

YouTube 官方APP都可以下載影片!?
手機‧電玩
細佬搵唔到食・2018-01-25

由於網絡的發展,相信大多數年輕人每晚看電視的次數越來越少,ldquo;煲劇ldquo; 都逐漸透過網絡形式來觀看。 YouTube 更加是各位大小朋友每一晚視聽娛樂必備APP之一, 細佬今天發現YouTube 官方APP 在澳門 支援 rdquo;影片下載ldquo; 這一項功能。對於某些人來說,這是一個很好用的功能,因為可以節省大量數據流量。 看看下載功能如何使用: 1. 下載 新功能提示 今天開啟YouTube 時發現 ldquo;下載ldquo; 的相關說明。 2. 下載 影片 點擊 quot;下載quot; 便開始下載影片,APP會提供可下載影片的解析度以供選擇。 3. 正在下載 APP會提示影片 quot;正在下載quot;,耐心等候完成下載。 4. 查看離線影片 下載的影片可以在下方的 quot;媒體庫quot; 中的 quot;離線供應quot; 查看已下載的影片,亦可在這移除已下載的影片,節省手機空間。 5. 使用制限 離線下載的影片都有一些的限制,例如: 1. 已下載的影片需要每2日連線互網網一次後才能觀看。 2. 只能在YouTube APP內觀看影片。 3. 地區限制 (據香港朋友說,已更新至最新版本但還是未有下載按鈕)。 4. 具版權的內容可能無法下載,MV類影片通常都無法下載。 5. 據APP顯示目前APP已下載的影片品質最高為720P 細佬使用的版本為13.02.9iOS app, 但查看其他較舊的版本(如12.42發現都支援下載功能。 PS. 朋友的留言: . 今次真係唔買256GB都唔得。 . 終於唔洗用網站轉碼下載YouTube。 大家又覺得YouTube這個功能實用嗎?

愛吃女孩必須私藏!五間低脂淘寶零食店推介!
專題報導
Lifemagfoodie・2020-09-25

愛吃的女孩不一定會胖,因為她們都懂得選擇低糖低卡的零食,就算「減肥」是終身事業,但偶爾也可以用美食慰勞一下自己!以下介紹幾款淘寶低卡零食,總有一款你會喜歡! KETO鋪子 這是一間以生酮食物為主的店鋪,食物都是低卡低碳,以及全麥的烘焙類食品。店內有不同款式的低卡蛋糕、麵包、飯團主食等等。不但款式選擇多,味道也非常好吃! 這個巧克力派有紅絲絨草莓榴蓮抹茶多種口味,裹面的蛋糕不是用麵粉做的,大大減低碳水的吸收,無糖無油不容易發胖!每個大約247272kcal。(售價:yen;36一份三個) 這個伯爵奶凍班戟同樣沒有添加麵粉和糖,但卻有濃濃的伯爵奶茶香味,一份大約172 kcal (售價:yen;16.9個) 元氣森林 最近蹿紅的元氣森林主要出品無糖、低熱量的飲品,最受歡迎的莫過於氣泡水系列,0糖0脂肪0卡路里的汽水,真的吸引不少因為怕肥戒喝汽水的朋友,口味選擇也不少! 香甜的蜜桃味和清新的卡曼橘口味,令人一試愛上!(售價:yen;69.912瓶) 薄荷健康旗䚀店 說到健身App,薄荷健身也可以說是十分有名。薄荷品牌亦自家出品了不少輕卡零食,比較推介雞胸肉腸、雞胸肉丸和豆乳威化,每款都可以仔細計算熱量,除此之外更有21天減肥餐,選擇範圍非常多! 低脂雞胸肉腸是薄荷的明星產品,低脂零淀粉高蛋白十分吸引,口感偏硬。(售價:yen;902袋) 這款豆乳威化使用果糖替代白砂糖,每袋不到77kcal, 一個蘋果熱量都沒有,負擔更少!(售價:yen;25袋) 盒子實驗室 這款顏值超高的盒子蛋糕,在低卡蛋糕界亦有不少名氣!很適合很愛吃蛋糕但又很想要減肥的女孩。最有名的有豆乳蛋糕、蜜桃烏龍蛋糕、荔枝玫瑰蛋糕等,口味十分多! 最有名的豆乳盒子蛋糕,豆乳順滑而又融合芝士香味,口感輕盈而且熱量低!(售價:yen;25盒) 這款蜜桃烏龍蛋糕層次十分豐富,有烏龍慕斯、蜜桃果肉,蜜桃慕斯,味道清甜又有清新茶香,重點是低卡低糖!(售價:yen;35.5盒) 衛龍魔芋爽 喜歡吃辣的話真的要試一下!這款魔芋爽真的很誘人,三種辣味包括香辣、酸辣和麻辣,由0脂肪的魔芋制成,一包只要約26kcal,差不多是蘋果的一半熱量!這款魔芋爽在澳門很多超市也可以買得到,去超市的時候不妨買一包試試!(售價:yen;26.9盒) 作者:Dororo

天然保養SOS!教你車厘子對抗曬斑
美容
Chrysalids 少爺・2017-07-18

夏日放縱地跟陽光玩遊戲的後果,就是曬斑雀斑統統現形!塗美白產品固然有效,然而市面不少產品所含的美白成分都可能有刺激性,敏感肌膚使用可能會有反效果。這個時候,自製天然護膚會是最佳選擇。 說到天然淡斑,檸檬雖有美白功效,但刺激度高。香甜的車厘子則比較溫和,當中的維他命A含量比蘋果及葡萄高4倍,所含蛋白質、胡蘿蔔素及維仔命C都比蘋果及梨高。常用車厘子汁塗面及皺紋處,有效抵抗黑色素形成,幫助去皺退斑。而且車厘子含有維他命K,能補血益氣,令面色紅潤嫩白。就等小編教大家用車厘子退斑! 蜂蜜車厘子泥面膜 針對皮膚狀況︰戶外曝曬導致的曬斑、血液循環不順導致面色無光澤、熬夜導致膚色暗啞。 材料︰車厘子5粒、蜂蜜1茶匙、麵粉半茶匙。 做法︰車厘子去核,將果肉搗爛成泥,加入蜂蜜、麵粉及少量純淨水拌勻成泥膜。 用法︰早晚潔面後,將調成糊狀的泥膜均勻敷上面,避開眼部,待10至15分鐘後消洗。 車厘子杏仁泥面膜 針對皮膚狀況︰戶外曝曬導致曬斑、曬後敏感泛紅的皮膚。 材料︰車厘子5粒、杏仁5粒、雞蛋1隻。 做法︰車厘子洗淨去核,杏仁洗淨去皮,將杏仁和車厘子果肉搗爛成泥,加入蛋白拌勻成泥膜。 用法︰潔面後將泥膜均勻敷上面,盡量敷厚一些,待10至15分鐘後消洗。 以上文章及圖片均轉載自網路,所有版權歸原作者所有 原文地址:httpwww.msn.comzhhklifestyle