本文最后更新于 1608 天前,其中的信息可能已经有所发展或是发生改变。
引言
自定义过滤器Filter这里只给部分的案例代码,因为比较简单。可以依据本站的Shiro注解授权修改一下就可以理解知识点了。
知识点
管理全部过滤器,包括默认的关于身份验证和权限验证的过滤器,这些过滤器分为两组,一组是认证过滤器,有anon,authcBasic,auchc,user,logout 一组是授权过滤器,有perms,roles,ssl(https),rest,port(端口)。同时也包含在xml里filters配置的自定义过滤器。在其它地方使用时都是从过滤器管理类里filters里拿的。且过滤器是单例的,整个Shiro框架只维护每种类型过滤器的单例。
自定义认证过滤器就继承AuthenticatingFilter。
自定义授权过滤器就继承AuthorizationFilter。
这里我给的例子就是自定义授权过滤器。
教程
1.创建数据库导入Maven这些就参考上面的那一篇文章。
2.系统的默认授权器。
1)编写对应的Controller进行测试。
Controller.java
//添加上如下的代码
@RequestMapping("roles1")
@ResponseBody
public String roles1(){
return "拥有admin角色";
}
@RequestMapping("roles2")
@ResponseBody
public String roles2(){
return "拥有admin和user角色";
}
@RequestMapping("permission1")
@ResponseBody
public String permission1(){
return "拥有user:update权限";
}
@RequestMapping("permission2")
@ResponseBody
public String permission2(){
return "拥有user:update和user:select权限";
}
2)修改shiro配置的文件。
ShiroConfiguration.java
//注意添加的内容要在filterChainDefinitionMap.put("/**","authc");这句之前。
filterChainDefinitionMap.put("/roles1", "roles[admin]");
filterChainDefinitionMap.put("/roles2", "roles[admin,user]");
filterChainDefinitionMap.put("/permission1", "perms[user:update]");
filterChainDefinitionMap.put("/permission2", "perms[user:update,user:select]");
3)测试下就会发现roles2和permission2都是会被拦截的。因为必须同时有两个角色或者两个权限。
3.自定义授权过滤器。
1)写自定义的类。
RolesOrFilter.java
package com.benzhu.shiro.Filter;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class RolesOrFilter extends AuthorizationFilter {
@Override
protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
Subject subject = getSubject(servletRequest,servletResponse);
String[] roles = (String[]) o;
if(roles == null || roles.length == 0){
return false;
}
for (String role : roles){
if(subject.hasRole(role)){
return true;
}
}
return false;
}
}
2)编写对应的Controller进行测试。
Controller.java
//添加上如下的代码
@RequestMapping("roles3")
@ResponseBody
public String roles3(){
return "拥有admin或者user角色";
}
3)修改shiro配置文件。
把部分放了出来,对照添加就行。
ShiroConfiguration.java
//配置自定义的Filter
Map<String, Filter> filtersMap = new LinkedHashMap<String, Filter>();
filtersMap.put("roleOrFilter", new RolesOrFilter());
bean.setFilters(filtersMap);
//配置访问权限
LinkedHashMap<String, String> filterChainDefinitionMap=new LinkedHashMap<>();
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/sublogin", "anon");
filterChainDefinitionMap.put("/usererror", "anon");
filterChainDefinitionMap.put("/roles1", "roles[admin]");
filterChainDefinitionMap.put("/roles2", "roles[admin,user]");
filterChainDefinitionMap.put("/permission1", "perms[user:update]");
filterChainDefinitionMap.put("/permission2", "perms[user:update,user:select]");
filterChainDefinitionMap.put("/roles3", "roleOrFilter[admin,user]");
filterChainDefinitionMap.put("/**","authc");
bean.setFilterChainDefinitionMap(filterChainDefinitionMap);