25. Shiro_缓存
CacheManagerAware是个接口。如果实现了这个接口,shiro就会自动的把CacheManager注入给对象Realm。那么Realm对象就可以自动的使用缓存了。
点开Realm继承的父类,一直找到父类CachingRealm,可看到它是实现了这个接口的,所以说我们的Realm是默认有缓存的。
下面看一下实际的效果。以授权为例,在ShiroRealm的授权方法的83行处打上断点跑起来,登陆后点击需要授权的那个页面,第一次进入断点我们过,然后当我们第二次再点击授权页面的时候不会再进入到断点了,说明数据已经被缓存了不需要再调授权方法。
要看没有配缓存的时候第二次访问会再调用授权方法,我们就在applicationContext.xml中将缓存给注释掉,SecurityManager中也要注掉。再如上操作就可看到第二次调方法进入断点。
在我们配置realm的时候,也可以指定缓存对应的一些属性,比方缓存的名字、是否使用缓存。在ehcache.xml配置文件中做了一些配置,比如授权时使用的缓存策略,认证时用的缓存策略这些都可以进行指定和配置。
下面的session缓存使用方式也是差不多的。前面也讲过了。实际开发中可能会用redis来做shiro的缓存。
26. Shiro_认证和记住我的区别
说白了就是把Cookie写到客户端,但是在一些敏感页面还是需要身份验证的。
认证和记住我的区别:认证一定是调了Subject.login()来认证成功。而记住我是通过Subject.isRemembered()进行。二者只能选择一个,在访问的时候要么是被认证的要么是被记住的,不可能两个都为true。
27. Shiro_实现Rememberme
首先还是看一下shiro自带的这些过滤器
其中user表示认证和记住我都可以的, 下面就用到它。
首先在applicationContext.xml中配置user过滤器,之前已经将配置转到builder里面了,所以就在builder类中添加上一个配置,只要是通过记住我或者认证的都可以对list.jsp访问
map.put("/list.jsp", "user");
并且user.jsp和admin.jsp必须是通过认证,同时具有相应的权限才能访问。
map.put("/user.jsp", "authc,roles[user]");
map.put("/admin.jsp", "authc,roles[admin]");
然后具体的实现,打开ShiroHandler类:其中38行的
token.setRememberMe(true);
然后把项目跑起来:
在chrome中登录后是经过认证的,页面都可以访问,然后将浏览器关闭。
重新打开浏览器直接进入到list.jsp页面,可以进入没问题。但是当点击Admin链接和user链接想跳转到对应页面的时候就不行,会重新跳回登录页面,因为此时这2个页面设置的是需要认证登录才能访问的。
注意的一些小问题:
记住我的时间怎么设置,默认的时间是多长。
通过在ShiroRealm类中认证方法的第一行处打断点,往前面步骤中并找到SecurityManager里面this对象中有remembermeManager属性,中的cookie的maxAge可以看到,就可以在applicationContext.xml配置中设置这个对应的时间属性(SecurityManager的remembermeManager的cookie属性的maxAge属性)。
验证方法:
登录后复制http://localhost:8080/list.jsp地址,关闭浏览器,在10秒内打开页面不用登录就可以进,但是关掉页面10秒后再打开这个页面,就需要重新登录了,因为cookie已经失效了,验证不通过就跳转登录页面了。