Spring Security(6)

news2024/11/26 22:34:17

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~

Spring Security使用MySQL保存cookie记录虽然方便,但是目前更多的主流互联网应用都是用NoSQL来保存非业务数据的,Spring Security也应该可以实现这个功能。之前Spring Security官方并不支持使用NoSQL来保存cookie,但这个问题对于一个爱钻研的码农来说应该只是个小CASE——毕竟只要有代码,就没有搞不定的问题——受JdbcTokenRepositoryImpl的启发,查看其源码,可以发现JdbcDaoSupport只是用来提供数据源,无实际意义,而PersistentTokenRepository才是要实现的接口。

JdbcTokenRepositoryImpl的源码非常简单,看懂了就能照着写出Mongo的实现。题外话:阅读源码是个能够很快提高开发能力的捷径,如Spring框架、Spark源码等等。

下面就来开始咱们的NoSQL改造DIY。

首先安装并运行mongodb(我用的是mongodb-4.2.6),可以是虚拟机,也可以是Docker。

再修改项目的pom.xml文件,增加mongodb依赖:

 

通过模仿JdbcDaoSupport,来自定义自己的MongoDaoSupport:

/**
 * MongoDaoSupport
 *
 * @author 湘王
 */
@Component
public class MongoDaoSupport<T> {
    @Autowired
    private MongoTemplate mongoTemplate;

    // 插入数据
    public boolean insert(PersistentRememberMeToken token) {
        if (Objects.isNull(token)) {
            return false;
        }

        Object object = mongoTemplate.save(token);
        if (Objects.nonNull(object)) {
            return true;
        }

        return false;
    }
}

然后再在MongoDaoSupport中增加两个重要的方法,让它支持Mongodb:

    // 查询数据
    public PersistentRememberMeToken getTokenBySeries(String series) {
//        // 如果是通过字符串方式诸葛插入字段值,那么通过mongoTemplate.findOne()得到的就是一个LinkedHashMap
//        LinkedHashMap<String, String> map = (LinkedHashMap<String, String>) mongoTemplate
//                .findOne(query, Object.class, "collectionName");
//        return new PersistentRememberMeToken(map.get("username"), map.get("series"),
//                map.get("tokenValue"), DateUtils.format()map.get("date"));
        Query query = new Query(Criteria.where("series").is(series));
//        // 这里原路返回PersistentRememberMeToken对象,不会是LinkedHashMap
//        Object object = mongoTemplate.findOne(query, PersistentRememberMeToken.class);
//        return (PersistentRememberMeToken) obejct;
        return mongoTemplate.findOne(query, PersistentRememberMeToken.class);
    }

    // 更新数据
    public boolean updateToken(String series, String tokenValue, Date lastUsed) {
        Query query = new Query(Criteria.where("series").is(series));
        Update update = new Update();
        update.set("tokenValue", tokenValue);
        update.set("date", lastUsed);
//        // 这里不能用DateUtils.parse(new Date()),否则getTokenBySeries()方法会抛出非法参数异常
//        update.set("date", DateUtils.parse(new Date()));
        Object object = mongoTemplate.updateMulti(query, update, PersistentRememberMeToken.class);
        if (Objects.nonNull(object)) {
            return true;
        }
        return false;
    }

然后再定义MongoTokenRepositoryImpl:

/**
 * 自定义实现token持久化到mongodb
 *
 * @author 湘王
 */
public class MongoTokenRepositoryImpl implements PersistentTokenRepository {
    @Autowired
    private MongoDaoSupport<PersistentRememberMeToken> mongoDaoSupport;

    @Override
    public void createNewToken(PersistentRememberMeToken token) {
        mongoDaoSupport.insert(token);
    }

    @Override
    public void updateToken(String series, String tokenValue, Date lastUsed) {
        mongoDaoSupport.updateToken(series, tokenValue, lastUsed);
    }

    @Override
    public PersistentRememberMeToken getTokenForSeries(String series) {
        return mongoDaoSupport.getTokenBySeries(series);
    }

    @Override
    public void removeUserTokens(String username) {
    }
}

接着在WebSecurityConfiguration中用自定义的MongoTokenRepositoryImpl代替JdbcTokenRepositoryImpl:

// NoSQL方式实现记住我
@Bean
public PersistentTokenRepository persistentTokenRepository() {
	// 自定义mongo方式实现
	MongoTokenRepositoryImpl mongoTokenRepository = new MongoTokenRepositoryImpl();
	return mongoTokenRepository;
}

或者就直接(需要通过@Service注解注入):

 

运行postman测试,可以看到通过MongoDB实现了对cookie信息的存储与修改。

如果mongodb中多出了_class字段,可以加上额外的配置:

/**
 * 去除_class字段
 *
 * @author 湘王
 */
@Configuration
public class MongoConfiguration implements InitializingBean {
    @Autowired
    @Lazy
    private MappingMongoConverter mappingMongoConverter;

    @Override
    public void afterPropertiesSet() {
        mappingMongoConverter
                .setTypeMapper(new DefaultMongoTypeMapper(null));
    }
}

多次运行可发现访问记录值的规律:

1、同一用户会有多条访问记录

如果每次都明确执行login方法,那么每次都会产生不同的记录,否则只会更新同一条记录的tokenValue和date值;

若token有效且未执行login方法,那么将更新最后一次产生的记录的tokenValue和date值。

2、这说明token条数是与login方法执行次数一一对应的;

3、只要token不失效,仅更新同一条记录series的token值。

访问数据记录:

 

不管是Mongodb还是别的NoSQL,比如Redis,原理都是一样的。


感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/42444.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

案例分享|生产环境MQ集群一个非常诡异的消费延迟排查

1、问题现象 某一天&#xff0c;项目组一个同事向我反馈&#xff0c;他们使用公司的数据同步产品将MySQL数据同步到MQ集群&#xff0c;然后使用消费者将数据再同步到ES&#xff0c;反馈数据同步延迟严重&#xff0c;但对应的消费组确没有积压&#xff0c;但最近最近几分钟的数…

LinkedIn领英开发客户方法大全(篇二)

profile完善步骤详细说明 详细步骤&#xff1a; 如下图箭头所示步骤&#xff0c;点击“view my profile”&#xff1a; 进入你的档案资料界面&#xff1a; 1&#xff09;点击红色圆圈所示处&#xff0c;即进入Edit intro界面: 即编辑个人简介&#xff0c;包括&#xff1a; …

企业如何通过推特群推创造商机

尤其是小企业要足够重视Twitter在营销推广上的重要性。因此&#xff0c;你有必要精心设计Twitter主页&#xff0c;并付诸投入和努力&#xff0c;这样就会看到消费者数量的增长&#xff0c;以及品牌忠诚度的提升。无疑&#xff0c;在Twitter上&#xff0c;很多企业可以发现商机&…

HTML基础-表单标签,button按钮,select下拉菜单

HTML基础-表单标签 目标和学习路径 1.表单标签 1.1 input系列标签的基本介绍 1.2 input系列标签-文本框 (拓展)value属性和name属性作用介 1.3 input系列标签-密码框 1.4 input系列标签-单选框 1.5 input系列标签-复选框 1.6 input系列标签-文件选择 2.button按钮标签 1.7 inpu…

JVS无忧·企业计划2.1.6更新说明

无忧企业计划是JVS企业数字化全家桶中重要组成部分&#xff0c;主要用于项目管理、任务管理、进度跟踪、过程管理等场景。 任务管理是企业内部事务协同的重要工具&#xff0c;与传统的OA有类似之处&#xff0c;同样是推动企业内部事务有效快速的执行&#xff0c;但之前存在不同…

直流无刷电机(BLDC)转速闭环调速系统及Matlab/Simulink仿真分析(二)

文章目录前言一、转速闭环直流调速系统二、Matlab/Simulink仿真2.1.仿真电路分析2.2.仿真结果分析总结前言 变压调速是直流调速系统的主要调速方法&#xff0c;因此系统的硬件至少包含&#xff1a;可调直流电源和直流电机两部分。可调直流电源多采用直流PWM变换器&#xff0c;…

CMMI2.0之我见-过程质量保证PQA

编者按&#xff1a; CMMI2.0之我见系列将通过系列文章形式介绍CMMI2.0所涉及到的其中20个实践域&#xff0c;笔者将通过系统性的梳理、浅显易懂的文字描述&#xff0c;同时结合笔者的思考和观点&#xff0c;对每个实践域的目标以及所基本涵盖的内容进行描述&#xff0c;希望能…

CSS 的快乐:画一个可爱的三只小鸟 Button

做为前端工程师&#xff0c;最大的快乐之一就是可以用 CSS 画出各种有趣的效果。 比如我最近画的一个 Button&#xff1a; 画的过程中确实很开心&#xff0c;这也是我当时选择做前端的很大一部分原因。 今天我们就一起来画下这个可爱的 Button 吧&#xff01;纯 CSS&#xff…

Kamiya丨Kamiya艾美捷小鼠血清淀粉样蛋白A ELISA说明书

Kamiya艾美捷小鼠血清淀粉样蛋白A ELISA预期用途&#xff1a; 小鼠血清淀粉样蛋白A ELISA是一种高灵敏度的双位点酶联免疫分析&#xff08;ELISA&#xff09;小鼠生物样品中血清淀粉样蛋白A&#xff08;SAA&#xff09;的定量测定。仅供研究使用。 引言 铜蓝蛋白是参与铜转运…

Go学习之路:更多类型:struct、slice 和映射(DAY 2)

文章目录前引更多类型&#xff1a;struct、slice 和映射1、指针2.1、结构体/结构体命名&#xff08;一&#xff09;2.2、结构体/对象访问、指针访问、初始化规则&#xff08;二&#xff09;3、数组4.1、切片/初始化切片4.2、切片/切片引用数组4.3、切片/切片的length和capacity…

React Context源码是怎么实现的呢

目前来看 Context 是一个非常强大但是很多时候不会直接使用的 api。大多数项目不会直接使用 createContext 然后向下面传递数据&#xff0c;而是采用第三方库&#xff08;react-redux&#xff09;。 想想项目中是不是经常会用到 connect(...)(Comp) 以及 <Provider value{s…

非互联网客户收入近6成,阿里云进入新周期

近日&#xff0c;阿里巴巴发布了截至2022年9月30日止季度&#xff08;2023财年第二季度&#xff0c;阿里财年从每年4月1日至第二年3月31日&#xff09;业绩。 在除去阿里内部使用的额度&#xff0c;抵销跨分部交易后&#xff0c;阿里云业务分部&#xff08;包括阿里云和钉钉&am…

【web前端期末大作业】基于html+css+javascript+jquery技术设计的音乐网站(44页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【华为上机真题 2022】字符串加密

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

【Linux】基本指令(三)

文章目录sort 指令find 指令which 指令alias 指令grep 指令top 指令zip/unzip指令tar 指令bc 指令unname 指令history 指令shutdown 指令热键补充sort 指令 &#x1f495; Linux sort 命令用于将文本文件内容加以排序并且可针对文本文件的内容&#xff0c;以行为单位来排序。 …

03 探究Kubernetes工作机制的奥秘

自动化的运维管理&#xff1a;探究Kubernetes工作机制的奥秘 文章目录1. 云计算时代的操作系统2. kubernets 的基本架构3.节点内部的结构3.1 master 节点3.2 node 节点4. Kubernetes 的大致工作流程5.插件有哪些&#xff1f;5.1 重要的插件6. kubernetes 架构思维导图7. 思考的…

制作一个简单HTML校园网页(HTML+CSS)学校网站制作 校园网站设计与实现

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

RabbitMQ工作队列

工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务&#xff0c;而不得不等待它完成。 相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时&#xff0c;这些工作线程将一起处…

电商购物平台的不断完善

目录 1.java编译环境的创建&#xff0c;与所需要用到的插件 第一个电商平台 1.初步思路&#xff1a; 2.确定java类 3.源码分析 成果&#xff1a; 第二个电商购物平台 代码&#xff1a; 最终的成果&#xff1a; 1.java编译环境的创建&#xff0c;与所需要用到的插件 (1…

链夹式烟苗注水移栽机的总体设计

目 录 1 引言 1 1.1课题来源及研究的目的和意义 1 1.2农艺要求 1 1.3链夹式烟苗注水移栽机的发展现状 1 1.4研究内容 3 2 链夹式烟苗注水移栽机的设计方案 4 2.1链夹式烟苗注水移栽机总体方案设计思路 4 2.2链夹式烟苗注水移栽机工作原理 5 3 链夹式烟苗注水移栽机具体设计 6 3…