前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WebFlux 和 Spring Security 会碰出哪些火花?

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

作者头像
江南一点雨
发布于 2021-07-15 07:27:42
发布于 2021-07-15 07:27:42
1K00
代码可运行
举报
文章被收录于专栏:玩转JavaEE玩转JavaEE
运行总次数:0
代码可运行

松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程


WebFlux 系列松哥已经连着写了十几篇了,Spring Security 系列之前更是发了 68 篇(公号后台回复 ss 获取系列教程),不过之前这两个教程都是分开讲的,还没有把这两个融合到一起讲过。

随着 WebFlux 的发展,我们有必要来了解下在响应式编程中如何使用 Spring Security。今天松哥就通过一个简单的案例来和大家分享下如何在 WebFlux 中使用 Spring Security。

1.基于内存的使用

先来看一个简单的,就是把用户信息保存在内存中。

首先我们来创建一个新的项目,引入 WebFlux 和 Spring Security 依赖,如下:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class UserController {
    @GetMapping("/user")
    public Mono<Principal> getCurrentUser(Mono<Principal> principal) {
        return principal;
    }
}

注意我们的返回值是 Mono<Principal>,接口的参数也是支持 Mono<Principal> 的。

这就可以了,接下来我们启动项目,在启动的过程中,控制台就会打印出默认的用户密码,拿着默认的用户密码以及默认用户名 user 去登录,登录完成后就可以访问 /user 接口了,这个过程和普通的 Spring Security 用法并没有什么差异,所以我就不多说了,如果大家对普通的 Spring Security 用法还不熟悉,也可以看看松哥的新书《深入浅出 Spring Security》。

如果我们想配置基于内存的用户信息,该怎么配置呢?添加如下配置类即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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 中配置数据库基本信息,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring.r2dbc.url=r2dbcs:mysql://localhost:3306/test01
spring.r2dbc.username=root
spring.r2dbc.password=123

如此之后,我们的准备工作就算完成了。

接下来我们创建 User 的实体类,老规矩,User 类需要实现 UserDetails 接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

    @Override
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

接下来创建 UserRepository:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface UserRepository extends ReactiveCrudRepository<User,Long> {
    Mono<UserDetails> findUserByUsername(@Param("username") String username);
}

增加了一个 findUserByUsername 方法,用来根据用户名查找用户对象。

接下来定义 UserService,这次需要我们自己实现 ReactiveUserDetailsService 接口,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
public class UserService implements ReactiveUserDetailsService {

    @Autowired
    UserRepository userRepository;
    @Override
    public Mono<UserDetails> findByUsername(String username) {
        return userRepository.findUserByUsername(username);
    }
}

UserService 实现了 ReactiveUserDetailsService 接口,并重写了 findByUsername 方法,这个类似于我们之前重写 UserDetailsService#loadUserByUsername 方法。

这里记得将 UserService 注册到 Spring 容器中,接下来就不需要额外的工作了。

配置完成了。

接下来我们启动项目,此时就可以通过数据库中的用户进行登录了。

3.小结

好啦,今天就通过两个简单的小案例,带领小伙伴们体验下 WebFlux+Spring Security 的用法,当然这里还有很多使用细节,在接下来的文章中松哥再和大家一一介绍。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 江南一点雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【微信投诉答疑】我的微信帐号被封了,咋办?
近期有不少用户在公众号询问微信投诉的相关事宜,本期,小助手为大伙儿讲解几个常见的疑惑。腾讯举报中心也欢迎广大用户在公众号留言,小助手会根据留言情况,在下期进行详细解答。
腾讯举报中心
2020/02/25
2.6K1
QQ举报第三季度打击公示
腾讯举报中心作为QQ举报的官方受理渠道,致力于与用户共同打造一个健康、绿色的网络环境,日常除了提供QQ、微信和腾讯社交平台上各类违法违规行为的举报入口和举报受理外,还成立一系列违法犯罪举报专项,协助警方完成案件侦破和落地打击。
腾讯举报中心
2020/02/25
1K0
【QQ举报答疑第二期】进阶吧,举报!
自从小助手推出举报答疑以来,粉丝们十分热情,各类问题纷涌而来。本期,小助手选取了部分用户的问题进行答疑,希望大家对在举报的道路上继续进阶!共同守护好网络世界的晴朗天空。
腾讯举报中心
2020/02/25
8190
了解血腥暴恐有害信息
1、传播煽动宗教极端思想、主张以暴力手段危害他人生命和公私财产安全、破坏法律实施等内容的音视频。
腾讯举报中心
2020/02/25
2K0
朝阳群众,你关注的问题,答案都在这里!
近期,后台很多粉丝留言想要咨询举报相关的问题,为此小助手特意整理了一份官方版举报攻略,希望大家大伙儿和小助手共同携手打造一个干净的网络世界。
腾讯举报中心
2020/02/25
1.1K0
了解色情低俗有害信息
2、发送以色情为目的的情色文字、情色视频、情色图片、情色漫画等内容,但不限于上述形式;
腾讯举报中心
2020/02/25
2.4K0
他一开口,我就嗅出了骗子的味道!
事情的经过是这样的:暑假到了,王女士鼓励孩子响应学校号召,通过参加暑期社会实践理解父母工作的艰辛。考虑到不想让孩子做太辛苦的体力活,她便鼓励孩子在网络上找找轻松的兼职,结果孩子上周不幸被骗了298元。
腾讯举报中心
2020/02/25
1.2K0
了解违法暴力有害信息
老何不小心把刚从银行取的10000元钱弄丢了,担心妻子责骂,他就想通过网络买一些假币蒙混过关。老何在网络上看到一则宣传,便加了对方的QQ,老何表示了自己的担忧,但对方却发来各类图片和视频证据,从肉眼来看几乎可以以假乱真。老何动心了,付款1000元,约定好发货。左等右等,最后等来一堆白纸,最终老何选择了报警,老何也认识到自己的错误。
腾讯举报中心
2020/02/25
6250
了解政治敏感有害信息
若在QQ上发现政治敏感有害信息,请在客户端直接进行举报。一经发现,腾讯将根据情节进行删除违规信息、警告、限制或禁止使用部分或全部功能直至永久封号的处罚,并有权公告处理结果。
腾讯举报中心
2020/02/25
4.8K1
了解贩卖野生物及制品有害信息
1、禁止非法猎捕、杀害国家重点保护的珍贵、濒危野生动物的,或者非法收购、运输、出售国家重点保护的珍贵、濒危野生动物及其制品。
腾讯举报中心
2020/02/25
4060
听说你的微信被恶意举报了?
一哥在前面也说过了,每一次投诉都会经过系统和人工的严格审核。而在系统和人工的审核标准中都没有“举报次数”这样的评判依据。因此不用担心被人恶意举报的问题。
腾讯举报中心
2020/02/25
9.9K1
QQ冒充好友的都是什么鬼?
仿冒好友:指犯罪分子通过仿冒好友QQ信息,设置骗局,以诈骗为目的,对受害人实施远程、非接触式诈骗,诱使受害人给犯罪分子打款或转账的犯罪行为。
腾讯举报中心
2020/02/25
1.4K0
如何防止网络诈骗
网络诈骗是指犯罪分子通过编造虚假信息,设置骗局,对受害人实施远程、非接触式诈骗,诱使受害人给犯罪分子打款或转账的犯罪行为。
腾讯举报中心
2020/02/25
1.4K0
了解自杀自残有害信息
自杀自残举报标签是指不法分子利用QQ平台,传播消极的思想内容,教唆他人自杀、自残的言行。对于情绪的消沉、悲观厌世、有自杀企图的部分抑郁症患者,有的甚至延展到线下实施,严重危害到他人的生命安全。
腾讯举报中心
2020/02/25
8660
了解侵犯公民个人信息
侵犯公民个人信息是指以窃取或者其他方法非法获取国家机关或者金融、电信、交通、教育、医疗等单位在履行职责或者提供服务过程中获得的公民个人信息,出售或者非法提供给他人,情节严重的行为。根据刑法规定,犯本罪的,处三年以下有期徒刑或者拘役,并处或者单处罚金。
腾讯举报中心
2020/02/25
6660
教你识别金融红包类欺诈
金融欺诈:是指骗子通过虚假办理信贷类金融产品或以高额回报理财产品为诱饵,骗取用户钱财的欺诈行为。
腾讯举报中心
2020/02/25
8570
关于打击QQ平台野生动物交易行为的公告
1月26日,中国疾控中心在武汉华南海鲜市场检测出大量新型冠状病毒,检测报告显示该病毒来源于市场所销售的野生动物。此前,钟南山院士公开指出:新型冠状病毒较大可能是通过野生动物传到人的。李克强总理在部署疫情防控工作时,也曾强调要“把好野生动物管控关口,坚决遏制疫情蔓延。”
腾讯举报中心
2020/02/25
6590
想在绝地求生优雅吃鸡?先问问骗子同不同意...
要说时下最火爆的竞技游戏,一定非“绝地求生”莫属了。借着“游戏直播”的春风,全国“吃鸡”游戏风靡,玩家们不是在“吃鸡”,就是在“吃鸡”的路上。
腾讯举报中心
2020/02/25
9780
听说你的QQ被“恶意举报”了?
有网友通过公众号发来求助,说自己遇到了奇葩事,有陌生人加他好友,还威胁他不给钱就举报!然而,再深的套路也逃不过小助手的火眼金睛,经鉴定,这位网友,你是被坏人“恶意举报”了。
腾讯举报中心
2020/02/25
6K2
腾讯举报零容忍丨“侵犯未成年人权益”专属标签上线!
近日,全国“扫黄打非”办公室公布多起涉儿童色情信息典型案件,这些案件,无不牵动着社会大众的神经。网络黑产人员将侵犯未成年人的照片、视频上传网络甚至是进行贩卖。这不仅给未成年人身心健康带来极大创伤,更不利于网络环境的健康发展。
腾讯举报中心
2020/02/25
1.2K0
相关推荐
【微信投诉答疑】我的微信帐号被封了,咋办?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验