项目创建成功后,我们添加一个接口,用来获取登录用户信息,如下:
@RestController
public class UserController {
@GetMapping(“/user”)
public Mono getCurrentUser(Mono principal) {
return principal;
}
}
注意我们的返回值是 Mono<Principal>
,接口的参数也是支持 Mono<Principal>
的。
这就可以了,接下来我们启动项目,在启动的过程中,控制台就会打印出默认的用户密码,拿着默认的用户密码以及默认用户名 user 去登录,登录完成后就可以访问 /user
接口了,这个过程和普通的 Spring Security 用法并没有什么差异,所以我就不多说了,如果大家对普通的 Spring Security 用法还不熟悉,也可以看看松哥的新书《深入浅出 Spring Security》。
如果我们想配置基于内存的用户信息,该怎么配置呢?添加如下配置类即可:
@Configuration
public class SecurityConfig {
@Bean
MapReactiveUserDetailsService mapReactiveUserDetailsService() {
UserDetails ud1 = User.withUsername(“admin”)
.password(“{noop}123”)
.roles(“admin”)
.build();
UserDetails ud2 = User.withUsername(“zhangsan”)
.password(“{noop}123”)
.roles(“user”)
.build();
return new MapReactiveUserDetailsService(ud1, ud2);
}
}
只需要提供一个 MapReactiveUserDetailsService 实例即可。
MapReactiveUserDetailsService 实现了 ReactiveUserDetailsService 接口,ReactiveUserDetailsService 接口其实就跟我们以前的 UserDetailsService 接口的作用差不多;而 MapReactiveUserDetailsService 则类似于我们以前的 InMemoryUserDetailsManager,都是基于内存来管理用户的,理解了这一层,剩下的东西就好懂了。
我们在 MapReactiveUserDetailsService 中提供两个用户对象即可。
最后启动项目,此时 IDEA 控制台就不会输出默认生成的密码了,这个时候我们就可以直接使用 admin/123 或者 user/123 来进行登录了。
第一小节我们是在内存中配置用户,真正到了开发中我们还是需要从数据库中读取用户数据,所以接下来我们再来看一个基于数据库的配置。
首先我们先来大概看一眼数据库:
首先我们创建项目,这个时候要添加的依赖就比较多,除了 WebFlux 和 Spring Security 之外,还有 R2DBC 以及 MySQL 驱动,如下:
项目创建成功之后,在 application.properties 中配置数据库基本信息,如下:
spring.r2dbc.url=r2dbcs:mysql://localhost:3306/test01
spring.r2dbc.username=root
spring.r2dbc.password=123
如此之后,我们的准备工作就算完成了。
接下来我们创建 User 的实体类,老规矩,User 类需要实现 UserDetails 接口:
public class User implements UserDetails {
@Id
private Long id;
private String username;
private String address;
private String password;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Override
public String getUsername() {
return username;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
最后
我可以将最近整理的前端面试题分享出来,其中包含HTML、CSS、JavaScript、服务端与网络、Vue、浏览器、数据结构与算法等等,还在持续整理更新中,希望大家都能找到心仪的工作。
篇幅有限,仅展示部分截图: