引言

自定义过滤器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);

4)测试下就会发现登陆后roles3是可以访问的

4.部分效果图