自己做的項(xiàng)目急需權(quán)限管理模塊猿妈,所以趕緊就著SpringSecurity的視頻看著學(xué)了學(xué),雖然上次學(xué)習(xí)失敗了,但也不影響這次從頭再來们衙,也算是為這次奠定了一點(diǎn)點(diǎn)基礎(chǔ)了吧。通過這次學(xué)習(xí)碱呼,我也又一次意識(shí)到了蒙挑,自己的學(xué)習(xí)和領(lǐng)悟能力有多么的弱,自己真的是水的一批愚臀,沒有天賦要更加努力才行忆蚀。
好了,進(jìn)入正題。
SpringSecurity認(rèn)證
首先大致的認(rèn)證流程就是:用戶請(qǐng)求過來蜓谋,經(jīng)過一系列的filter(AuthenticationFilter)來進(jìn)行過濾梦皮,如果符合哪個(gè)filter中所定義的請(qǐng)求url,就在filter中開始認(rèn)證流程桃焕,請(qǐng)求認(rèn)證Manager進(jìn)行認(rèn)證剑肯。(不同的請(qǐng)求比如 普通的登錄時(shí)/login,手機(jī)號(hào)登錄可能就是/smsLogin)
然后就會(huì)牽扯到下一個(gè)類观堂,也就是認(rèn)證管理器相當(dāng)于让网,大概名字叫做 AuthenticationManager,一看manager就知道是個(gè)管理者师痕。里面收攏了很多用來認(rèn)證的類溃睹,也就是各種各樣的Provider(認(rèn)證器)。在Manager中會(huì)遍歷每一個(gè)provider胰坟,看看能不能對(duì)當(dāng)前傳遞進(jìn)來的用戶信息進(jìn)行認(rèn)證因篇,可以的話就進(jìn)行到Provider中進(jìn)行認(rèn)證。
Provider中有著authenticate方法來對(duì)用戶信息進(jìn)行認(rèn)證笔横,這其中還包含了另一個(gè)實(shí)現(xiàn)竞滓,UserDetailService,通過這個(gè)Service來尋找對(duì)應(yīng)的用戶吹缔,我們的數(shù)據(jù)庫查找邏輯就是從這個(gè)service中進(jìn)入的商佑。通過service拿到用戶信息后,重新回到provider中進(jìn)行比對(duì)厢塘,比對(duì)成功了就算是認(rèn)證成功了茶没。
這其中貫穿的還有一個(gè)類用來保存用戶信息,在Security中默認(rèn)是叫UsernamePasswordAuthenticationToken晚碾,說是叫一個(gè)token抓半,就是用來保存信息的,在最一開始傳入filter的時(shí)候迄薄,也會(huì)生成一個(gè)對(duì)應(yīng)的登錄token琅关。
我們寫自定義的時(shí)候可以比對(duì)著官方給的類來臨摹,再結(jié)合著一些教學(xué)視頻來看讥蔽,還是比較好寫出來的涣易。
SpringSecurity鑒權(quán)踩坑
我寫好了登錄之類的之后,看了官方文檔有介紹說每個(gè)用戶可以有對(duì)應(yīng)的角色冶伞,可以針對(duì)角色來定義相應(yīng)的權(quán)限管理新症。然后我就東奔西找,死活沒找到角色是怎么定義的响禽⊥降可能也是我是第一次接觸這類權(quán)限管理框架的緣故荚醒,實(shí)在是迷。我的第一反應(yīng)是隆嗅,角色應(yīng)該被定義在數(shù)據(jù)庫中界阁,可是看了好多篇博客,都沒提數(shù)據(jù)庫的事胖喳。知道有RBAC權(quán)限管理這么回事泡躯,可是RBAC功能有點(diǎn)太過于強(qiáng)大,不是我要實(shí)現(xiàn)的目標(biāo)丽焊。较剃。。天吶技健,到底該把角色定義到哪里。后來終于翻到有的博客中寫到獲取用戶角色的方法 public Collection<? extends GrantedAuthority> getAuthorities()
,看著這個(gè)我也是摸不著頭腦删掀。纤子。想想有的人是在Security給定的User類的構(gòu)造方法中傳入一些角色泽论,但是我需要編寫自己的User實(shí)體類翼悴,構(gòu)造方法的方法也泡湯了鹦赎。古话。
中間還以為只要是登錄上的角色默認(rèn)都會(huì)加上角色杖们,可是試了試加上 @PreAuthorize("hasRole('USER')"),還是訪問不到孝治。
最后終于迷過來,自己寫的User類是實(shí)現(xiàn)了UserDetails接口的,里面是有上面提到的getAuthorities方法瓤介,只不過里面return了一個(gè)null,實(shí)際上是可以在這里面定義用戶邏輯的。因?yàn)槲业膽?yīng)用場(chǎng)景比較簡單琢锋,登錄上的角色都是User,所以直接在方法里返回了一個(gè)ROLE_USER
直覺告訴我缨睡,這么寫很不規(guī)范,應(yīng)該還是有其他的方法來設(shè)定角色的揍堰。還是再讀讀eladmin吧屏歹。