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;
}