<p style="font-weight: bold">
<font size="4">EXTRACT FROM Building Websites with penCms </font>
</p>
<p>
 
</p>
<p>
<span style="font-weight: bold">Creating Web Users</span><br />
Membership-based sites often allow visitors to sign up for membership. The following is<br />
a basic form for creating a new user:<br />
<form method="POST" action="create_user.jsp"><br />
First Name: <input type="text" name="fname" /><br/><br />
Last Name: <input type="text" name="lname" /><br/><br />
User Name: <input type="text" name="uname" /><br/><br />
Email: <input type="text" name="email" /><br/><br />
Password: <input type="password" name="pw1" /><br/><br />
Password (Again): <input type="password" name="pw2" /><br/><br />
<input type="submit" value=" Create Account "/><br />
</form><br />
This simple form gets the basic user information and sends it to the create_user.jsp<br />
page, which looks like this:<br />
<%@ page session="false" %><br />
<%@ taglib prefix="cms"<br />
uri="http://www.opencms.org/taglib/cms" %><br />
<cms:include property="template" element="head"/><br />
<cms:include file="/system/modules/com.example.site/elements/create_webuser.jsp"<br />
/><br />
<p>Your account was created successfully.</p><br />
<cms:include property="template" element="foot" /><br />
All this JSP does is include the create_webuser.jsp file, which contains a scriptlet for<br />
adding a new Web User to the OpenCms database. Note that the template property for<br />
this JSP page is set. As we saw in Chapter 3, the <cms:include property="template"<br />
/> elements retrieve information from the JSP template file referenced by the file's<br />
template property.
</p>
<p>
 
</p>
<p>
 
</p>
<p>
 
</p>
<hr />
<br />
<span style="font-weight: bold">The create_webuser.jsp Scriptlet</span><br />
The create_webuser.jsp is responsible for checking the input and then creating the<br />
user's new account.<br />
<%@ page import="com.opencms.flex.jsp.CmsJspActionElement,<br />
com.opencms.core.CmsException,<br />
com.opencms.core.I_CmsConstants,<br />
com.opencms.util.MailUtils,<br />
com.opencms.file.CmsObject,<br />
com.opencms.file.CmsUser,<br />
java.util.Hashtable"<br />
%><br />
<%<br />
String firstName = request.getParameter("fname");<br />
String lastName = request.getParameter("lname");<br />
String userName = request.getParameter("uname");<br />
String email = request.getParameter("email");<br />
String password1 = request.getParameter("pw1");<br />
String password2 = request.getParameter("pw2");<br />
String group = "Guests";<br />
CmsJspActionElement cmsjsp =<br />
new CmsJspActionElement( pageContext, request, response );<br />
CmsObject cms = cmsjsp.getCmsObject();<br />
// Test each field<br />
if ( userName == null || "".equals(userName) ) {<br />
throw new CmsException( "User Name is required." );<br />
} else if ( email == null || "".equals(email) ) {<br />
throw new CmsException( "Email is required." );<br />
} else if ( password1 == null || "".equals( password1 ) ) {<br />
throw new CmsException( "Password is required." );<br />
} else if ( password2 == null || "".equals( password2 ) ) {<br />
throw new CmsException( "Password Again is required." );<br />
} else if ( !MailUtils.checkEmail( email )) {<br />
throw new CmsException( "Email address must be valid." );<br />
} else if ( !password1.equals( password2 )) {<br />
throw new CmsException( "Passwords do not match." );<br />
} else if ( password1.length() < 7 ) {<br />
throw new CmsException(<br />
"Password must be at least 7 characters." );<br />
}<br />
// Set default values for optional params.<br />
if ( firstName == null ) {<br />
firstName = "";<br />
}
<p>
 
</p>
<p>
if ( lastName == null ) {<br />
lastName = "";<br />
}<br />
// Hashtable for custom parameters<br />
Hashtable params = new Hashtable();<br />
CmsUser user = cms.addWebUser( userName, // Username<br />
password1, // Password<br />
group, // Default Group<br />
"Web User", // Comment<br />
params, // Params Hashtable<br />
I_CmsConstants.C_FLAG_ENABLED<br />
);<br />
user.setFirstname( firstName );<br />
user.setLastname( lastName );<br />
user.setEmail( email );<br />
cms.writeWebUser( user ); // Write changes to DB.<br />
%><br />
The first thing this scriptlet does is retrieve all of the necessary parameters from the builtin<br />
request object. Then, it creates the CmsJspActionElement and fetches the CmsObject<br />
that we will need for creating users.<br />
Once it has done that, it checks all the required fields (note that these do not include the<br />
first and last name fields, which are optional). If one of the parameters does not meet the<br />
requirements, the JSP throws a CmsException, which will display the error dialog box to<br />
the end user. While this is the standard way of handling errors, you may find it desirable<br />
to make the error output a little more attractive.<br />
There is no code to check for the existence of a user. This code is absent for two reasons.<br />
First, there is no function for checking to see if a user exists. Second, users with low<br />
privileges (like Guest and Web Users) must supply a valid password to use the<br />
CmsObject.readUser() and readWebUser() methods. So, instead of being able to<br />
proactively check, we must rely on the exception thrown by CmsObject.addWebUser().<br />
After the required parameters are checked, the optional parameters, firstName and<br />
lastName, are initialized, and an empty java.util.Hashtable is created. The<br />
Hashtable can be used for storing arbitrary name/object pairs. OpenCms uses it for<br />
storing configuration information. Frequently, developers use the Hashtable for storing<br />
additional contact information such as addresses and phone numbers. The Hashtable<br />
object is serialized and stored in the database, so make sure that anything you put in the<br />
Hashtable implements java.io.Serializable.<br />
Next, a new CmsUser is created by executing the cms.addWebUser() method.<br />
addWebUser() takes six parameters: user name, password, initial group ('Guests' in our<br />
case), a comment, the parameters Hashtable, and an integer called flags.
</p>
<p>
 
</p>
<p>
The flags parameter should use one of two constants:<br />
I_CmsConstants.C_FLAG_ENABLED or I_CmsConstants.C_FLAG_DISABLED. The first<br />
flag marks the user's account as activated, and will allow the user to log in and use the
</p>
<p>
account. The other flag will leave the user's information in the database, but will not<br />
allow the account to be used.<br />
Again, the addWebUser() method will throw a CmsException if it cannot create the user.<br />
This could be caused by the existence of a duplicate user name, but it may occur for other<br />
reasons as well.<br />
Once the new CmsUser object has been created (and the initial user added to the<br />
database), we set three more properties for the user:<br />
user.setFirstname( firstName );<br />
user.setLastname( lastName );<br />
user.setEmail( email );<br />
These mutator methods only change the current object. In order to get the changes to<br />
propagate into the database, we also have to run cms.writeWebUser(). <br />
</p>
<p>
 
</p>
<p>
 
</p>
<hr />
<span style="font-weight: bold">Authenticating Web Users</span>
<p>
 
</p>
<p>
 Authenticating Web Users, like creating Web Users, requires a certain amount of work.<br />
There are no built-in authentication mechanisms that restrict viewing of published<br />
resources based on Web User settings.<br />
Here I will demonstrate a simple mechanism for testing for authentication, but this<br />
method will only work for dynamic pages. It uses a JSP scriptlet in the template for<br />
handling authentication. Exported pages will render the scriptlet at publishing time, and<br />
will not rerun it for each request, so the code will not provide any authentication for<br />
exported pages.<br />
The first thing we need is a scriptlet for logging Web Users into OpenCms:<br />
<%@ page import="com.opencms.flex.jsp.CmsJspActionElement,<br />
com.opencms.core.CmsException,<br />
com.opencms.file.CmsObject,<br />
com.opencms.file.CmsUser"<br />
%><br />
<%<br />
CmsJspActionElement cmsjsp =<br />
new CmsJspActionElement( pageContext, request, response );<br />
CmsObject cms = cmsjsp.getCmsObject();<br />
String username = request.getParameter( "username" );<br />
String password = request.getParameter( "password" );<br />
boolean logout = "true".equals(<br />
request.getParameter( "logout" ));
</p>
<p>
if( logout ) {<br />
// Log in Guest<br />
cms.loginUser( cms.anonymousUser().getName(), "" );<br />
}<br />
if( username == null || "".equals( username )) {<br />
String currentUser = cmsjsp.user( "name" );<br />
if( currentUser != null &&<br />
! "".equals( currentUser ) &&<br />
! "guest".equals( currentUser.toLowerCase() )) {<br />
// User is logged in.<br />
out.println( "You are logged in as " + currentUser );<br />
}<br />
} else {<br />
try {<br />
cms.loginWebUser( username, password );<br />
out.println( "You are logged in as "<br />
+ cmsjsp.user( "name" ));<br />
} catch( CmsException e ) {<br />
out.println( "Login Failed." );<br />
}<br />
}<br />
%>
</p>
<p>
 
</p>
<p>
This script looks for three parameters: username, password, and logout. The first two<br />
are used to log a new user in. The third is used to log the user in as Guest. Since there is<br />
no logout function and every visitor must be logged in, logging a user in as Guest is the<br />
closest we can come to actually logging someone out of the system.<br />
If username is null or blank, the user is not trying to log in. In this case, we just check to<br />
see if the user is already logged in. CmsJspActionElement has a useful method for<br />
accessing user properties, and we use cmsjsp.user( "name" ) to get the name of the<br />
currently logged-in user. If the currently logged-in user isn't Guest (or is empty), we print<br />
out the user's name.<br />
If the username parameter is set, we assume that a visitor is logging in. To log in a Web<br />
User, we use the loginWebUser() method, which differs in security settings from the<br />
loginUser() method that is also in the CmsObject. loginWebUser() is used for<br />
authenticating Web Users, while loginUser() should only be used to authenticate a<br />
CMS User. If the login attempt is successful, it prints out a simple message. Otherwise, it<br />
prints an error message.
</p>
<p>
 
</p>
<p>
<span style="font-weight: bold">Using the Authentication JSP</span><br />
This scriptlet must be called from another JSP document. The following document has a<br />
form for logging in:<br />
<%@ page session="false" %><br />
<%@ taglib prefix="cms"<br />
uri="http://www.opencms.org/taglib/cms" %><br />
<cms:include property="template" element="head"/><br />
<cms:include<br />
file="/system/modules/com.example.site/elements/auth.jsp"/> 
</p>
<p>
 
</p>
<p>
<form method="POST"><br />
Username: <input type="text" name="username" /><br/><br />
Password: <input type="password" name="password" /><br/><br />
<input type="submit" value="Login"/><br />
</form><br />
<a href="?logout=true">Logout</a><br />
<cms:include property="template" element="foot" /><br />
This simple JSP includes the scriptlet we created above, and then provides a simple form<br />
for entering the user name and password, as well as providing a 'log out' link at the<br />
bottom. Using this form, a visitor can log in to OpenCms as a Web User.<br />
Since the Web User and CMS User concepts are so similar in OpenCms, users logged in<br />
as CMS Users will have all of the privileges of Web Users—the system will see them as<br />
being logged-in users. However, they will not be able to log in using this form, which<br />
will only log in Web Users (the loginWebUser() method will not authenticate a CMS<br />
User). A CMS User will have to log in using the built-in Workplace login screen or some<br />
other custom screen that uses the loginUser() method to authenticate.
</p>
<p>
 
</p>
<p>
<span style="font-weight: bold">Restricting Access through a Template</span><br />
Now, we can restrict access to certain resources to allow only users who are already<br />
logged in. Checking to see if a user is logged in can be done with a small scriptlet of a<br />
few lines:<br />
<%@ page import="com.opencms.flex.jsp.CmsJspActionElement,<br />
com.opencms.file.CmsObject"<br />
%><br />
<%<br />
String LOGIN_PAGE = "/playground/login.jsp";<br />
CmsJspActionElement cmsjsp =<br />
new CmsJspActionElement( pageContext, request, response );<br />
CmsObject cms = cmsjsp.getCmsObject();<br />
String currentUser = cmsjsp.user( "name" );<br />
if( currentUser == null &&<br />
"".equals( currentUser ) &&<br />
"guest".equals( currentUser.toLowerCase() )) {<br />
response.sendRedirect( LOGIN_PAGE );<br />
}<br />
%> <br />
</p>
<p>
 
</p>
<p>
 
</p>
--<br />
Jordi Marquès Ferré (jordi.marques@iigov.org)<br />
<br />
<br />
<br />
<br />
<div id="rep" style="padding-left: 10px">
<div id="repRep" style="border-left: 2px solid red; padding-left: 10px">
Hi, I simplify my question:<br />
<br />
1) With a JSP page, how can we create one new webuser using opencms APIs?<br />
<br />
2) As username and password for the new webuser could I use the email <br />
address<br />
and a password both typed in a form by the user ?<br />
<br />
Thank's, since now, for some useful solutions at this questions!<br />
Marco.<br />
<br />
<br />
_______________________________________________<br />
This mail is sent to you from the opencms-dev mailing list<br />
To change your list options, or to unsubscribe from the list, please visit<br />
http://lists.opencms.org/mailman/listinfo/opencms-dev<br />
</div>
</div>