springboot集成shiro (2)

上一篇基本是一个登陆认证的功能,

我是传送门!!!!!!!!!!!!!!

接下来要做的是权限控制。

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

 

转载于:https://my.oschina.net/zk875/blog/829947

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值