发表于: 2019-11-13 19:13:47
1 1042
一、今天完成的事
1.解决昨天出现的bug
看源码中
public final AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
AuthenticationInfo info = getCachedAuthenticationInfo(token);
if (info == null) {
//otherwise not cached, perform the lookup:
info = doGetAuthenticationInfo(token);
log.debug("Looked up AuthenticationInfo [{}] from doGetAuthenticationInfo", info);
if (token != null && info != null) {
cacheAuthenticationInfoIfPossible(token, info);
}
} else {
log.debug("Using cached authentication info [{}] to perform credentials matching.", info);
}
if (info != null) {
assertCredentialsMatch(token, info);
} else {
log.debug("No AuthenticationInfo found for submitted AuthenticationToken [{}]. Returning null.", token);
}
return info;
}
这个地方返回的info是null
自己没有解决得了
查了网上的相应的报错
然后查看数据库,发现原来我的数据库中,对“baipiao”这个用户的权限是null
给权限之后正常访问了
没能找到在程序中如何判断为空的方法,只能在注册的时候强制要求给权限。
2. elasticsearch
1.基本概念
Spring Data Elasticsearch是Spring Data项目下的一个子模块。
Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的。
对比关系:
索引库(indices)--------------------------------Databases 数据库
类型(type)-----------------------------Table 数据表
文档(Document)----------------Row 行
字段(Field)-------------------Columns 列
另外,在Elasticsearch有一些集群相关的概念:
索引集(Indices,index的复数):逻辑上的完整索引
分片(shard):数据拆分后的各个部分
副本(replica):每个分片的复制
二、遇到的问题
三、收获
-shiro中rememberMe解析
shiro中rememberMe的源码是
UsernamePasswordToken token = new UsernamePasswordToken(loginForm.getUsername(),loginForm.getPassword());
if(loginForm.getRememberMe() != null && "Y".equals(loginForm.getRememberMe())){
token.setRememberMe(true);
}
"自己设置一个标志位,然后根据这个标志位判断一下用户是否勾选了记住我,如果勾选了就使用 token.setRememberMe(true) 设置为记住我。 "
-原理解释
shiro对cookie做了什么?
其实你设置了这个rememberMe之后shiro还是有做一点事情的,它会生成一个cookie值叫 rememberMe 并保存在你的浏览器里面,而且这个参数会随着你调用 subject.logout() 会被自动清除。这个参数的值是一串很长的Base64加密过的字符串,大概长这样 名称: rememberMe 内容: 6gYvaCGZaDXt1c0xwriXj/Uvz6g8OMT3VSaAK4WL0Fvqvkcm0nf3CfTwkWWTT4EjeSS/EoQjRfCPv4WKUXezQDvoNwVgFMtsLIeYMAfTd17ey5BrZQMxW+xU1lBSDoEM1yOy/i11ENh6eXjmYeQFv0yGbhchGdJWzk5W3MxJjv2SljlW4dkGxOSsol3mucoShzmcQ4VqiDjTcbVfZ7mxSHF/0M1JnXRphi8meDaIm9IwM4Hilgjmai+yzdVHFVDDHv/vsU/fZmjb+2tJnBiZ+jrDhl2Elt4qBDKxUKT05cDtXaUZWYQmP1bet2EqTfE8eiofa1+FO3iSTJmEocRLDLPWKSJ26bUWA8wUl/QdpH07Ymq1W0ho8EIdFhOsELxM66oMcj7a/8LVzypJXAXZdMFaNe8cBSN2dXpv4PwiktCs3J9P9vP4XrmYees5x27UmXNqYFk86xQhRjFdJsw5A9ctDKXzPYvJmWFouo3qT5hugX0uxWALCfWg8MHJnG9w7QgVKM8oy3Xy4Ut8lSvYlA==
这串字符串其实是对你登陆后的 Principal 进行了序列化后再Base64的结果。Principal 是 shiro 的一个概念,表示一个唯一的字符串能表示你这个用户的,如果你按照最简单的用户名密码登陆的方式,并且使用的是 SimpleAuthenticationInfo 对象,那么这个 Principal 其实就是一个字符串,就是你的用户名 username 所以这串东西解密出来就是你的username
shiro觉得rememberMe不安全 shiro觉得不能把rememberMe等同于已经登陆了,这样不安全。所以shiro 觉得就算 rememberMe = true 也不能算是 authc 的而是 user 级别的。 我们一般设置路径拦截是这样设置的 /** = authc
这样就保证了所有路径都需要登陆才能访问。就算你是 rememberMe=true也不能访问,官方说你如果设置成拦截级别为user就能访问,比如 /** = user
这样就可以访问了,但是官方建议不敏感的部分用user,敏感的部分还是要让用户再登陆一次,就像你上淘宝网就算不登陆,只要上一次有登陆过,你依然可以直接看我的淘宝那个页面,但是点击 我的宝贝的时候就又要让你登陆了。 但是!我们的确有很多时候是需要记住用户就相当于用户登录了! 设置成user这个方案还有一个问题,就是我们实际项目中在登陆后有做了很多设置用户上下文的工作,比如设置session等,如果我们只是设置拦截级别为user,那么再次进入的时候虽然可以访问,但是session是空的,我们的页面必然异常频出。
四、明天的计划
完成elasticsearch-demo
评论