发表于: 2019-11-13 19:13:47

1 1041


一、今天完成的事

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


返回列表 返回列表
评论

    分享到