我需要将自定义授权模块插入liferay。例如,在渲染portlet时,我想决定哪些portlet应该对当前用户可见。基本上我不想在portlet呈现之前进行拦截,并使用外部身份提供程序执行基于XACML的授权,然后根据结果仅呈现portlet,用户具有权限的页面。
如何达到这种要求? Liferay的延伸点是什么?
答案 0 :(得分: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
}
现在,您可以通过扩展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
}
}
为了获得更好的性能,您可以在步骤1中使用thrift协议与WSO2 IS进行通信,并可以使用基于多线程thrift的连接处理。