在第一篇的教程中,咱們簡單的瞭解了一下 SpringSecurity 的使用姿式,添加依賴,在application.yml
文件中加幾行配置,就能夠實現一個基本的登陸認證;git
默認的配置只能設置一個帳號,那麼若是須要多個帳號能夠怎麼支持呢?github
本文將介紹一下基於內存的認證方式spring
<!-- more -->app
基於內存保存認證信息的方式,本篇博文中,會介紹兩種常見的使用姿式ide
環境配置和前面一致,相關內容能夠參考博文: 191223-SpringBoot 整合 SpringSecurity 之起源篇(零)spring-boot
這裏主要是藉助SpringSecurity
的配置適配器來處理,下面是一個簡單的 case學習
@Configuration public class SecurityAdapterConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // 測試時,能夠直接用下面的方式 // User.UserBuilder builder = User.withDefaultPasswordEncoder(); User.UserBuilder builder = User.builder().passwordEncoder(passwordEncoder()::encode); auth.inMemoryAuthentication().withUser(builder.username("hui1").password("123456").roles("guest").build()); auth.inMemoryAuthentication().withUser(builder.username("hui2").password("123456").roles("guest").build()); } }
主要邏輯在 configure
這個方法中,可是須要注意,咱們額外的設置了密碼的加密方式, 當咱們不設置這個的時候,實際登陸的時候會發現,即使你輸入了正確的用戶名密碼,也會提示失敗(歡迎各位大佬實測一下)測試
@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }
其次,在建立用戶的時候,須要注意的是,除了設置了用戶名和密碼以外,還給用戶加上了一個角色,這個會在後續文章的 RBAC(基於角色的受權)中介紹它的做用ui
這裏介紹另一種方式,在後面的 db 中保存認證信息時,也會用到;在 SpringSecurity 的實現中,經過 UserDetailService 這個 bean 來根據用戶名查詢對應的用戶信息;因此咱們只須要實現一個咱們自定義的 Bean 來替換默認的,就能夠來實現咱們的目標
咱們的配置類以下
@Configuration public class SecurityAutoConfig { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } /** * 基於內存的認證方式 * * @param passwordEncoder * @return */ @Bean public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) { User.UserBuilder users = User.builder().passwordEncoder(passwordEncoder::encode); InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); manager.createUser(users.username("1hui").password("123456").roles("guest").build()); manager.createUser(users.username("2hui").password("666666").roles("manager").build()); manager.createUser(users.username("3hui").password("root").roles("admin").build()); return manager; } }
上面兩種方式,均可以實如今內存中保存認證信息,接下來咱們進入實測環節,首先寫一個 http 接口
@RestController public class IndexRest { public String getUser() { // 獲取用戶信息 Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); String userName; if (principal instanceof UserDetails) { userName = ((UserDetails) principal).getUsername(); } else { userName = principal.toString(); } return userName; } /** * @return */ @GetMapping(path = {"/"}) public String index() { return "hello this is index! welcome " + getUser(); } }
在實際測試時,上面兩種 case 都是 ok 的,下面的演示過程主要是基於第二種方式給出的示例
博文
源碼
盡信書則不如,以上內容,純屬一家之言,因我的能力有限,不免有疏漏和錯誤之處,如發現 bug 或者有更好的建議,歡迎批評指正,不吝感激
下面一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛