WebFlux 和 Spring Security 会碰出哪些火花?

项目创建成功后,我们添加一个接口,用来获取登录用户信息,如下:

@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 来进行登录了。

2.基于数据库的使用


第一小节我们是在内存中配置用户,真正到了开发中我们还是需要从数据库中读取用户数据,所以接下来我们再来看一个基于数据库的配置。

首先我们先来大概看一眼数据库:

首先我们创建项目,这个时候要添加的依赖就比较多,除了 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、浏览器、数据结构与算法等等,还在持续整理更新中,希望大家都能找到心仪的工作。

篇幅有限,仅展示部分截图:

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值