Shiro源码分析----授权流程

本文深入探讨了Apache Shiro的授权流程,从Filter链的角度分析了PermissionsAuthorizationFilter和RolesAuthorizationFilter如何控制权限和角色访问。讲解了Filter的继承体系,重点介绍了NameableFilter、OncePerRequestFilter以及AuthorizationFilter的作用,并详细阐述了如何通过ModularRealmAuthorizer进行权限和角色判断,以决定用户能否访问特定资源。

在一个用户登录后,即身份认证通过,只能证明该登录身份是合法的,至于具体能访问系统中的什么资源,需要通过授权来控制。一般系统中都是通过用户关联角色、角色再关联权限来实现判断一个用户是否有某资源的使用权限,Shiro也提供了相应的实现权限控制。

    Shiro中的权限控制也是通过Filter来实现的,在前面认证流程中讲到,Shiro的DefaultFilterChainManager类会创建Filter链,链中包含了Shiro一些默认Filter,也可以添加自定义Filter,而且这些Filter都有名字,Shiro会根据Filter配置为每一个配置的URL匹配符创建一个Filter链。

protected FilterChainManager createFilterChainManager() {
	// 创建DefaultFilterChainManager
    DefaultFilterChainManager manager = new DefaultFilterChainManager();
    // 创建Shiro默认Filter,根据org.apache.shiro.web.filter.mgt.DefaultFilter创建
    Map<String, Filter> defaultFilters = manager.getFilters();
    //apply global settings if necessary:
    for (Filter filter : defaultFilters.values()) {
    	// 设置相关Filter的loginUrl、successUrl、unauthorizedUrl属性
        applyGlobalPropertiesIfNecessary(filter);
    }

    // 获取在Spring配置文件中配置的Filter
    Map<String, Filter> filters = getFilters();
    if (!CollectionUtils.isEmpty(filters)) {
        for (Map.Entry<String, Filter> entry : filters.entrySet()) {
            String name = entry.getKey();
            Filter filter = entry.getValue();
            applyGlobalPropertiesIfNecessary(filter);
            if (filter instanceof Nameable) {
                ((Nameable) filter).setName(name);
            }
            // 将配置的Filter添加至链中,如果同名Filter已存在则覆盖默认Filter
            manager.addFilter(name, filter, false);
        }
    }

    //build up the chains:
    Map<String, String> chains = getFilterChainDefinitionMap();
    if (!CollectionUtils.isEmpty(chains)) {
        for (Map.Entry<String, String> entry : chains.entrySet()) {
            String url = entry.getKey();
            String chainDefinition = entry.getValue();
            // 为配置的每一个URL匹配创建FilterChain定义,
            // 这样当访问一个URL的时候,一旦该URL配置上则就知道该URL需要应用上哪些Filter
            // 由于URL匹配符会配置多个,所以以第一个匹配上的为准,所以越具体的匹配符应该配置在前面,越宽泛的匹配符配置在后面
            manager.createChain(url, chainDefinition);
        }
    }

    return manager;
}


下面我们看来都有哪些默认Filter,在DefaultFilterChainManager构造方法中调用addDefaultFilters方法:

protected void addDefaultFilters(boolean init) {
	for (DefaultFilter defaultFilter : DefaultFilter.values()) {
		addFilter(defaultFilter.name(), defaultFilter.newInstance(), init, false);
	}
}

public enum DefaultFilter
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值