所谓默认配置, 就是对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()); }