设为首页 加入收藏

TOP

Spring Security(6)(一)
2023-07-25 21:34:59 】 浏览:61
Tags:Spring Security

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

 

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

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇java开发规范 下一篇(java-IDEA)如何把普通的项目变为..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目