| |||||
Resolving the problem | |||||
It is better to configure a finite session timeout in order to control memory usage of session management. For example, set the session timeout to 30 minutes (the default). After testing this value, you may increase or decrease it in order to better customize the user experience on Portal. |
Sunday, May 31, 2009
Implications of a no session timeout configuration in Portal
Saturday, May 30, 2009
Update strategy for Workplace Web Content Management version 6.0
| ||||||||||||
Content | ||||||||||||
Beginning with version 6.0.1.4 and continuing forward, IBM® Workplace Web Content Management™ Support is delivering this strategy to provide a clear upgrade path for our customers that reduces the risk of installing multiple individual interim fixes for their portal-based content management system. Following these guidelines provides a consistent maintenance approach you can follow as you manage your environment. Installing preventative maintenance as soon as it becomes available can avoid problems that could result in a service call and lost productivity. This will also save you time. Recommended Update Path
Delivering Updates
These updates are explained in the following table*:
|
Portal Upgrades: Best Practices
Question
IBM® WebSphere® Portal upgrades can be a very combersome undertaking. This document is meant to provide a basic set of what to do and what not to do when performing Portal upgrades.
Failure to observe these points, particularly in the 'What NOT to do' section can result in an unusable system and often results in complete reinstalls.
Answer
What to do:
* Ensure you have a working backup of your environment. This includes a full file structure backup AND a full database backup. Having only one or the other is no better than having no backup at all. Portal upgrades cannot be uninstalled if they fail.
Customers using DB2 on z/OS: When taking the database backup starting 6.0.1.4 and higher fix packs it is sufficient to only take a backup of the data but not the DB2 catalog as separate SQL files are provided to revert changes applied to the database schema during fixpack installation.
* Ensure file permissions are set correctly for UNIX environments. If you are using a non-root user, ensure that the user owns the AppServer directory, the PortalServer directory and the profile directory. Ensure that the non-root user has full access to the /tmp directory.
* If the upgrade fails, fix the problem with the upgrade and finish it before attempting anything else with the system (unless you decide to restore a backup).
* Ensure you have followed all of the 'Before You Begin' steps from the upgrade instructions.
What NOT to do:
* If upgrading a clustered environment, upgrade the primary node first. DO NOT upgrade a secondary first.
* If upgrading a clustered environment, DO NOT upgrade cluster nodes simultaneously.
* If an upgrade fails, DO NOT attempt to apply a different fixpack on top of a fixpack failure. This is the most common action that results in a complete reinstall.
* Do NOT upgrade a node that is federated but not clustered. Create a cluster first, even if it is just one node.
* If an upgrade fails, DO NOT attempt to further configure the Portal server (reconfigure secuirty, transfer the database, etc) until you have resolved the upgrade failure.
* When restoring a backup, DO NOT simply overwrite the existing WebSphere directory with a backed up one. You run the risk of corrupting the environment since overwriting the directory might not remove new files that had been laid down by the failed upgrade.
IBM® WebSphere® Portal upgrades can be a very combersome undertaking. This document is meant to provide a basic set of what to do and what not to do when performing Portal upgrades.
Failure to observe these points, particularly in the 'What NOT to do' section can result in an unusable system and often results in complete reinstalls.
Answer
What to do:
* Ensure you have a working backup of your environment. This includes a full file structure backup AND a full database backup. Having only one or the other is no better than having no backup at all. Portal upgrades cannot be uninstalled if they fail.
Customers using DB2 on z/OS: When taking the database backup starting 6.0.1.4 and higher fix packs it is sufficient to only take a backup of the data but not the DB2 catalog as separate SQL files are provided to revert changes applied to the database schema during fixpack installation.
* Ensure file permissions are set correctly for UNIX environments. If you are using a non-root user, ensure that the user owns the AppServer directory, the PortalServer directory and the profile directory. Ensure that the non-root user has full access to the /tmp directory.
* If the upgrade fails, fix the problem with the upgrade and finish it before attempting anything else with the system (unless you decide to restore a backup).
* Ensure you have followed all of the 'Before You Begin' steps from the upgrade instructions.
What NOT to do:
* If upgrading a clustered environment, upgrade the primary node first. DO NOT upgrade a secondary first.
* If upgrading a clustered environment, DO NOT upgrade cluster nodes simultaneously.
* If an upgrade fails, DO NOT attempt to apply a different fixpack on top of a fixpack failure. This is the most common action that results in a complete reinstall.
* Do NOT upgrade a node that is federated but not clustered. Create a cluster first, even if it is just one node.
* If an upgrade fails, DO NOT attempt to further configure the Portal server (reconfigure secuirty, transfer the database, etc) until you have resolved the upgrade failure.
* When restoring a backup, DO NOT simply overwrite the existing WebSphere directory with a backed up one. You run the risk of corrupting the environment since overwriting the directory might not remove new files that had been laid down by the failed upgrade.
Friday, May 29, 2009
Some good look and feel websphere portal examples
The message is clear. When you deploy a portal, you have to be careful in choosing your provider. Here I put a list of nice websites based on WebSphere Portal. There are portals from different countries, USA, Mexico, Colombia, Chile, Spain... Look at the "look and feel". Look at the changes. The "painter" is important !!
http://www.aeat.es
http://www.damm.es
http://www.tenerife.es
http://www.huelva.es
http://www.fundacioncyd.org
http://ww3.achs.cl/ws/wps/portal/
http://www.trafikoa.net
http://contrataciondelestado.es
http://www2.itesm.edu
http://www.cancilleria.gov.co/
http://wps.portalbita.net/wps/portal/!ut/p/.cmd/cl/.l/es
http://www.fundacionexe.org.co
http://www.geoportal.gov.co
http://www.ncaa.org
http://www.alcatel-lucent.com/wps/portal/BellLabs
http://www.ncaa.org
http://solutions.productos3M.es/wps/portal/3M/es_ES/EU/Country/
http://www.realinstitutoelcano.org/
http://corporate.homedepot.com/wps/portal/Grants
http://miamidade.gov/wps/portal/spanish
http://oneshpe.shpe.org/wps/portal/shpe2008
http://www.aeat.es
http://www.damm.es
http://www.tenerife.es
http://www.huelva.es
http://www.fundacioncyd.org
http://ww3.achs.cl/ws/wps/portal/
http://www.trafikoa.net
http://contrataciondelestado.es
http://www2.itesm.edu
http://www.cancilleria.gov.co/
http://wps.portalbita.net/wps/portal/!ut/p/.cmd/cl/.l/es
http://www.fundacionexe.org.co
http://www.geoportal.gov.co
http://www.ncaa.org
http://www.alcatel-lucent.com/wps/portal/BellLabs
http://www.ncaa.org
http://solutions.productos3M.es/wps/portal/3M/es_ES/EU/Country/
http://www.realinstitutoelcano.org/
http://corporate.homedepot.com/wps/portal/Grants
http://miamidade.gov/wps/portal/spanish
http://oneshpe.shpe.org/wps/portal/shpe2008
Thursday, May 28, 2009
7 Steps to Portal Information Architecture Bliss
In the book "Intranets for Info Pros" (Information Today), there is a list of seven elements to consider when considering a portal implementation, and I think they bear repeating here for anyone looking to either build or enhance an intranet portal:
1. Limit technical customization of the portal to items planned for by the software supplier or easily accommodated in the software.
2. Fully understand the logic of how the individual portal software approaches content publishing, information architecture, and collaboration spaces before designing the portal--in other words, do not try to radically adapt the portal to your preconceived notion of how it all should work; use the software's design to achieve your goals.
3. Do not underestimate the time and effort of content migration.
4. Avoid duplicating the problems of the old intranet in the new portal by working with content owners to migrate content item-by-item rather than page-by-page (try to break content into distinct individual content items rather than relying on the old page structure).
5. Map the individual content items to individual portlets or content modules (use a content inventory listed on a spreadsheet), and then assign content modules to pages--fully understand and take advantage of the distributed nature of portal content publishing.
6. Be sure content owners and their organizations are prepared to take on content maintenance before beginning the migration process. Emphasize that starting with a simple set of content is a good thing--complexity witll come soon enough.
7. Recognize that content migration is a golden opportunity rather than a necessary chore; you will never have a better chance to clean up out-of-date content and navigation again.
1. Limit technical customization of the portal to items planned for by the software supplier or easily accommodated in the software.
2. Fully understand the logic of how the individual portal software approaches content publishing, information architecture, and collaboration spaces before designing the portal--in other words, do not try to radically adapt the portal to your preconceived notion of how it all should work; use the software's design to achieve your goals.
3. Do not underestimate the time and effort of content migration.
4. Avoid duplicating the problems of the old intranet in the new portal by working with content owners to migrate content item-by-item rather than page-by-page (try to break content into distinct individual content items rather than relying on the old page structure).
5. Map the individual content items to individual portlets or content modules (use a content inventory listed on a spreadsheet), and then assign content modules to pages--fully understand and take advantage of the distributed nature of portal content publishing.
6. Be sure content owners and their organizations are prepared to take on content maintenance before beginning the migration process. Emphasize that starting with a simple set of content is a good thing--complexity witll come soon enough.
7. Recognize that content migration is a golden opportunity rather than a necessary chore; you will never have a better chance to clean up out-of-date content and navigation again.
Using Model SPI to get Page title
IBM WebSphere Portal uses a concept of Models for content aggregation, to track user's pages etc. The Model SPI provides access to these models. The attached code provides an example to illustrate on how to get a title of a page using model SPI in JSR 286 portlet. Here is the code snippet to get title of page
public String getTitle(PortletRequest request, PortletResponse response)
{
Context context=null;
PortletServiceHome homeObject =null;
NavigationSelectionModelProvider provider=null;
NavigationSelectionModel navSelectionModel = null;
try
{
context = new InitialContext();
homeObject = (PortletServiceHome) context.lookup("portletservice/com.ibm.portal.portlet.service.model.NavigationSelectionModelProvider");
provider = (NavigationSelectionModelProvider) homeObject.getPortletService (NavigationSelectionModelProvider.class);
navSelectionModel = provider.getNavigationSelectionModel(request, response);
}
catch (Exception exception)
{
exception.printStackTrace();
}
NavigationNode selectedNode = (NavigationNode) navSelectionModel.getSelectedNode();
//Following is commented since there is no title for page if user's locale is US English
//String pageTitle = selectedNode.getTitle(request.getLocale());
String pageTitle = selectedNode.getTitle(Locale.ENGLISH);
return pageTitle;
}
Portlet shows English title of page. For locale of US English there is no title for page and you will see null value. You may comment this line of code and uncomment previous line of code to get title of page in your locale. Please login to the site to download war file.
public String getTitle(PortletRequest request, PortletResponse response)
{
Context context=null;
PortletServiceHome homeObject =null;
NavigationSelectionModelProvider provider=null;
NavigationSelectionModel navSelectionModel = null;
try
{
context = new InitialContext();
homeObject = (PortletServiceHome) context.lookup("portletservice/com.ibm.portal.portlet.service.model.NavigationSelectionModelProvider");
provider = (NavigationSelectionModelProvider) homeObject.getPortletService (NavigationSelectionModelProvider.class);
navSelectionModel = provider.getNavigationSelectionModel(request, response);
}
catch (Exception exception)
{
exception.printStackTrace();
}
NavigationNode selectedNode = (NavigationNode) navSelectionModel.getSelectedNode();
//Following is commented since there is no title for page if user's locale is US English
//String pageTitle = selectedNode.getTitle(request.getLocale());
String pageTitle = selectedNode.getTitle(Locale.ENGLISH);
return pageTitle;
}
Portlet shows English title of page. For locale of US English there is no title for page and you will see null value. You may comment this line of code and uncomment previous line of code to get title of page in your locale. Please login to the site to download war file.
Sharing Data Among Portlets
There are number of ways to share data among portlets. This article introduces all these techniques.
Using PortletSession: Any portlets that are located in a same WAR file can share data using PortletSession. The setAttribute and getAttribute methods needs to be called with scope argument set to PortletSession.APPLICATION_SCOPE in order to share data.
Public Render Parameters: The render parameters set from either in processAction method or in render URL are only accessible from the same portlet. JSR 286 introduces public render parameters to share navigational state across portlets even located in different WAR files. Using this parameters to share data avoids event phase as needed using event technique. The render parameters can be shared by just defining XML elements in portlet.xml.
* The public-render-parameter tag should declare the parameter at portlet application level.
* Each portlet must reference the defined parameter using supported-public-render-parameter tag.
Using Events: In addition to public render parameters, JSR 286 introduces events to share data. Unlike public render parameters, events allows to send payload as an object. In order to share data using events, an action phase should occur by user's action of either clicking on a link that is created with action URL or submitting a form whose action is created as action URL. Here are the key points to understand the flow.
* Both sender and receiver portlets should declare same event using event-definition element at application level in portlet.xml.
* The sender portlet should refer the event using supported-publishing-event at portlet level in portlet.xml.
* The receiver portlet should refer the event using supported-processing-event at portlet level in portlet.xml
* The action invocation should occur to sender portlet. During processAction method, it should create pay load object and call ActionResponse.setEvent method to publish event.
* The receiver portlet should define processEvent. In this method it can get event object from EventRequest object. This event object carries payload.
Using PortletSession: Any portlets that are located in a same WAR file can share data using PortletSession. The setAttribute and getAttribute methods needs to be called with scope argument set to PortletSession.APPLICATION_SCOPE in order to share data.
Public Render Parameters: The render parameters set from either in processAction method or in render URL are only accessible from the same portlet. JSR 286 introduces public render parameters to share navigational state across portlets even located in different WAR files. Using this parameters to share data avoids event phase as needed using event technique. The render parameters can be shared by just defining XML elements in portlet.xml.
* The public-render-parameter tag should declare the parameter at portlet application level.
* Each portlet must reference the defined parameter using supported-public-render-parameter tag.
Using Events: In addition to public render parameters, JSR 286 introduces events to share data. Unlike public render parameters, events allows to send payload as an object. In order to share data using events, an action phase should occur by user's action of either clicking on a link that is created with action URL or submitting a form whose action is created as action URL. Here are the key points to understand the flow.
* Both sender and receiver portlets should declare same event using event-definition element at application level in portlet.xml.
* The sender portlet should refer the event using supported-publishing-event at portlet level in portlet.xml.
* The receiver portlet should refer the event using supported-processing-event at portlet level in portlet.xml
* The action invocation should occur to sender portlet. During processAction method, it should create pay load object and call ActionResponse.setEvent method to publish event.
* The receiver portlet should define processEvent. In this method it can get event object from EventRequest object. This event object carries payload.
Wednesday, May 27, 2009
Using Resource URL for Ajax
This below sample code illustrates how to use Resource URL for initiating Ajax requests. This allows to update portions of page without refreshing whole page.
<span style="font-weight: bold;">Introduction</span>
This portlet displays a drop-down list to select country. Upon selecting, an Ajax request is sent to portlet. This will invoke serveResource method of portlet which sends a text message containing major cities part of selected country. These cities are shown in hidden division in the portlet window.
<span style="font-weight: bold;">Analysis of portlet project</span>
1. The following is sample JSP shown in portlet. The highlighted code shows creating resource URL, and hidden division. This JSP also shows Javascript code used to send Ajax request.
<%@page session="false" contentType="text/html" pageEncoding="ISO-8859-1" import="java.util.*,javax.portlet.*" %>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>
<portlet:defineobjects>
<script type="text/javascript">
var xmlRequest;
/* send request to backend server */
function updatePortlet(url)
{
getXMLHttpRequest();
var params= getFormDataParams();
if(xmlRequest != null) { xmlRequest.onreadystatechange=stateHandler; xmlRequest.open("POST",url,true); xmlRequest.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded"); xmlRequest.send(params); } }/* callback function called to check the request status and retrieve the resposne */function stateHandler(){ if (xmlRequest.readyState==4) { if (xmlRequest.status==200) { var responseDiv = document.getElementById("div_resource_response"); responseDiv.innerHTML= xmlRequest.responseText; } else { alert("Problem retrieving XML data"); } }}
/* get XMLHttpRequest object */
function getXMLHttpRequest(){ if (window.XMLHttpRequest) {
xmlRequest = new XMLHttpRequest(); // Mozilla/Safari
}
else if ( typeof ActiveXObject != "undefined" ) {
xmlRequest = new ActiveXObject("MicroSoft.XMLHTTP"); // IE
}}/* Prepares Post data */
function getFormDataParams(){
var params = "country=" + encodeURIComponent(document.resourceForm.country.value) + "&NOCACHE=" + new Date().getTime();
return params;
}
</script>
<h3 style="margin-bottom: 3px;">Select a country to display major cities</h3>
<form name="resourceForm" class="cssform">
<p>
<label>Country</label>
<select name="country" onchange=""><option value="" selected="selected"></option> <option value="usa">USA</option> <option value="canada">Canada</option> <option value="india">India</option> </select>
</p>
</form>
<div id="div_resource_response">
</div>
2. The following is the method invoked by submitting to resource URL.
@Override
public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException, IOException {
String country= request.getParameter("country");
if(country.equals("usa"))
response.getWriter().println("Major cities in USA are <b>New york, Chicago, Houston, Los Angeles</b>");
else if(country.equals("canada"))
response.getWriter().println("Major cities in Canda are <b>Toronto, Vancouer, Ottawa</b>");
else if(country.equals("india"))
response.getWriter().println("Major cities in India are <b>Delhi, Bombay, Bangalore, Madras</b>");
}
</portlet:defineobjects>
<span style="font-weight: bold;">Introduction</span>
This portlet displays a drop-down list to select country. Upon selecting, an Ajax request is sent to portlet. This will invoke serveResource method of portlet which sends a text message containing major cities part of selected country. These cities are shown in hidden division in the portlet window.
<span style="font-weight: bold;">Analysis of portlet project</span>
1. The following is sample JSP shown in portlet. The highlighted code shows creating resource URL, and hidden division. This JSP also shows Javascript code used to send Ajax request.
<%@page session="false" contentType="text/html" pageEncoding="ISO-8859-1" import="java.util.*,javax.portlet.*" %>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>
<portlet:defineobjects>
<script type="text/javascript">
var xmlRequest;
/* send request to backend server */
function updatePortlet(url)
{
getXMLHttpRequest();
var params= getFormDataParams();
if(xmlRequest != null) { xmlRequest.onreadystatechange=stateHandler; xmlRequest.open("POST",url,true); xmlRequest.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded"); xmlRequest.send(params); } }/* callback function called to check the request status and retrieve the resposne */function stateHandler(){ if (xmlRequest.readyState==4) { if (xmlRequest.status==200) { var responseDiv = document.getElementById("div_resource_response"); responseDiv.innerHTML= xmlRequest.responseText; } else { alert("Problem retrieving XML data"); } }}
/* get XMLHttpRequest object */
function getXMLHttpRequest(){ if (window.XMLHttpRequest) {
xmlRequest = new XMLHttpRequest(); // Mozilla/Safari
}
else if ( typeof ActiveXObject != "undefined" ) {
xmlRequest = new ActiveXObject("MicroSoft.XMLHTTP"); // IE
}}/* Prepares Post data */
function getFormDataParams(){
var params = "country=" + encodeURIComponent(document.resourceForm.country.value) + "&NOCACHE=" + new Date().getTime();
return params;
}
</script>
<h3 style="margin-bottom: 3px;">Select a country to display major cities</h3>
<form name="resourceForm" class="cssform">
<p>
<label>Country</label>
<select name="country" onchange=""><option value="" selected="selected"></option> <option value="usa">USA</option> <option value="canada">Canada</option> <option value="india">India</option> </select>
</p>
</form>
<div id="div_resource_response">
</div>
2. The following is the method invoked by submitting to resource URL.
@Override
public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException, IOException {
String country= request.getParameter("country");
if(country.equals("usa"))
response.getWriter().println("Major cities in USA are <b>New york, Chicago, Houston, Los Angeles</b>");
else if(country.equals("canada"))
response.getWriter().println("Major cities in Canda are <b>Toronto, Vancouer, Ottawa</b>");
else if(country.equals("india"))
response.getWriter().println("Major cities in India are <b>Delhi, Bombay, Bangalore, Madras</b>");
}
</portlet:defineobjects>
Sunday, May 24, 2009
How to implement LDAP referrals for WebSphere Portal 6.1
Question
How can you implement referrals for WebSphere Portal 6.1? You have configured WebSphere Portal to an LDAP server that may return a referral in order to locate a specific user or group.
Answer
WebSphere Application Server 6.1 does not support referrals in standalone LDAP environments. However, referrals can be leveraged in a federated repository environment by using one of the following two methods for updating the Virtual Member Manager (VMM) configuration:
Method 1.
1. Login to the Integrated Solutions Console.
2. Navigate to Secure administration, applications, and infrastructure --> Federated repositories --> Manage repositories --> repository name.
3. In the drop-down list for "Support referrals to other LDAP servers", select Follow.
4. Save the changes and restart the servers.
Method 2.
1. Open the/config/cells//wim/config/wimconfig.xml file. 2. Search for referal="ignore". 3. Change this to referal="follow". 4. Save the changes and restart the servers. |
How can you implement referrals for WebSphere Portal 6.1? You have configured WebSphere Portal to an LDAP server that may return a referral in order to locate a specific user or group.
Answer
WebSphere Application Server 6.1 does not support referrals in standalone LDAP environments. However, referrals can be leveraged in a federated repository environment by using one of the following two methods for updating the Virtual Member Manager (VMM) configuration:
Method 1.
1. Login to the Integrated Solutions Console.
2. Navigate to Secure administration, applications, and infrastructure --> Federated repositories --> Manage repositories --> repository name.
3. In the drop-down list for "Support referrals to other LDAP servers", select Follow.
4. Save the changes and restart the servers.
Method 2.
1. Open the
2. Search for referal="ignore".
3. Change this to referal="follow".
4. Save the changes and restart the servers.
Saturday, May 23, 2009
How to export a subset of users using the XML Configuration Interface
Question
How do you export a single user or a subset of users from an IBM WebSphere Portal configuration using XMLAccess?
Answer
Take a copy of the sample XML file, "ExportAllUsers.xml", located in the/doc/xml-samples directory and make the following changes:
1. Near the top of the file set export-users to false or remove export-users="true" from the file entirely.
2. Delete the following lines that serve to export all users and groups:
3. To export a single user by uid, add a line similar to the following:
This example exports the user, "wpsadmin", using the xmlaccess parameter, "name", that corresponds to uid. You may also export users using other attributes such as "common name" if uid is not defined in your repository. Review the WebSphere Portal Information Center XML Configuration reference page for 6.0 or 6.1 for more information.
How do you export a single user or a subset of users from an IBM WebSphere Portal configuration using XMLAccess?
Answer
Take a copy of the sample XML file, "ExportAllUsers.xml", located in the
1. Near the top of the file set export-users to false or remove export-users="true" from the file entirely.
2. Delete the following lines that serve to export all users and groups:
3. To export a single user by uid, add a line similar to the following:
This example exports the user, "wpsadmin", using the xmlaccess parameter, "name", that corresponds to uid. You may also export users using other attributes such as "common name" if uid is not defined in your repository. Review the WebSphere Portal Information Center XML Configuration reference page for 6.0 or 6.1 for more information.
How to export a single group or subset of groups using the XML configuration
Question
How do you export a single group or subset of groups from an IBM WebSphere Portal configuration using XMLAccess?
Answer
Make a copy of the sample XML file, "ExportAllUsers.xml", located in the/doc/xml-samples directory and make the following changes:
1. Near the top of the file, set export-users to false or remove export-users="true" from the file entirely.
2. Delete the following lines that serve to export all users and groups in the file as installed:
3. To export a single group by uid, add a line similar to the following:
This example exports the group, "wpsadmins", using the xmlaccess parameter, "name", which corresponds to the uid.
Exporting a group in this way will also export the members of the group. Each group member will appear on a separate line in the output. The output XML file will look as follows:
You may also export groups using other attributes such as "common name" if the uid is not defined in your repository. Review the WebSphere Portal Information Center page XML Configuration reference for 6.0 or 6.1 for more information.
How do you export a single group or subset of groups from an IBM WebSphere Portal configuration using XMLAccess?
Answer
Make a copy of the sample XML file, "ExportAllUsers.xml", located in the
1. Near the top of the file, set export-users to false or remove export-users="true" from the file entirely.
2. Delete the following lines that serve to export all users and groups in the file as installed:
3. To export a single group by uid, add a line similar to the following:
This example exports the group, "wpsadmins", using the xmlaccess parameter, "name", which corresponds to the uid.
Exporting a group in this way will also export the members of the group. Each group member will appear on a separate line in the output. The output XML file will look as follows:
You may also export groups using other attributes such as "common name" if the uid is not defined in your repository. Review the WebSphere Portal Information Center page XML Configuration reference for 6.0 or 6.1 for more information.
Saturday, May 2, 2009
Using ldapsearch to debug LDAP configuration problems
Problem(Abstract)
How to using ldapsearch to debug LDAP configuration problems with IBM® WebSphere® Application Server?
Resolving the problem
There are many things which may prevent your LDAP configuration from working properly.
DN = Distinguished Name
ACL = Access Control List
· DN not in ACL and therefore cannot perform certain ldap queries
· DN was locked out of ldap due to too may failed login attempts
· DN password may have been changed
· LDAP server may not allow anonymous queries
· Default filter defined in Application Server may not fit customers' settings.(i.e. no objectclass=someObjectClass defined)
· Firewall not allowing communication on port
· LDAP set to use nonstandard port of 389
· LDAP administrator ID used for Server ID but the administrator's ID is not defined as a regular user
For these and numerous other possible configuration problems the best way to quickly debug the problem is to do an ldapsearch. Ldapsearch is a utility similar to what Application Server uses to query the ldap server but is used on the command line. This removes Application Server from the picture and allows you to see what is being returned from the query, normally hidden by Application Server.
The idea is use the same configuration settings, on the command line, as you have defined in Application Server’s Administrative console > Security > user Registries > LDAP settings.
Security Server ID Short name of the ID which is queried from LDAP.
Security Server Password ID’s password in LDAP
Directory Type Predefined list of supported LDAP servers. Selecting the proper Directory updates the filters defined under the Advanced properties. These can be changed.
Host Hostname of LDAP server. Can be short name, long name, or IP address.
Port 389 is the default LDAP port
Base Distinguished Name
(BaseDN) Query starting location in your LDAP tree
Bind Distinguished Name
(BindDN) Fully qualified DN which has the authority to “bind” to your LDAP server and preform the requested queries. Some LDAP servers allow for anonymous queries so no bind DN and bind password may be required
Bind Password Bind DN’s password.
LDAP advanced properties User Filter The string used to query the LDAP server.
User ID Map Defines what gets displayed in WebSphere from resulting query.
ldapsearch –h -p -b “” –D -w “”
Note: The “%v” in the gets replaced by the
For example, instead of "(&(cn=%v)(objectclass=ePerson))" use "(&(cn=bob)(objectclass=ePerson))"
Example ldapsearch queries
C:\>ldapsearch -h petunia -p 389 -b "o=ibm,c=us" uid=test
cn=test,o=ibm,c=us
sn=test
objectclass=top
objectclass=organizationalPerson
objectclass=ePerson
objectclass=person
objectclass=inetOrgPerson
uid=test
cn=test
C:\>ldapsearch -h petunia -p 389 -b "o=ibm,c=us" "(&(uid=test)(objectclass=ePerson))"
cn=test,o=ibm,c=us
sn=test
objectclass=top
objectclass=organizationalPerson
objectclass=ePerson
objectclass=person
objectclass=inetOrgPerson
uid=test
cn=test
Ldapsearch queries which would cause an exception for Application Server:
The following would fail in Application Server because the search filter is looking for an objectclass of “XYZ” but there is no “XYZ” objectclass defined LDAP. This results in an empty return string.
C:\>ldapsearch -h petunia -p 389 -b "o=ibm,c=us" "(&(uid=test)(objectclass=XYZ))"
The following search would fail in Application Server because 2 DN’s are returned instead of 1. Application Server will only authenticate using a single DN. If the query was uid=test instead of cn=test, then only one DN would have been returned.
C:\>ldapsearch -h petunia -p 389 -b "o=ibm,c=us" "(&(cn=test)(objectclass=ePerson))"
cn=test,o=ibm,c=us
sn=test
objectclass=top
objectclass=organizationalPerson
objectclass=ePerson
objectclass=person
objectclass=inetOrgPerson
uid=test
cn=test
cn=test,ou=Larry's Group,ou=Austin,o=ibm,c=us
sn=User
objectclass=top
objectclass=organizationalPerson
objectclass=ePerson
objectclass=person
objectclass=inetOrgPerson
cn=Test
How to using ldapsearch to debug LDAP configuration problems with IBM® WebSphere® Application Server?
Resolving the problem
There are many things which may prevent your LDAP configuration from working properly.
DN = Distinguished Name
ACL = Access Control List
· DN not in ACL and therefore cannot perform certain ldap queries
· DN was locked out of ldap due to too may failed login attempts
· DN password may have been changed
· LDAP server may not allow anonymous queries
· Default filter defined in Application Server may not fit customers' settings.(i.e. no objectclass=someObjectClass defined)
· Firewall not allowing communication on port
· LDAP set to use nonstandard port of 389
· LDAP administrator ID used for Server ID but the administrator's ID is not defined as a regular user
For these and numerous other possible configuration problems the best way to quickly debug the problem is to do an ldapsearch. Ldapsearch is a utility similar to what Application Server uses to query the ldap server but is used on the command line. This removes Application Server from the picture and allows you to see what is being returned from the query, normally hidden by Application Server.
The idea is use the same configuration settings, on the command line, as you have defined in Application Server’s Administrative console > Security > user Registries > LDAP settings.
Security Server ID Short name of the ID which is queried from LDAP.
Security Server Password ID’s password in LDAP
Directory Type Predefined list of supported LDAP servers. Selecting the proper Directory updates the filters defined under the Advanced properties. These can be changed.
Host Hostname of LDAP server. Can be short name, long name, or IP address.
Port 389 is the default LDAP port
Base Distinguished Name
(BaseDN) Query starting location in your LDAP tree
Bind Distinguished Name
(BindDN) Fully qualified DN which has the authority to “bind” to your LDAP server and preform the requested queries. Some LDAP servers allow for anonymous queries so no bind DN and bind password may be required
Bind Password Bind DN’s password.
LDAP advanced properties User Filter The string used to query the LDAP server.
User ID Map Defines what gets displayed in WebSphere from resulting query.
ldapsearch –h
Note: The “%v” in the
For example, instead of "(&(cn=%v)(objectclass=ePerson))" use "(&(cn=bob)(objectclass=ePerson))"
Example ldapsearch queries
C:\>ldapsearch -h petunia -p 389 -b "o=ibm,c=us" uid=test
cn=test,o=ibm,c=us
sn=test
objectclass=top
objectclass=organizationalPerson
objectclass=ePerson
objectclass=person
objectclass=inetOrgPerson
uid=test
cn=test
C:\>ldapsearch -h petunia -p 389 -b "o=ibm,c=us" "(&(uid=test)(objectclass=ePerson))"
cn=test,o=ibm,c=us
sn=test
objectclass=top
objectclass=organizationalPerson
objectclass=ePerson
objectclass=person
objectclass=inetOrgPerson
uid=test
cn=test
Ldapsearch queries which would cause an exception for Application Server:
The following would fail in Application Server because the search filter is looking for an objectclass of “XYZ” but there is no “XYZ” objectclass defined LDAP. This results in an empty return string.
C:\>ldapsearch -h petunia -p 389 -b "o=ibm,c=us" "(&(uid=test)(objectclass=XYZ))"
The following search would fail in Application Server because 2 DN’s are returned instead of 1. Application Server will only authenticate using a single DN. If the query was uid=test instead of cn=test, then only one DN would have been returned.
C:\>ldapsearch -h petunia -p 389 -b "o=ibm,c=us" "(&(cn=test)(objectclass=ePerson))"
cn=test,o=ibm,c=us
sn=test
objectclass=top
objectclass=organizationalPerson
objectclass=ePerson
objectclass=person
objectclass=inetOrgPerson
uid=test
cn=test
cn=test,ou=Larry's Group,ou=Austin,o=ibm,c=us
sn=User
objectclass=top
objectclass=organizationalPerson
objectclass=ePerson
objectclass=person
objectclass=inetOrgPerson
cn=Test
Friday, May 1, 2009
How to generate a complete XMLAccess export of a Portal configuration
Question
How do you generate a full XMLAccess export of an IBM WebSphere® Portal configuration?
Answer
To assist in troubleshooting a WebSphere Portal issue, you may be asked by IBM Support to take a "full" or complete export of your Portal configuration using the XML Configuration Interface, commonly known as XMLAccess.
To generate a full export of your Portal's configuration, do the following:
1. Copy the file,/doc/xml-samples/Export.xml to /bin.
2. Open a terminal or command window. Change directories (cd) to/bin.
-- Execute (run) the script,/bin/setupCmdLine.
-- SetupCmdLine sets certain environment variables in the current window (such as JAVA_HOME).
3. From the directory,/bin, run the following xmlaccess command all on one line:
xmlaccess -user -password
-url:/wps/config -in Export.xml -out result.xml
Substitute Portal_admin_user, Portal_admin_password, myhost, and port with the correct values for your environment.
The file name specified after "-out" will contain the Portal configuration as XML. The file can have any name.
The protocol can be omitted after the -url parameter except in the case of SSL. SSL is only supported using Portal Version 6.0 and later.
If the file Export.xml is missing from your installation, contact Portal Support for the file or take a copy from another Portal host.
--------------------------------------------------------------------------------
Examples (using the default ports):
Version 5.0.x
xmlaccess -user wpsadmin -pwd Mypassword -url http://host.raleigh.ibm.com:9081/wps/config -in Export.xml -out result.xml
Version 5.1.x
xmlaccess -user wpsadmin -password Mypassword -url http://host.raleigh.ibm.com:9081/wps/config -in Export.xml -out result.xml
Version 6.0.x
xmlaccess -user wpsadmin -password Mypassword -url http://host.raleigh.ibm.com:10038/wps/config -in Export.xml -out result.xml
Version 6.0.x using SSL and the default port
xmlaccess -user wpsadmin -password Mypassword -url https://appserver_host_name:10035/wps/config -in Export.xml -out result.xml
Version 6.1.x
xmlaccess -user wpsadmin -password Mypassword -url http://host.raleigh.ibm.com:10038/wps/config -in Export.xml -out result.xml
How do you generate a full XMLAccess export of an IBM WebSphere® Portal configuration?
Answer
To assist in troubleshooting a WebSphere Portal issue, you may be asked by IBM Support to take a "full" or complete export of your Portal configuration using the XML Configuration Interface, commonly known as XMLAccess.
To generate a full export of your Portal's configuration, do the following:
1. Copy the file,
2. Open a terminal or command window. Change directories (cd) to
-- Execute (run) the script,
-- SetupCmdLine sets certain environment variables in the current window (such as JAVA_HOME).
3. From the directory,
xmlaccess -user
-url
Substitute Portal_admin_user, Portal_admin_password, myhost, and port with the correct values for your environment.
The file name specified after "-out" will contain the Portal configuration as XML. The file can have any name.
The protocol can be omitted after the -url parameter except in the case of SSL. SSL is only supported using Portal Version 6.0 and later.
If the file Export.xml is missing from your installation, contact Portal Support for the file or take a copy from another Portal host.
--------------------------------------------------------------------------------
Examples (using the default ports):
Version 5.0.x
xmlaccess -user wpsadmin -pwd Mypassword -url http://host.raleigh.ibm.com:9081/wps/config -in Export.xml -out result.xml
Version 5.1.x
xmlaccess -user wpsadmin -password Mypassword -url http://host.raleigh.ibm.com:9081/wps/config -in Export.xml -out result.xml
Version 6.0.x
xmlaccess -user wpsadmin -password Mypassword -url http://host.raleigh.ibm.com:10038/wps/config -in Export.xml -out result.xml
Version 6.0.x using SSL and the default port
xmlaccess -user wpsadmin -password Mypassword -url https://appserver_host_name:10035/wps/config -in Export.xml -out result.xml
Version 6.1.x
xmlaccess -user wpsadmin -password Mypassword -url http://host.raleigh.ibm.com:10038/wps/config -in Export.xml -out result.xml
Application Groups in WebSphere Member Manager
Abstract:
The main reason for using Application Groups is for read-only LDAP repositories. Many corporate directory systems do not allow application systems to add application-specific groups. To have better access control, however, Portal administrators may have to create these specific groups. IBM® WebSphere® Member Manager (WMM) provides a convenient way to set these groups in its database tables.
This technote contains some commonly asked questions and answers regarding Application Groups.
Resolving the problem
1. Where are Application Groups stored?
WMM stores the group information in database tables:
-- WMMDBMBR stores the group names.
-- WMMGRPMBR stores the name of the group members for Application Groups.
-- WMMMBR adds an entry for users or groups registered through the Portal no matter if they were added to the LDAP or Application Groups.
-- An entry is added to USER_DESC for every group.
2. Is "LookAside" required for this configuration?
No, LookAside and Application Groups are independent of each other. LookAside is used only in the Portal environment and is used for storing user attributes which are not standard LDAP server object classes. Application Groups reside in different sets of WMM tables and are used for creating Portal-specific groups.
3. Is there any performance benchmark for Application Groups?
No, there are no benchmark tests for the performance of Application Groups.
4. Do Application Groups support nested groups? For example, User A is in Group C which in turn is in Group F.
Yes. You can use nested groups as well as LDAP groups within Application Groups. However, in general, the use of nested groups is discouraged for performance reasons.
5. Is "groupCache" still supported when Application Groups are configured?
Yes, the "groupCache" configuration in WMM is for LDAP repository only. There is no conflict between "groupCache" and Application Groups, but Application Groups are not cached.
6. Can you change the suffix of Application Groups from "o=default organization" to something similar to "o=example.com"?
No. However, you can use node maps. For example, 'o=default organization' is the default root organization of the database. If you want to change the name in the database, you must modify the schema/bootstrap file which is not supported. But you can map it to others in wmm.xml and then use something similar to 'o=example.com' in the application. For example, between
... ,
you can add
7. Are there differences between realm support (WMMUR) and non-realm support (non-WMMUR) configurations with regards to Application Groups?
No. There is no difference for Application Groups regarding realm.
8. When configuring the group search filter, what group ObjectClass will be used for Application Groups?
Example: "groupOfNames," "groupOfUniqueNames," or something else?
Application Groups is stored in the database and ObjectClass is for LDAP only. You do not have to specify ObjectClass for Application Groups.
9. Can you still use groups in the LDAP server after configuring Application Groups?
After configuring Application Groups, both LDAP and database will be searched during group membership search. The Portal administrators group (wpsadmins) and all groups in LDAP will be searched and all the groups within the search base and search filter defined in LDAP repository stanza of wmm.xml, will be found correctly.
10. Is there a mechanism in WMM to prevent naming conflicts? Can you have groups of the same names within the LDAP and Application Groups?
Since the configuration for LDAP and Application Groups is in separate naming spaces, groups in LDAP and Application Groups are not in the same parent so there would be no conflict. However, a naming convention is recommended in practice for easy identification.
Example: Make all groups prefixed with "ag_," such as "ag_Managers."
11. What would the impact be should you decide to remove the Application Groups? Will the system stop working?
All the group membership information would be lost for Application Groups. The impact depends on how Portal Access Control (PAC) is configured. The recommendation is that before taking Application Groups away, you should create corresponding groups in LDAP to reflect all the configurations associated with Application Groups. A full XMLAccess export should give a complete picture of the ACLs.
12. Can Application Groups be used for admin groups in virtual portals?
Yes. Application Groups can be used just like other groups that participate in a multi-realm configuration. Therefore, the groups in Application Groups can be configured as admin groups in virtual portals.
13. Can you use Application Groups with External Security Managers (ESM), such as Tivoli® Access Manager?
No. The ESM must share an LDAP User profile repository with WebSphere Application and Portal servers. Application Groups are known only to the Portal.
14. Where can you find more information about Application Groups?
For more information, refer to the topic, "Enabling Application Groups", in the WebSphere Portal Information Center for V6.0 or the WebSphere Portal Information Center for V5.1.
The main reason for using Application Groups is for read-only LDAP repositories. Many corporate directory systems do not allow application systems to add application-specific groups. To have better access control, however, Portal administrators may have to create these specific groups. IBM® WebSphere® Member Manager (WMM) provides a convenient way to set these groups in its database tables.
This technote contains some commonly asked questions and answers regarding Application Groups.
Resolving the problem
1. Where are Application Groups stored?
WMM stores the group information in database tables:
-- WMMDBMBR stores the group names.
-- WMMGRPMBR stores the name of the group members for Application Groups.
-- WMMMBR adds an entry for users or groups registered through the Portal no matter if they were added to the LDAP or Application Groups.
-- An entry is added to USER_DESC for every group.
2. Is "LookAside" required for this configuration?
No, LookAside and Application Groups are independent of each other. LookAside is used only in the Portal environment and is used for storing user attributes which are not standard LDAP server object classes. Application Groups reside in different sets of WMM tables and are used for creating Portal-specific groups.
3. Is there any performance benchmark for Application Groups?
No, there are no benchmark tests for the performance of Application Groups.
4. Do Application Groups support nested groups? For example, User A is in Group C which in turn is in Group F.
Yes. You can use nested groups as well as LDAP groups within Application Groups. However, in general, the use of nested groups is discouraged for performance reasons.
5. Is "groupCache" still supported when Application Groups are configured?
Yes, the "groupCache" configuration in WMM is for LDAP repository only. There is no conflict between "groupCache" and Application Groups, but Application Groups are not cached.
6. Can you change the suffix of Application Groups from "o=default organization" to something similar to "o=example.com"?
No. However, you can use node maps. For example, 'o=default organization' is the default root organization of the database. If you want to change the name in the database, you must modify the schema/bootstrap file which is not supported. But you can map it to others in wmm.xml and then use something similar to 'o=example.com' in the application. For example, between
you can add
7. Are there differences between realm support (WMMUR) and non-realm support (non-WMMUR) configurations with regards to Application Groups?
No. There is no difference for Application Groups regarding realm.
8. When configuring the group search filter, what group ObjectClass will be used for Application Groups?
Example: "groupOfNames," "groupOfUniqueNames," or something else?
Application Groups is stored in the database and ObjectClass is for LDAP only. You do not have to specify ObjectClass for Application Groups.
9. Can you still use groups in the LDAP server after configuring Application Groups?
After configuring Application Groups, both LDAP and database will be searched during group membership search. The Portal administrators group (wpsadmins) and all groups in LDAP will be searched and all the groups within the search base and search filter defined in LDAP repository stanza of wmm.xml, will be found correctly.
10. Is there a mechanism in WMM to prevent naming conflicts? Can you have groups of the same names within the LDAP and Application Groups?
Since the configuration for LDAP and Application Groups is in separate naming spaces, groups in LDAP and Application Groups are not in the same parent so there would be no conflict. However, a naming convention is recommended in practice for easy identification.
Example: Make all groups prefixed with "ag_," such as "ag_Managers."
11. What would the impact be should you decide to remove the Application Groups? Will the system stop working?
All the group membership information would be lost for Application Groups. The impact depends on how Portal Access Control (PAC) is configured. The recommendation is that before taking Application Groups away, you should create corresponding groups in LDAP to reflect all the configurations associated with Application Groups. A full XMLAccess export should give a complete picture of the ACLs.
12. Can Application Groups be used for admin groups in virtual portals?
Yes. Application Groups can be used just like other groups that participate in a multi-realm configuration. Therefore, the groups in Application Groups can be configured as admin groups in virtual portals.
13. Can you use Application Groups with External Security Managers (ESM), such as Tivoli® Access Manager?
No. The ESM must share an LDAP User profile repository with WebSphere Application and Portal servers. Application Groups are known only to the Portal.
14. Where can you find more information about Application Groups?
For more information, refer to the topic, "Enabling Application Groups", in the WebSphere Portal Information Center for V6.0 or the WebSphere Portal Information Center for V5.1.
How to get user ID of logged-in user from LDAP
How do you retrieve the user ID of a logged-in user from the LDAP instead of the user name which may not be unique?
There are two ways to achieve this :
1. Setting the "api.use.dn" parameter in WCMConfigService.properties to True gives you the distinguished name (DN) of the user instead of the display name when calling the getUserName() method.
2. You can dynamically set this by calling
"workspace.useDistinguishedNames(true)" before calling "workspace.getUserProfile()".
Essentially this would be similar to the following:
Workspace workspace = p_contextProcessorParams.getWorkspace();
workspace.useDistinguishedNames(true);
String currentCust = CustContextProcessorUtils.getCustomer(workspace.getUserProfile().getUsername());
There are two ways to achieve this :
1. Setting the "api.use.dn" parameter in WCMConfigService.properties to True gives you the distinguished name (DN) of the user instead of the display name when calling the getUserName() method.
2. You can dynamically set this by calling
"workspace.useDistinguishedNames(true)" before calling "workspace.getUserProfile()".
Essentially this would be similar to the following:
Workspace workspace = p_contextProcessorParams.getWorkspace();
workspace.useDistinguishedNames(true);
String currentCust = CustContextProcessorUtils.getCustomer(workspace.getUserProfile().getUsername());
Subscribe to:
Posts (Atom)