Author: raminder
Date: Wed Oct 3 20:54:07 2012
New Revision: 1393757
URL: http://svn.apache.org/viewvc?rev=1393757&view=rev
Log:
To provide feature to create new openid users in Rave. RAVE-775
Added:
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/handler/
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandler.java
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/handler/
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandlerTest.java
Modified:
rave/trunk/rave-components/rave-core/pom.xml
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/UserRepository.java
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/UserService.java
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultNewAccountService.java
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultUserService.java
rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultUserServiceTest.java
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/model/JpaUser.java
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/repository/impl/JpaUserRepository.java
rave/trunk/rave-components/rave-jpa/src/test/java/org/apache/rave/portal/repository/impl/JpaUserRepositoryTest.java
rave/trunk/rave-components/rave-jpa/src/test/resources/test_data.sql
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/NewAccountController.java
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/NewAccountControllerTest.java
rave/trunk/rave-portal-resources/src/main/resources/messages.properties
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/applicationContext-security.xml
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/db/initial_data.sql
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/includes/new_user_form.jsp
Modified: rave/trunk/rave-components/rave-core/pom.xml
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-core/pom.xml?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- rave/trunk/rave-components/rave-core/pom.xml (original)
+++ rave/trunk/rave-components/rave-core/pom.xml Wed Oct 3 20:54:07 2012
@@ -82,6 +82,10 @@
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.springframework.security</groupId>
+ <artifactId>spring-security-openid</artifactId>
+ </dependency>
<!-- Jackson JSON Mapper -->
<dependency>
Modified:
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/UserRepository.java
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/UserRepository.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
---
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/UserRepository.java
(original)
+++
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/UserRepository.java
Wed Oct 3 20:54:07 2012
@@ -40,6 +40,14 @@ public interface UserRepository extends
* @return {@link org.apache.rave.portal.model.User} if one exists,
otherwise {@literal null}
*/
User getByUserEmail(String userEmail);
+
+ /**
+ * Gets a {@link org.apache.rave.portal.model.User} by openId
+ *
+ * @param openId the (unique) openIdURL of the user
+ * @return {@link org.apache.rave.portal.model.User} if one exists,
otherwise {@literal null}
+ */
+ User getByOpenId(String openId);
/**
* List of {@link org.apache.rave.portal.model.User}'s with a limited
resultset
Modified:
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/UserService.java
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/UserService.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
---
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/UserService.java
(original)
+++
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/UserService.java
Wed Oct 3 20:54:07 2012
@@ -25,9 +25,11 @@ import java.util.List;
import org.apache.rave.portal.model.Person;
import org.apache.rave.portal.model.User;
import org.apache.rave.portal.model.util.SearchResult;
+import
org.springframework.security.core.userdetails.AuthenticationUserDetailsService;
import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.openid.OpenIDAuthenticationToken;
-public interface UserService extends UserDetailsService {
+public interface UserService extends UserDetailsService,
AuthenticationUserDetailsService<OpenIDAuthenticationToken> {
/**
* Get the currently authenticated user.
*
@@ -195,4 +197,13 @@ public interface UserService extends Use
*/
boolean acceptFriendRequest(String friendUsername, String username);
+
+ /**
+ * Return a user object by the openId.
+ *
+ * @param openId OpenId url of the user
+ * @return {@link org.apache.rave.portal.model.User} if one exists,
otherwise {@literal null}
+ */
+ User getUserByOpenId(String openId);
+
}
\ No newline at end of file
Modified:
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultNewAccountService.java
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultNewAccountService.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
---
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultNewAccountService.java
(original)
+++
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultNewAccountService.java
Wed Oct 3 20:54:07 2012
@@ -62,6 +62,7 @@ public class DefaultNewAccountService im
final String displayName = newUser.getDisplayName();
final String status = newUser.getStatus();
final String aboutMe = newUser.getAboutMe();
+ final String openId = newUser.getOpenId();
throwExceptionIfUserExists(userName, email);
@@ -84,6 +85,7 @@ public class DefaultNewAccountService im
user.setDisplayName(displayName);
user.setStatus(status);
user.setAboutMe(aboutMe);
+ user.setOpenId(openId);
userService.registerNewUser(user);
}
Modified:
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultUserService.java
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultUserService.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
---
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultUserService.java
(original)
+++
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultUserService.java
Wed Oct 3 20:54:07 2012
@@ -56,6 +56,7 @@ import org.springframework.security.core
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.codec.Base64;
import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.openid.OpenIDAuthenticationToken;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -219,6 +220,11 @@ public class DefaultUserService implemen
public User getUserByEmail(String userEmail) {
return userRepository.getByUserEmail(userEmail);
}
+
+ @Override
+ public User getUserByOpenId(String openId) {
+ return userRepository.getByOpenId(openId);
+ }
@Override
@Transactional
@@ -396,4 +402,14 @@ public class DefaultUserService implemen
return personRepository.acceptFriendRequest(friendUsername,username);
}
+ @Override
+ public UserDetails loadUserDetails(OpenIDAuthenticationToken token)
throws UsernameNotFoundException {
+ final String openId = token.getIdentityUrl();
+ User user = this.getUserByOpenId(openId);
+ if (user == null) {
+ log.info("Open ID User with URL "+openId+" was not
found!");
+ throw new UsernameNotFoundException("Open ID User with
URL "+openId+" was not found!");
+ }
+ return user;
+ }
}
Modified:
rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultUserServiceTest.java
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultUserServiceTest.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
---
rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultUserServiceTest.java
(original)
+++
rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultUserServiceTest.java
Wed Oct 3 20:54:07 2012
@@ -67,6 +67,9 @@ import org.springframework.security.core
import org.springframework.security.core.context.SecurityContextImpl;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.openid.OpenIDAttribute;
+import org.springframework.security.openid.OpenIDAuthenticationStatus;
+import org.springframework.security.openid.OpenIDAuthenticationToken;
public class DefaultUserServiceTest {
@@ -83,6 +86,8 @@ public class DefaultUserServiceTest {
private static final String USER_NAME = "1234";
private static final String USER_EMAIL = "[email protected]";
+ private static final String OPENID_INVALID = "http://user.myopenid.com/";
+ private static final String OPENID_VALID = "http://rave2011.myopenid.com/";
private static final Long VALID_WIDGET_ID = 1L;
private static final Long INVALID_USER_ID = -9999L;
@@ -215,8 +220,8 @@ public class DefaultUserServiceTest {
@Test
public void getUserByEmail_valid() {
- final User authUser=new UserImpl(USER_ID,USER_NAME);
- authUser.setEmail(USER_EMAIL);
+ final User authUser=new UserImpl(USER_ID,USER_NAME);
+ authUser.setEmail(USER_EMAIL);
expect(userRepository.getByUserEmail(USER_EMAIL)).andReturn(authUser).anyTimes();
replay(userRepository);
@@ -224,6 +229,41 @@ public class DefaultUserServiceTest {
assertThat((User)result, is(sameInstance(authUser)));
verify(userRepository);
}
+
+ @Test
+ public void getUserByOpenId_valid() {
+ final User authUser=new UserImpl(USER_ID,USER_NAME);
+ authUser.setOpenId(OPENID_VALID);
+
expect(userRepository.getByOpenId(OPENID_VALID)).andReturn(authUser).anyTimes();
+ replay(userRepository);
+
+ UserDetails result = service.getUserByOpenId(OPENID_VALID);
+ assertThat((User)result, is(sameInstance(authUser)));
+ verify(userRepository);
+ }
+
+ @Test
+ public void loadUserDetails_valid() {
+ final User authUser=new UserImpl(USER_ID,USER_NAME);
+ authUser.setOpenId(OPENID_VALID);
+
expect(userRepository.getByOpenId(OPENID_VALID)).andReturn(authUser).anyTimes();
+ replay(userRepository);
+ OpenIDAuthenticationToken postAuthToken = new
OpenIDAuthenticationToken(OpenIDAuthenticationStatus.SUCCESS,OPENID_VALID,
+ "Some message", new ArrayList<OpenIDAttribute>());
+ UserDetails result = service.loadUserDetails(postAuthToken);
+ assertThat((User)result, is(sameInstance(authUser)));
+ verify(userRepository);
+ }
+
+ @Test(expected = UsernameNotFoundException.class)
+ public void loadUserDetails_invalid_exception() {
+ expect(userRepository.getByOpenId(OPENID_INVALID)).andReturn(null);
+ replay(userRepository);
+ OpenIDAuthenticationToken postAuthToken = new
OpenIDAuthenticationToken(OpenIDAuthenticationStatus.SUCCESS,OPENID_INVALID,
+ "Some message", new ArrayList<OpenIDAttribute>());
+ service.loadUserDetails(postAuthToken);
+ verify(userRepository);
+ }
@Test
Modified:
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/model/JpaUser.java
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/model/JpaUser.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
---
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/model/JpaUser.java
(original)
+++
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/model/JpaUser.java
Wed Oct 3 20:54:07 2012
@@ -39,6 +39,7 @@ import java.util.*;
@NamedQueries({
@NamedQuery(name = JpaUser.USER_GET_BY_USERNAME, query = "select u
from JpaUser u where u.username = :"+ JpaUser.PARAM_USERNAME),
@NamedQuery(name = JpaUser.USER_GET_BY_USER_EMAIL, query = "select u
from JpaUser u where u.email = :"+ JpaUser.PARAM_EMAIL),
+ @NamedQuery(name = JpaUser.USER_GET_BY_OPENID, query = "select u from
JpaUser u where u.openId = :"+ JpaUser.PARAM_OPENID),
@NamedQuery(name = JpaUser.USER_GET_ALL, query = "select u from
JpaUser u order by u.username asc"),
@NamedQuery(name = JpaUser.USER_GET_BY_FORGOT_PASSWORD_HASH, query =
"select u from JpaUser u where u.forgotPasswordHash = :" +
JpaUser.PARAM_FORGOT_PASSWORD_HASH),
@NamedQuery(name = JpaUser.USER_COUNT_ALL, query = "select count(u)
from JpaUser u"),
@@ -54,6 +55,7 @@ public class JpaUser extends JpaPerson i
public static final String USER_GET_BY_USERNAME = "User.getByUsername";
public static final String USER_GET_BY_USER_EMAIL = "User.getByUserEmail";
+ public static final String USER_GET_BY_OPENID = "User.getByOpenId";
public static final String USER_GET_ALL = "User.getAll";
public static final String USER_COUNT_ALL = "User.countAll";
public static final String USER_FIND_BY_USERNAME_OR_EMAIL =
"User.findByUsernameOrEmail";
@@ -65,6 +67,7 @@ public class JpaUser extends JpaPerson i
public static final String PARAM_USERNAME = "username";
public static final String PARAM_FORGOT_PASSWORD_HASH =
"forgotPasswordHash";
public static final String PARAM_EMAIL = "email";
+ public static final String PARAM_OPENID = "openId";
public static final String PARAM_SEARCHTERM = "searchTerm";
public static final String PARAM_WIDGET_ID = "widgetId";
@@ -85,7 +88,7 @@ public class JpaUser extends JpaPerson i
@Column(name = "enabled")
private boolean enabled;
- @Basic
+ @Basic
@Column(name = "openid")
private String openId;
Modified:
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/repository/impl/JpaUserRepository.java
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/repository/impl/JpaUserRepository.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
---
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/repository/impl/JpaUserRepository.java
(original)
+++
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/repository/impl/JpaUserRepository.java
Wed Oct 3 20:54:07 2012
@@ -61,6 +61,13 @@ public class JpaUserRepository implement
}
@Override
+ public User getByOpenId(String openId) {
+ TypedQuery<JpaUser> query =
manager.createNamedQuery(JpaUser.USER_GET_BY_OPENID, JpaUser.class);
+ query.setParameter(JpaUser.PARAM_OPENID, openId);
+ return getSingleResult(query.getResultList());
+ }
+
+ @Override
public List<User> getLimitedList(int offset, int pageSize) {
TypedQuery<JpaUser> query =
manager.createNamedQuery(JpaUser.USER_GET_ALL, JpaUser.class);
return CollectionUtils.<User>toBaseTypedList(getPagedResultList(query,
offset, pageSize));
Modified:
rave/trunk/rave-components/rave-jpa/src/test/java/org/apache/rave/portal/repository/impl/JpaUserRepositoryTest.java
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-jpa/src/test/java/org/apache/rave/portal/repository/impl/JpaUserRepositoryTest.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
---
rave/trunk/rave-components/rave-jpa/src/test/java/org/apache/rave/portal/repository/impl/JpaUserRepositoryTest.java
(original)
+++
rave/trunk/rave-components/rave-jpa/src/test/java/org/apache/rave/portal/repository/impl/JpaUserRepositoryTest.java
Wed Oct 3 20:54:07 2012
@@ -50,10 +50,12 @@ public class JpaUserRepositoryTest {
private EntityManager manager;
private static final Long USER_ID = 1L;
+ private static final Long USER_ID_OPENID_USER = 13L;
private static final String USER_NAME = "canonical";
private static final Long INVALID_USER = -2L;
private static final String USER_EMAIL = "[email protected]";
+ private static final String OPENID = "http://rave2011.myopenid.com/";
private static final Long VALID_WIDGET_ID = 1L;
@Autowired
@@ -107,6 +109,15 @@ public class JpaUserRepositoryTest {
assertThat(user.isAccountNonExpired(), is(true));
assertThat(user.getEmail(), is(equalTo(USER_EMAIL)));
}
+
+ @Test
+ public void getByOpenId_valid() {
+ JpaUser user = (JpaUser)repository.getByOpenId(OPENID);
+ assertThat(user, notNullValue());
+ assertThat(user.getEntityId(), is(equalTo(USER_ID_OPENID_USER)));
+ assertThat(user.isAccountNonExpired(), is(true));
+ assertThat(user.getOpenId(), is(equalTo(OPENID)));
+ }
@Test
public void addOrDeleteUserDoesNotAffectAuthority() {
Modified: rave/trunk/rave-components/rave-jpa/src/test/resources/test_data.sql
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-jpa/src/test/resources/test_data.sql?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- rave/trunk/rave-components/rave-jpa/src/test/resources/test_data.sql
(original)
+++ rave/trunk/rave-components/rave-jpa/src/test/resources/test_data.sql Wed
Oct 3 20:54:07 2012
@@ -188,8 +188,8 @@ UPDATE RAVE_PORTAL_SEQUENCES SET seq_cou
-- duplicate user id!!
set @user_id_13 = (SELECT seq_count FROM RAVE_PORTAL_SEQUENCES WHERE seq_name
= @user_seq);
-insert into person (entity_id, username, password, expired, locked, enabled,
email, default_page_layout_id, dtype, family_name, given_name, status)
-values (@user_id_13, 'http://rave2011.myopenid.com/',
'$2a$10$dML97.rnOn4.iSlEEdju8OCB2NckuKw0Ki5yMVzzMmWQsWMvym3qC', FALSE, FALSE,
TRUE,'[email protected]', @three_col_id, 'User', 'Openid', 'Rave',
'Single');
+insert into person (entity_id, username, password, expired, locked, enabled,
email, default_page_layout_id, dtype, family_name, given_name, status, openid)
+values (@user_id_13, 'rave2011.myopenid.com',
'$2a$10$dML97.rnOn4.iSlEEdju8OCB2NckuKw0Ki5yMVzzMmWQsWMvym3qC', FALSE, FALSE,
TRUE,'[email protected]', @three_col_id, 'User', 'Openid', 'Rave',
'Single', 'http://rave2011.myopenid.com/');
UPDATE RAVE_PORTAL_SEQUENCES SET seq_count = (seq_count + 1) WHERE seq_name =
@user_seq;
--- end user data ---
Modified:
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/NewAccountController.java
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/NewAccountController.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
---
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/NewAccountController.java
(original)
+++
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/NewAccountController.java
Wed Oct 3 20:54:07 2012
@@ -19,6 +19,9 @@
package org.apache.rave.portal.web.controller;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.rave.portal.model.User;
import org.apache.rave.portal.model.impl.UserImpl;
import org.apache.rave.portal.service.CaptchaService;
import org.apache.rave.portal.service.NewAccountService;
@@ -40,8 +43,6 @@ import org.springframework.web.bind.anno
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-import javax.servlet.http.HttpServletRequest;
-
@Controller
public class NewAccountController {
private final Logger logger = LoggerFactory.getLogger(getClass());
@@ -53,7 +54,6 @@ public class NewAccountController {
@Value("#{messages['page.newaccount.message.created']}")
private String messageSuccess;
-
@Autowired
public NewAccountController(NewAccountService newAccountService,
NewAccountValidator newAccountValidator, CaptchaService captchaService) {
this.newAccountService = newAccountService;
@@ -68,7 +68,7 @@ public class NewAccountController {
model.addAttribute(ModelKeys.NEW_USER, new UserImpl());
return ViewNames.NEW_ACCOUNT;
}
-
+
@RequestMapping(value = {"/newaccount", "/newaccount/*"}, method =
RequestMethod.POST)
public String create(@ModelAttribute(value = "newUser") UserForm newUser,
BindingResult results, Model model, HttpServletRequest request,
RedirectAttributes redirectAttributes) {
logger.debug("Creating a new user account");
@@ -116,6 +116,15 @@ public class NewAccountController {
}
+ @RequestMapping(value = "/openidregister", method = RequestMethod.GET)
+ public String setUpOpenIdForm(ModelMap model, HttpServletRequest request) {
+ logger.debug("Initializing account creation form");
+ User user = (User)
request.getSession(false).getAttribute(ModelKeys.NEW_USER);
+ model.addAttribute(ModelKeys.CAPTCHA_HTML,
captchaService.createHtml(request));
+ model.addAttribute(ModelKeys.NEW_USER, user);
+ return ViewNames.NEW_ACCOUNT;
+ }
+
private void initializeCaptcha(Model model, HttpServletRequest request) {
model.addAttribute(ModelKeys.CAPTCHA_HTML,
captchaService.createHtml(request));
}
Added:
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandler.java
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandler.java?rev=1393757&view=auto
==============================================================================
---
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandler.java
(added)
+++
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandler.java
Wed Oct 3 20:54:07 2012
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.rave.portal.web.controller.handler;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.rave.portal.model.User;
+import org.apache.rave.portal.model.impl.UserImpl;
+import org.apache.rave.portal.web.util.ModelKeys;
+import org.apache.rave.portal.web.util.ViewNames;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.openid.OpenIDAttribute;
+import org.springframework.security.openid.OpenIDAuthenticationStatus;
+import org.springframework.security.openid.OpenIDAuthenticationToken;
+import org.springframework.security.web.DefaultRedirectStrategy;
+import
org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
+import org.springframework.stereotype.Controller;
+
+/**
+ * Controller which processes openid authentication failure. If the user
record for particular
+ * openid user is not found in the DB, it redirects to the account creation
page. Otherwise
+ * it redirects to the default authentication failure page.
+ *
+ */
+@Controller
+public class OpenIDAuthenticationFailureHandler extends
SimpleUrlAuthenticationFailureHandler {
+
+ private static Logger log =
LoggerFactory.getLogger(OpenIDAuthenticationFailureHandler.class);
+
+ @Override
+ public void onAuthenticationFailure(HttpServletRequest request,
HttpServletResponse response, AuthenticationException exception) throws
IOException, ServletException {
+ if(exception instanceof UsernameNotFoundException
+ && exception.getAuthentication() instanceof
OpenIDAuthenticationToken
+ &&
((OpenIDAuthenticationToken)exception.getAuthentication()).getStatus().equals(OpenIDAuthenticationStatus.SUCCESS))
{
+
+ OpenIDAuthenticationToken token =
(OpenIDAuthenticationToken)exception.getAuthentication();
+ String url = token.getIdentityUrl();
+ User user = createTemporaryUser(token, url);
+
request.getSession(true).setAttribute(ModelKeys.NEW_USER, user);
+
+ DefaultRedirectStrategy redirectStrategy = new
DefaultRedirectStrategy();
+ log.info("Redirecting to new user account creation
page");
+ super.setRedirectStrategy(redirectStrategy);
+ redirectStrategy.sendRedirect(request, response,
"/"+ViewNames.CREATE_ACCOUNT_PAGE);
+ return;
+ } else {
+ super.onAuthenticationFailure(request, response,
exception);
+ }
+ }
+
+ private User createTemporaryUser(OpenIDAuthenticationToken token,
+ final String openId) {
+ final List<OpenIDAttribute> attributes = token.getAttributes();
+ String email = null;
+ String firstName = null;
+ String lastName = null;
+ String displayName = null;
+ for (OpenIDAttribute attribute : attributes) {
+ if ("email".equals(attribute.getName())
+ && !attribute.getValues().isEmpty()) {
+ email = attribute.getValues().get(0);
+ } else if ("firstname".equals(attribute.getName())
+ && !attribute.getValues().isEmpty()) {
+ firstName = attribute.getValues().get(0);
+ } else if ("lastname".equals(attribute.getName())
+ && !attribute.getValues().isEmpty()) {
+ lastName = attribute.getValues().get(0);
+ } else if ("fullname".equals(attribute.getName())
+ && !attribute.getValues().isEmpty()) {
+ displayName = attribute.getValues().get(0);
+ }
+ }
+ User user = new UserImpl();
+ String username = StringUtils.substringAfter(openId,
"://").replace("/", "");
+ if (username.length() > 35) {
+ username = username.substring(0, 35);
+ }
+ if (displayName == null && firstName != null && lastName !=
null) {
+ displayName = firstName + " " + lastName;
+ }
+ user.setUsername(username);
+ user.setEmail(email);
+ user.setGivenName(firstName);
+ user.setFamilyName(lastName);
+ user.setDisplayName(displayName);
+ user.setOpenId(openId);
+
+ return user;
+ }
+}
Modified:
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
---
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java
(original)
+++
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java
Wed Oct 3 20:54:07 2012
@@ -62,6 +62,7 @@ public final class ViewNames {
public static final String REDIRECT = "redirect:/";
public static final String LOGIN_PAGE = "login";
+ public static final String CREATE_ACCOUNT_PAGE = "app/openidregister";
public static final String REDIRECT_LOGIN = REDIRECT +LOGIN_PAGE;
public static final String POSTS_TAG_PAGE = "postsTagPage";
Modified:
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/NewAccountControllerTest.java
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/NewAccountControllerTest.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
---
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/NewAccountControllerTest.java
(original)
+++
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/NewAccountControllerTest.java
Wed Oct 3 20:54:07 2012
@@ -19,6 +19,14 @@
package org.apache.rave.portal.web.controller;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertThat;
+
+import java.util.ArrayList;
+import java.util.List;
+
import org.apache.rave.portal.model.User;
import org.apache.rave.portal.model.impl.UserImpl;
import org.apache.rave.portal.service.CaptchaService;
@@ -39,12 +47,6 @@ import org.springframework.validation.Bi
import org.springframework.validation.ObjectError;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.easymock.EasyMock.*;
-import static org.junit.Assert.assertThat;
-
/**
* This is a test class for NewAccountController, which is used to make new
user accounts through
Added:
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandlerTest.java
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandlerTest.java?rev=1393757&view=auto
==============================================================================
---
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandlerTest.java
(added)
+++
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandlerTest.java
Wed Oct 3 20:54:07 2012
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.rave.portal.web.controller.handler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import javax.servlet.ServletException;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.openid.OpenIDAttribute;
+import org.springframework.security.openid.OpenIDAuthenticationStatus;
+import org.springframework.security.openid.OpenIDAuthenticationToken;
+
+public class OpenIDAuthenticationFailureHandlerTest {
+ private MockHttpServletRequest request;
+ private MockHttpServletResponse response;
+ private OpenIDAuthenticationFailureHandler handler;
+ private OpenIDAuthenticationToken postAuthToken;
+ private AuthenticationException authException;
+
+ private final String MESSAGE = "Successfully authenticated";
+ private final String NON_REGISTERED_OPENID_USER =
"http://someone.myopenid.com/";
+ private final String REDIRECT_URL = "/app/openidregister";
+
+ private final Logger logger =
LoggerFactory.getLogger(OpenIDAuthenticationFailureHandlerTest.class);
+
+
+ @Before
+ public void setup() {
+ request = new MockHttpServletRequest();
+ response = new MockHttpServletResponse();
+ handler = new OpenIDAuthenticationFailureHandler();
+ postAuthToken = new
OpenIDAuthenticationToken(OpenIDAuthenticationStatus.SUCCESS,NON_REGISTERED_OPENID_USER,
+ MESSAGE, new ArrayList<OpenIDAttribute>());
+ authException = new UsernameNotFoundException("");
+}
+
+
+ @SuppressWarnings("deprecation")
+ @Test
+ public void authenticationFailureRedirectTest() {
+ try {
+ authException.setAuthentication(postAuthToken);
+ handler.onAuthenticationFailure(request, response,
authException);
+ } catch (IOException e) {
+ logger.debug("IOException on Authentication Failure");
+ } catch (ServletException e) {
+ logger.debug("ServletException on Authentication
Failure");
+ }
+ assertTrue(authException.getAuthentication() instanceof
OpenIDAuthenticationToken);
+
assertTrue(((OpenIDAuthenticationToken)authException.getAuthentication()).getStatus().equals(OpenIDAuthenticationStatus.SUCCESS));
+
assertEquals(((OpenIDAuthenticationToken)authException.getAuthentication()).getMessage(),
MESSAGE);
+ assertEquals(response.getRedirectedUrl(),REDIRECT_URL);
+ }
+}
\ No newline at end of file
Modified:
rave/trunk/rave-portal-resources/src/main/resources/messages.properties
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/resources/messages.properties?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- rave/trunk/rave-portal-resources/src/main/resources/messages.properties
(original)
+++ rave/trunk/rave-portal-resources/src/main/resources/messages.properties Wed
Oct 3 20:54:07 2012
@@ -55,6 +55,7 @@ page.general.confirmpassword=Confirm pas
page.general.deletepage=Delete Page
page.general.editpage=Edit Page
page.general.email=Email address:
+page.general.openid=OpenID URL:
page.general.empty=Add widgets to this page
page.general.non.editing.empty=There are currently no widgets on this page.
page.general.logout=Logout
Modified:
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/applicationContext-security.xml
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/applicationContext-security.xml?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
---
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/applicationContext-security.xml
(original)
+++
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/applicationContext-security.xml
Wed Oct 3 20:54:07 2012
@@ -32,7 +32,8 @@
<security:intercept-url pattern="/static/**" access="permitAll"/>
<security:intercept-url pattern="/login" access="permitAll"/>
<security:intercept-url pattern="/newaccount.jsp*" access="permitAll"/>
- <security:intercept-url pattern="/app/newaccount*" access="permitAll"/>
+ <security:intercept-url pattern="/app/newaccount*"
access="permitAll"/>
+ <security:intercept-url pattern="/app/openidregister*"
access="permitAll"/>
<security:intercept-url pattern="/app/newpassword/**"
access="permitAll"/>
<security:intercept-url pattern="/app/retrieveusername/**"
access="permitAll"/>
<security:intercept-url pattern="/app/changepassword/**"
access="permitAll"/>
@@ -40,13 +41,25 @@
<security:intercept-url pattern="/app/admin/**"
access="hasRole('ROLE_ADMIN')"/>
<!-- all urls must be authenticated -->
<security:intercept-url pattern="/**"
access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/>
- <security:openid-login user-service-ref="userService"
authentication-failure-url="/login?authfail=openid">
- <security:attribute-exchange>
- <!-- Supported by MyOpenID.com -->
- <security:openid-attribute name="firstName"
type="http://schema.openid.net/namePerson/first"/>
- <security:openid-attribute name="lastName"
type="http://schema.openid.net/namePerson/last"/>
- <security:openid-attribute name="email"
type="http://schema.openid.net/contact/email" required="true"/>
+ <security:openid-login user-service-ref="userService"
authentication-failure-handler-ref="openIdAuthFailureHandler">
+ <security:attribute-exchange
identifier-match="https://www.google.com.*">
+ <security:openid-attribute name="email"
type="http://axschema.org/contact/email" required="true" count="1"/>
+ <security:openid-attribute name="firstname"
type="http://axschema.org/namePerson/first" required="true"/>
+ <security:openid-attribute name="lastname"
type="http://axschema.org/namePerson/last" required="true"/>
</security:attribute-exchange>
+ <security:attribute-exchange
identifier-match=".*openid-provider.appspot.com.*">
+ <security:openid-attribute name="email"
type="http://axschema.org/contact/email" required="true" count="1"/>
+ <security:openid-attribute name="firstname"
type="http://axschema.org/namePerson/first" required="true"/>
+ <security:openid-attribute name="lastname"
type="http://axschema.org/namePerson/last" required="true"/>
+ </security:attribute-exchange>
+ <security:attribute-exchange identifier-match=".*yahoo.com.*">
+ <security:openid-attribute name="email"
type="http://axschema.org/contact/email" required="true"/>
+ <security:openid-attribute name="fullname"
type="http://axschema.org/namePerson" required="true"/>
+ </security:attribute-exchange>
+ <security:attribute-exchange identifier-match=".*myopenid.com.*">
+ <security:openid-attribute name="email"
type="http://schema.openid.net/contact/email" required="true" count="1"/>
+ <security:openid-attribute name="fullname"
type="http://schema.openid.net/namePerson" required="true"/>
+ </security:attribute-exchange>
</security:openid-login>
<security:form-login login-page="/login" default-target-url="/"
authentication-failure-url="/login?authfail=form" />
<security:logout/>
@@ -78,6 +91,11 @@
<constructor-arg name="displayNameAttributeName" value="displayName"/>
<constructor-arg name="pageLayoutCode" value="columns_3"/>
</bean>
+
+ <bean id="openIdAuthFailureHandler"
class="org.apache.rave.portal.web.controller.handler.OpenIDAuthenticationFailureHandler">
+ <property name="defaultFailureUrl" value="/login?authfail=openid"/>
+ </bean>
+
<!-- enable the spring security annotations -->
<security:global-method-security secured-annotations="enabled"
pre-post-annotations="enabled">
Modified:
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/db/initial_data.sql
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/db/initial_data.sql?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
---
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/db/initial_data.sql
(original)
+++
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/db/initial_data.sql
Wed Oct 3 20:54:07 2012
@@ -181,8 +181,8 @@ UPDATE RAVE_PORTAL_SEQUENCES SET seq_cou
-- duplicate user id!!
set @user_id_13 = (SELECT seq_count FROM RAVE_PORTAL_SEQUENCES WHERE seq_name
= @user_seq);
-insert into person (entity_id, username, password, expired, locked, enabled,
email, default_page_layout_id, dtype, family_name, given_name, status)
-values (@user_id_13, 'http://rave2011.myopenid.com/',
'$2a$10$dML97.rnOn4.iSlEEdju8OCB2NckuKw0Ki5yMVzzMmWQsWMvym3qC', FALSE, FALSE,
TRUE,'[email protected]', @three_col_id, 'User', 'OpenId', 'Rave',
'Single');
+insert into person (entity_id, username, password, expired, locked, enabled,
email, default_page_layout_id, dtype, family_name, given_name, status, openid)
+values (@user_id_13, 'rave2011.myopenid.com',
'$2a$10$dML97.rnOn4.iSlEEdju8OCB2NckuKw0Ki5yMVzzMmWQsWMvym3qC', FALSE, FALSE,
TRUE,'[email protected]', @three_col_id, 'User', 'OpenId', 'Rave',
'Single', 'http://rave2011.myopenid.com/');
UPDATE RAVE_PORTAL_SEQUENCES SET seq_count = (seq_count + 1) WHERE seq_name =
@user_seq;
-- end user data --
Modified:
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/includes/new_user_form.jsp
URL:
http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/includes/new_user_form.jsp?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
---
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/includes/new_user_form.jsp
(original)
+++
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/includes/new_user_form.jsp
Wed Oct 3 20:54:07 2012
@@ -58,6 +58,14 @@
<form:errors path="email" cssClass="error"/>
</div>
</div>
+
+ <div class="control-group">
+ <label class="control-label" for="openIdField"><fmt:message
key="page.general.openid"/></label>
+ <div class="controls">
+ <form:input id="openIdField" path="openId"/>
+ <form:errors path="openId" cssClass="error"/>
+ </div>
+ </div>
<div class="control-group">
<label class="control-label" for="pageLayoutField"><fmt:message
key="page.general.addpage.selectlayout"/></label>