Jetspeed基于jaas的权限机制

Jetspeed基于jaas的权限机制

Jetspeed的权限有两种constraint和permission方式

其中Jetspeed的认证是基于jaas的loginModule实现的,所以这里说是基于jaas的权限机制

constraint和permission的区别

授权方式不一样

constraint是基于资源授权的:

优点:基于资源授权简单,选中一个页面或目录就可以授权

缺点:可授权的地方过于分散,因为页面,portlet是在不同的模块

permission是基于角色授权的

优点:在一个模块可统一对页面、portlet等资源统一授权

缺点:授权麻烦一点,先选中角色,再授权,没有基于资源授权简单,模型层和数据库是这么设计,但是前台展现还是按照资源授权

或许Jetspeed本觉得portal里面有不同资源,每个资源又有自己的管理模块 ,所以最终前台展现是按照资源来授权

constraint和permission原理

我目前的理解是,他们原理都一样

先找到一个资源以及它的父亲授予了哪些权限resourcePermission,然后检查当前用户有哪些权限userPermisson(即当前用户拥有的角色,所属群组等principal),最后检查这两个权限是否有交集,有就可访问,反之,则不可访问

对了,Jetspeed说它的权限模块式可插拔的,因为我已经看到spring的配置中可选择按constraint或者permission检查权限,有空多研究

constraint主要研究代码

SecurityAccessController.checkPortletAccess(PortletDefinition portlet, int mask){}

public boolean checkPortletAccess(PortletDefinition portlet, int mask)
    {
        if (portlet == null)
            return false;
        if (securityMode == SecurityAccessController.CONSTRAINTS)
        {
            String constraintRef = portlet.getJetspeedSecurityConstraint();
            if (constraintRef == null)
            {
                constraintRef = ((PortletApplication)portlet.getApplication()).getJetspeedSecurityConstraint();                
                if (constraintRef == null)
                {
                    return true; // allow access
                }
            }
            String actions = JetspeedActions.getContainerActions(mask);
            return pageManager.checkConstraint(constraintRef, actions);                
        }
        else
        {
            try
            {
                AccessController.checkPermission((Permission)pf.newPermission(pf.PORTLET_PERMISSION,portlet.getUniqueName(), mask));
            }
            catch (AccessControlException ace)
            {
                return false;
            }
            return true;
        }
    
    }

 

permission主要研究代码

AccessController.checkPermission((Permission)pf.newPermission(pf.PORTLET_PERMISSION,portlet.getUniqueName(), mask));}

 

这个代码AccessController.checkPermission()是jaas的代码,看来permission机制使用了jaas来实现,调试代码,去吧

jetspeed中的安全架构完全遵照Jaas实现

详细设计很值得推敲,要加油罗:

http://portals.apache.org/jetspeed-2/devguide/guide-security.html

设计思想


Jetspeed的安全模块,建立在JAAS之上,实现了验证和授权两大模块。建议学习本模块前,需要结合JAAS的知识来理解。
(1) Jaas的验证流程
Jetspeed基于JAAS的验证流程,如流程图所以,Jetspeed的验证过程是标准的jaas验证,只不过Jetspeed实现了自己的loginModule:org.apache.jetspeed.security.impl.DefaultLoginModule
(2) Jetspeed基于JAAS的授权流程

Jetspeed的permission授权机制,本质上也使用了Jaas的授权机制,以页面渲染portlet为例子,JAAS权限检查

的具体步骤如下:

  • 引擎调用PageAggregator.aggregateAndRender()渲染portlet
  • 检查portlet权限SecurityAccessController.checkPortletAccess()
  • 通过Jaas的机制判断portlet权限AccessController.checkPermission(Permission portletPermission)
  • 调用jetspeed自定义策略从保护域中检查是否拥有权限RdbmsPolicy.implies(ProtectionDomain protectionDomain, Permission permission
  • 从数据库获取当前用户拥有的所有权限,检查这些权限是否隐含该portlet的访问权限
  • 如果返回true,渲染portlet,如果返回false,没有权限,不渲染portlet

猜你喜欢

转载自xingqinstar.iteye.com/blog/1725237