當先後端分離時,權限問題的處理也和咱們傳統的處理方式有一點差別。筆者前幾天恰好在負責一個項目的權限管理模塊,如今權限管理模塊已經作完了,我想經過5-6篇文章,來介紹一下項目中遇到的問題以及個人解決方案,但願這個系列可以給小夥伴一些幫助。本系列文章並非手把手的教程,主要介紹了核心思路並講解了核心代碼,完整的代碼小夥伴們能夠在GitHub上star並clone下來研究。另外,本來計劃把項目跑起來放到網上供小夥伴們查看,可是以前買服務器爲了省錢,內存只有512M,兩個應用跑不起來(已經有一個V部落開源項目在運行),所以小夥伴們只能將就看一下下面的截圖了,GitHub上有部署教程,部署到本地也能夠查看完整效果。git
項目地址:https://github.com/lenve/vhr github
上篇文章咱們已經把整個環境搭建成功了,而且配置好了資源和角色的動態分配,本文咱們主要來聊聊異常處理和密碼加密。 數據庫
本文是本系列的第三篇,建議先閱讀前面的文章有助於更好的理解本文: 後端
1.SpringBoot+Vue先後端分離,使用SpringSecurity完美處理權限問題(一)
2.SpringBoot+Vue先後端分離,使用SpringSecurity完美處理權限問題(二)服務器
密碼要加鹽處理,這是常識。各個權限處理框架對此都有不一樣程度的支持,Shiro、SpringSecurity都有自家的解決方案,SpringSecurity中有一個升級版的消息摘要:app
BCryptPasswordEncoder
使用BCryptPasswordEncoder,即便相同的明文,生成的新的加密字符串都是不同的,這樣能夠避免像在Shiro中那樣咱們本身配置密碼的鹽,SpringSecurity中使用BCryptPasswordEncoder的具體流程以下:框架
在用戶註冊時,咱們須要對密碼進行處理,處理方式以下:前後端分離
public int hrReg(String username, String password) { //若是用戶名存在,返回錯誤 if (hrMapper.loadUserByUsername(username) != null) { return -1; } BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); String encode = encoder.encode(password); return hrMapper.hrReg(username, encode); }
經過BCryptPasswordEncoder中的encode方法對密碼進行處理。 ide
當用戶註冊成功以後,存在數據庫中的密碼就像下面這樣: ui
密碼加密處理以後,登陸時候也要對密碼進行處理,修改WebSecurityConfig類的configure(AuthenticationManagerBuilder auth)方法,改成下面這樣便可:
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(hrService).passwordEncoder(new BCryptPasswordEncoder()); }
若是不是先後端分離,通常出了異常都很容易處理,直接跳轉到相關的錯誤頁面便可,如今先後端分離,出了異常,就不能再跳轉到錯誤頁面了,可是咱們能夠返回JSON呀!咱們能夠對服務端可能發生的異常進行統一處理。
舉個栗子:
當管理員想要刪除某一個角色的時候,若是該角色下尚有關聯的用戶或者資源,此時因爲數據庫中外鍵的約束會致使刪除失敗(個人業務邏輯就是如此,這裏小夥伴不要和我扯cascade
(*^_^*)
),當刪除失敗時,會拋出一個DataIntegrityViolationException異常,我將這種異常捕獲後統一處理。
自定義異常處理類CustomExceptionResolver,以下:
public class CustomExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse response, Object o, Exception e) { ModelAndView mv = new ModelAndView(new MappingJackson2JsonView()); Map<String, String> map = new HashMap<>(); map.put("status", "error"); if (e instanceof DataIntegrityViolationException) { map.put("msg", "該角色尚有關聯的資源或用戶,刪除失敗!"); } mv.addAllObjects(map); return mv; } }
在這裏接收到系統拋出的各類異常,判斷異常的類型,根據不一樣的類型,返回不一樣的提示,固然,我這裏只有一種狀況。
將CustomExceptionResolver註冊爲Bean就比較簡單了,能夠直接在類上添加@Component註解,也能夠經過Java進行配置,以下:
@Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Bean public CustomExceptionResolver customExceptionResolver() { return new CustomExceptionResolver(); } }
兩種方式任選一。
關注公衆號,能夠及時接收到最新文章: