如何将自定义授权模块插入liferay以与WSO2 Identity Server集成

时间:2015-01-29 09:59:16

标签: liferay authorization liferay-6 wso2is xacml

我需要将自定义授权模块插入liferay。例如,在渲染portlet时,我想决定哪些portlet应该对当前用户可见。基本上我不想在portlet呈现之前进行拦截,并使用外部身份提供程序执行基于XACML的授权,然后根据结果仅呈现portlet,用户具有权限的页面。

如何达到这种要求? Liferay的延伸点是什么?

1 个答案:

答案 0 :(得分:2)

这是我们达到相同要求的方式,您可以使用相同的方法:

  1. 使用名为“EntitlementService”的WSO2 IS SOAP服务开发一个自定义XACML PEP(我们称之为“xacml连接器”)并调用操作“getDecision”。在与IS通信以调用“getDecision”操作之前,此PEP应将授权请求转换为XACML格式。
  2. 开发一个使用步骤1中生成的jar的通用portlet(我们称之为“SecuredGenericPortlet”)。

    public class SecuredGenericPortlet extends GenericPortlet {
     public boolean hasPermission(String userName, String action, String resourceName)
    {
    // For single resource and action
    // Call XACML connector operations
    }
    public boolean hasPermission(String userName, String resourceName, Map<String, String> userParam)
    {
     // For single resource and passing multiple user parameters
     // Call XACML connector operations
    }      
    public ArrayList<DecisionDTO> checkPermissionList(String userName, String action, String[] resourceNames)
    {
    // For multiple decision profile passing multiple resources
    // Call XACML connector operations
     }
    public ArrayList<DecisionDTO> checkPermissionList(String userName, String[] resourceNames, Map<String, String> userParam)
     {
      // For multiple decision profile passing multiple resources and multiple user parameters        
      // Call XACML connector operations
      }
    
  3. 现在,您可以通过扩展SecuredGenericPortlet并在“doView”方法中调用所需的“hasPermission”来生成任何新的portlet。

    public class SamplePortlet extends SecuredGenericPortlet {
    @Override
    protected void doView(RenderRequest req, RenderResponse resp) throws PortletException,
                                                                     IOException {
     if (hasPermission(userName, "VIEW", req.getContextPath())) {
        // do your code here
        }
        }
    
  4. 为了获得更好的性能,您可以在步骤1中使用thrift协议与WSO2 IS进行通信,并可以使用基于多线程thrift的连接处理。