shiro的权限配置特征

shiro的权限加载从上到下,按照map的特性,key(url相同的会被下面覆盖掉),利用这种特性,可以在数据库中设好其为菜单,在管理员设置好了权限内的菜单之后,其就在权限控制中,而且会显示,(要在权限控制中的先要有一个角色(管理员)勾选好),至于需要显示的菜单有不希望有

权限控制的可以在动态加载最后静态设置一次覆盖掉

同时注意静态资源不可纳入权限的控制内,

在最后设置/**(余下的)都进入权限控制(这样设置的必要是所有的地址(除了静态资源)都纳入了shiro,这样任何一个请求方法都会拿到shrio的上下文及其中的用户信息,不会出现有的求情,拿不到shiro登录信息,

做不了相应业务需求报错null

)设置anon也有这种效果---不需要登录,有shiro上下文

/**

     * ShiroFilterFactoryBean 处理拦截资源文件问题。

     * 注意:单独一个ShiroFilterFactoryBean配置是或报错的,因为在

     * 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager

     *

     Filter Chain定义说明

     1、一个URL可以配置多个Filter,使用逗号分隔

     2、当设置多个过滤器时,全部验证通过,才视为通过

     3、部分过滤器可指定参数,如perms,roles

     *

     */

 public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){

        System.out.println("ShiroConfiguration.shirFilter()");

        ShiroFilterFactoryBean shiroFilterFactoryBean  = new ShiroFilterFactoryBean();

        // 必须设置 SecurityManager

        shiroFilterFactoryBean.setSecurityManager(securityManager);

        // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面

        shiroFilterFactoryBean.setLoginUrl("/login");

        // 登录成功后要跳转的链接

        shiroFilterFactoryBean.setSuccessUrl("/index");

        //未授权界面;

        shiroFilterFactoryBean.setUnauthorizedUrl("/403");

        //拦截器.

        Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();

        //配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了

        filterChainDefinitionMap.put("/logout", "logout");

        filterChainDefinitionMap.put("/css/**","anon");

        filterChainDefinitionMap.put("/js/**","anon");

        filterChainDefinitionMap.put("/img/**","anon");

        filterChainDefinitionMap.put("/font-awesome/**","anon");

        filterChainDefinitionMap.put("/favicon.ico","anon");

        filterChainDefinitionMap.put("/users/reecover","anon");

        //<!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;

        //<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->

        //自定义加载权限资源关系

        List<Resources> resourcesList = resourcesService.queryAll();

         for(Resources resources:resourcesList){

            if (StringUtil.isNotEmpty(resources.getResurl())) {

                String permission = "perms[" + resources.getResurl()+ "]";

                filterChainDefinitionMap.put(resources.getResurl(),permission);

            }

        }

//        filterChainDefinitionMap.put("/**", "authc");

        filterChainDefinitionMap.put("/rule/**","anon");

        filterChainDefinitionMap.put("/urule/**","anon");

        filterChainDefinitionMap.put("/urule/loadknowledge","anon");

        filterChainDefinitionMap.put("/**", "authc");

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

        return shiroFilterFactoryBean;

    }