所謂默認配置, 就是對Spring Security不作任何配置. 讓它的自動配置起做用. 目的是對Spring Security 的 默認行爲有一個初步的直觀的瞭解.
項目建立完成會自動生成一個應用入口類java
package com.example.demowebfluxsecurityinmemory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoWebfluxSecurityInMemoryApplication { public static void main(String[] args) { SpringApplication.run(DemoWebfluxSecurityInMemoryApplication.class, args); } }
package com.example.demowebfluxsecurityinmemory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Mono; import java.security.Principal; import java.util.Collections; import java.util.Map; @RestController public class UserController { @GetMapping("/") public Mono<Map<String, String>> hello(Mono<Principal> principal) { return principal .map(Principal::getName) .map(this::helloMessage); } private Map<String, String> helloMessage(String username) { return Collections.singletonMap("message", "Hello " + username + "!"); } }
mvn spring-boot:run 啓動, 會在控制檯輸出中看到一個水機生成的UUID格式的密碼:react
最後, 打開 http://localhost:8080/login 便可顯示登陸頁面, 默認用戶名稱爲 user. 到這裏, Spring Security 的默認設置的樣子就是這樣的, 現實場景中是不可能這麼簡單的. 所以咱們須要對它進行定製web
添加一個配置類, 以下:spring
package com.example.demowebfluxsecurityinmemory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; @Configuration public class SecurityConfig { @Bean public MapReactiveUserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("user") .roles("USER") .build(); UserDetails admin = User.withDefaultPasswordEncoder() .username("admin") .password("admin") .roles("ADMIN") .build(); return new MapReactiveUserDetailsService(user, admin); } }
如今重啓服務器, 就可使用自定義的用戶名和密碼登陸了. 安全
ReactiveUserDetailsService 是Webflux Security的一個核心接口, 表明了Spring Security 安全體系中的用戶信息, 它只有一個接口方法Mono<UserDetails> findByUsername(String username);服務器
做用: 該接口方法的做用是從各類存儲中獲取用戶信息. 經過該接口拿到了用戶的信息, 就能夠經過判斷用戶的狀態進行認證, 受權等操做.app
這個接口的做用就一個: 獲取 UserDetails 對象.ide
package org.springframework.security.core.userdetails; import reactor.core.publisher.Mono; public interface ReactiveUserDetailsService { Mono<UserDetails> findByUsername(String username); }
MapReactiveUserDetailsService 實現了 UserDetailsService 接口, 其 findByUsername 方法是從一個 Map 中去獲取 UserDetails 對象. 所以可以管理多個 UserDetails 對象.spring-boot
其實現代碼爲:ui
@Override public Mono<UserDetails> findByUsername(String username) { String key = getKey(username); UserDetails result = users.get(key); return result == null ? Mono.empty() : Mono.just(User.withUserDetails(result).build()); }