Java安全框架——Apache Shiro(二十六)

115 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

【4】自定义过滤器

上面我们使用了shiro的默认过滤器,但是由于业务需求,咱们可能要定义自己的过滤器,那么咱们定义呢?

这里我们先查看RolesAuthorizationFilter

分析:改源码表示,例如:/admin/order= roles["admin, root"] ,只有当放问该接口同时具备admin和root两种角色时,才可以被访问。

【5】自定义过滤器使用

【5.1】需求

1、实现只要有其中一个角色,则可访问对应路径

【5.2】RolesOrAuthorizationFilter

新建filter层,新建类RolesOrAuthorizationFilter

package com.itheima.shiro.filter;  
  
import org.apache.shiro.subject.Subject;  
import org.apache.shiro.util.CollectionUtils;  
import org.apache.shiro.web.filter.authz.AuthorizationFilter;  
  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  
import java.io.IOException;  
import java.util.Set;  
  
/**  
 * @Description:角色或关系  
 */  
public class RolesOrAuthorizationFilter extends AuthorizationFilter {  
  
    //TODO - complete JavaDoc  
  
    @SuppressWarnings({"unchecked"})  
    public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {  
  
        Subject subject = getSubject(request, response);  
        String[] rolesArray = (String[]) mappedValue;  
  
        if (rolesArray == null || rolesArray.length == 0) {  
            //no roles specified, so nothing to check - allow access.  
            return true;  
        }  
  
        Set<String> roles = CollectionUtils.asSet(rolesArray);  
        //循环roles判断只要有角色则返回true  
        for (String role : roles) {  
            if(subject.hasRole(role)){  
                return true;  
            }  
        }  
        return false;  
    }  
  
}  
  
【5.3】编辑ShiroConfig

在ShiroConfig类中添加如下内容

/**  
     * @Description 自定义过滤器定义  
     */  
    private Map<String, Filter> filters() {  
        Map<String, Filter> map = new HashMap<String, Filter>();  
        map.put("role-or", new RolesOrAuthorizationFilter());  
        return map;  
    }  
  
    /**  
     * @Description Shiro过滤器  
     */  
    @Bean("shiroFilter")  
    public ShiroFilterFactoryBean shiroFilterFactoryBean(){  
        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();  
        shiroFilter.setSecurityManager(defaultWebSecurityManager());  
        //使自定义过滤器生效  
        shiroFilter.setFilters(filters());  
        shiroFilter.setFilterChainDefinitionMap(filterChainDefinition());  
        shiroFilter.setLoginUrl("/login");  
        shiroFilter.setUnauthorizedUrl("/login");  
        return shiroFilter;  
    }  

【2.2.3】编辑authentication.properties

#静态资源不过滤
/static/=anon
#登录链接不过滤
/login/
=anon
#访问/resource/需要有admin的角色
/resource/
=role-or[admin]
#其他链接是需要登录的
/**=authc

7、注解方式鉴权

【1】注解介绍

以下为常用注解

注解                    说明                               
@RequiresAuthentication表明当前用户需是经过认证的用户     
@ RequiresGuest         表明该用户需为”guest”用户          
@RequiresPermissions    当前用户需拥有指定权限             
@RequiresRoles          当前用户需拥有指定角色             
@ RequiresUser          当前用户需为已认证用户或已记住用户

例如RoleAction类中我们添加

/**
*@Description: 跳转到角色的初始化页面
*/
@RequiresRoles(value ={"SuperAdmin","dev"},logical = Logical.OR)
@RequestMapping(value = "listInitialize")
public ModelAndView listInitialize(){
return  new ModelAndView("/role/role-listInitialize");
}