问题
在一个shiro的demo中,设计共有两个页面,add页面和update页面,add页面只能具有user:add字段的用户可以访问,update页面只能具有user:update字段的用户去访问,如果某用户访问add页面,但是没有user:add字段的话,则会呈现用户:未经授权不得访问 这样的一个页面。
代码如下:
@RequestMapping("/noauth")
@ResponseBody
public String unauthorized(){
return "未经授权不得访问";
}
对授权进行拦截的代码如下:
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(
@Qualifier("getdefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
//设置安全管理器
bean.setSecurityManager(defaultWebSecurityManager);
//添加shiro的内置过滤器
//由于过滤器链是一个链结构,因此我们这里使用linkedHashMap来创建
Map<String, String> filterMap=new LinkedHashMap<>();
//如果我们需要对所有的访问都需要跳转到登录界面,则可以设置通配符--filterMap.put("/user/*","authc");
/*filterMap.put("/user/add","authc");
filterMap.put("/user/update","authc");*/
//授权--正常情况下,没有授权会跳转到未授权页面
filterMap.put("/user/add","perms[user:add]");
filterMap.put("/user/update","perms[user:update]");
//认证
filterMap.put("/user/*","authc");
//将设置好的各种过滤情况存入过滤器链中
bean.setFilterChainDefinitionMap(filterMap);
//如果发现某个过滤器设置为必须认证了才可以访问,即表示必须登录了才可以去访问你原本要访问的路径//因此需要设置你要跳转的认证或者说登录的路径
bean.setLoginUrl("/toLogin");
//未授权页面
bean.setUnauthorizedUrl("/noauth");
return bean;
注意:此处
filterMap.put("/user/*",“authc”);
该行代码必须放在授权的代码下,否则授权的拦截无效!
我之前写的是:
//认证
filterMap.put("/user/*","authc");
//授权--正常情况下,没有授权会跳转到未授权页面
filterMap.put("/user/add","perms[user:add]");
filterMap.put("/user/update","perms[user:update]");
拦截就无效了~~
应该为:
//授权--正常情况下,没有授权会跳转到未授权页面
filterMap.put("/user/add","perms[user:add]");
filterMap.put("/user/update","perms[user:update]");
//认证
filterMap.put("/user/*","authc");
随笔记录,仅供参考~