上一篇基本是一个登陆认证的功能,
接下来要做的是权限控制。
1.权限控制
上一篇虽然在realm中配置了权限信息,但实际是没有用的,要实现权限控制,那么在shiroconfig中需要加上filter。
//拦截器.
Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();
//配置退出过滤器,其中的具体的退出代码Shiro已经替我们实现了
filterChainDefinitionMap.put("/logout", "logout");
filterChainDefinitionMap.put("/login", "authc");
//<!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 -->
// 这里存在一个短路机制,即最先匹配原则如:/user/**=anon,/user/aa=authc 永远不会执行
//<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
filterChainDefinitionMap.put("/userDelete", "perms[userInfo:del]");
filterChainDefinitionMap.put("/userAdd", "perms[userInfo:add]");
filterChainDefinitionMap.put("/static/**", "anon");
filterChainDefinitionMap.put("/**", "user");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
配置中,/userDalete需要有userInfo:del的权限才能才做,不然就跳403,无权限页面,/userAdd则需要userInfo:add权限。此外,除了这种写法之外,还有roles,例如xxxx。put("/userGet","roles[admin]")则表示,这个/userGet操作需要amdin角色才有权限。
这时候访问的时候会调用realm中的doGetAuthorizationInfo方法,判断是否有权限访问。
2.缓存机制
在shiroconfig中加上EhCacheManager
@Bean
public EhCacheManager ehCacheManager(){
System.out.println("ShiroConfiguration.getEhCacheManager()");
EhCacheManager cacheManager = new EhCacheManager();
cacheManager.setCacheManagerConfigFile("classpath:ehcache.xml");
returncacheManager;
}
将缓存对象注入到SecurityManager中:
//注入缓存管理器;
securityManager.setCacheManager(ehCacheManager());//这个如果执行多次,也是同样的一个对象;
添加缓存配置文件:ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache name="es">
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
/>
<!-- 登录记录缓存锁定10分钟 -->
<cache name="passwordRetryCache"
maxEntriesLocalHeap="2000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="0"
overflowToDisk="false"
statistics="true">
</cache>
</ehcache>
3.记住我
在shiroconfig中加上cookie 对象和他的管理对象
@Bean
public SimpleCookie rememberMeCookie(){
System.out.println("ShiroConfiguration.rememberMeCookie()");
//这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
//<!-- 记住我cookie生效时间30天 ,单位秒;-->
simpleCookie.setMaxAge(259200);
returnsimpleCookie;
}
@Bean
public CookieRememberMeManager rememberMeManager(){
System.out.println("ShiroConfiguration.rememberMeManager()");
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememberMeCookie());
returncookieRememberMeManager;
}
将rememberMeManager注入到SecurityManager中
//注入记住我管理器;
securityManager.setRememberMeManager(rememberMeManager());
在shirFilter中配置记住我或认证通过可以访问的地址
//配置记住我或认证通过可以访问的地址
filterChainDefinitionMap.put("/index", "user");
filterChainDefinitionMap.put("/", "user");
这里有一点要注意:
当用户登录时开启了rememberMe时,用户关闭了浏览器,下次访问的时候是一个user,但不是authc。比如
/add=user 表示用户不一定需要已经通过认证,只需要曾经被Shiro记住过登录状态(rememberMe)就可以正常访问。
/delete=authc 表示用户必需已通过认证(登录操作),才可以访问,即使之前使用remeberMe,也无法在不登录的前提下直接访问。
记住我的用户对象必须实现序列化,记住我的原理实际是在浏览器的cookies中创建了一个rememberMe的cookie对象。
登录界面修改,修改登录界面加入rememberMe复选框:
在login.html中加入:
<P><input type="checkbox" name="rememberMe" />记住我</P>
代码地址:https://git.oschina.net/zheng875/springboottemplate
541

被折叠的 条评论
为什么被折叠?



