遇到的問題
將spring security oauth2(包括spring security)升級到最新,代碼沒有改動,運行項目沒有報錯,可是頁面登錄時報錯:There is no PasswordEncoder mapped for the id 「null」html
而後一頓百度和google,其中看到兩處有幫助的資料:
http://www.javashuo.com/article/p-odcvddzw-md.html
https://spring.io/blog/2017/11/01/spring-security-5-0-0-rc1-released前端
總的來講就是,人家把spring security的密碼存儲格式改了,沒辦法,用人家的東西就要按照人家規定的作,將全部的密碼格式改掉吧。java
格式:{id}encodedPasswordspring
這id是一個標識符,用於查找是哪一個PasswordEncoder,也就是你密碼加密的格式所對應的PasswordEncoder。encodedPassword是指原始加密後的密碼(有點繞,簡單來講就是你原來存儲的密碼)。在id必須在密碼的開始,id先後必須加{}。若是id找不到,id則會爲空。
spring security中的全部默認的密碼格式都是在PasswordEncoderFactories這個 類中,能夠進入這個類中自行查看。數據庫
注意:
1. 前端發送的登錄密碼,是不須要爲{id}encodedPassword格式的。
2. 若是你配置了spring security oauth2安全
@Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory().withClient("client").secret("{noop}secret") .authorizedGrantTypes("client_credentials", "password", "refresh_token").scopes("all"); }
代碼中的secret也必須{id}encodedPassword格式。app
https://blog.csdn.net/smollsnail/article/details/78934188ide
情景:oop
在一個後臺admin系統中,爲了安全用到Spring Security,我開啓了in-memory方式(就是登錄後,在內存中先認證,是否內存中寫死的帳號是否就是用戶登陸的那個帳號,密碼),可是又在其後面加入了「從數據庫中查找出該帳號是否存在」,這種認證方式。google
在這兩種方式下,我登陸,先輸入一個在數據庫中存在的帳號,顯示,正常登陸進來。
又一次登陸後,我輸入一個在數據庫中找不到可是在內存中寫死的帳號,系統報異常,可是正常登陸進來。
再一次登陸後,我輸入一個既不在數據庫中,也不在內存中的帳號,此次,真登陸不了了。
那麼,這是否是就證實了,在這兩種方式下,默認先去數據庫中查找,而後無論成功與否「或上」(||)是否爲內存中的帳號。
https://blog.csdn.net/u012582402/article/details/54292488
https://blog.csdn.net/y666666y/article/details/70212064
https://www.baeldung.com/spring-security-5-default-password-encoder