From b5ce8d5e8b727d226bb6ce30f43e61ae2665a6eb Mon Sep 17 00:00:00 2001 From: Justin Richer Date: Thu, 23 Aug 2012 15:19:50 -0400 Subject: [PATCH] added getByUsername to userinfo repositories and supporting classes, updated calling classes to use this fixed namedquery --- .../openid/connect/model/DefaultUserInfo.java | 3 ++- .../repository/UserInfoRepository.java | 9 ++++++- .../impl/JpaUserInfoRepository.java | 16 ++++++++++-- .../impl/UserInfoUserDetailsService.java | 25 ++++++++----------- 4 files changed, 34 insertions(+), 19 deletions(-) diff --git a/openid-connect-common/src/main/java/org/mitre/openid/connect/model/DefaultUserInfo.java b/openid-connect-common/src/main/java/org/mitre/openid/connect/model/DefaultUserInfo.java index d631f08a2..a486d8ef9 100644 --- a/openid-connect-common/src/main/java/org/mitre/openid/connect/model/DefaultUserInfo.java +++ b/openid-connect-common/src/main/java/org/mitre/openid/connect/model/DefaultUserInfo.java @@ -32,7 +32,8 @@ import com.google.gson.JsonObject; @Entity @Table(name="user_info") @NamedQueries({ - @NamedQuery(name="DefaultUserInfo.getAll", query = "select u from DefaultUserInfo u") + @NamedQuery(name="DefaultUserInfo.getAll", query = "select u from DefaultUserInfo u"), + @NamedQuery(name="DefaultUserInfo.getByUsername", query = "select u from DefaultUserInfo u WHERE u.preferredUsername = :username") }) public class DefaultUserInfo implements UserInfo { diff --git a/openid-connect-common/src/main/java/org/mitre/openid/connect/repository/UserInfoRepository.java b/openid-connect-common/src/main/java/org/mitre/openid/connect/repository/UserInfoRepository.java index b60f12e59..379333502 100644 --- a/openid-connect-common/src/main/java/org/mitre/openid/connect/repository/UserInfoRepository.java +++ b/openid-connect-common/src/main/java/org/mitre/openid/connect/repository/UserInfoRepository.java @@ -66,6 +66,13 @@ public interface UserInfoRepository { * * @return the UserInfo collection, or null */ - public Collection getAll(); + public Collection getAll(); + + /** + * Get a UserInfo object by its preferred_username field + * @param username + * @return + */ + public UserInfo getByUsername(String username); } diff --git a/openid-connect-server/src/main/java/org/mitre/openid/connect/repository/impl/JpaUserInfoRepository.java b/openid-connect-server/src/main/java/org/mitre/openid/connect/repository/impl/JpaUserInfoRepository.java index 223212e3c..45953637c 100644 --- a/openid-connect-server/src/main/java/org/mitre/openid/connect/repository/impl/JpaUserInfoRepository.java +++ b/openid-connect-server/src/main/java/org/mitre/openid/connect/repository/impl/JpaUserInfoRepository.java @@ -16,6 +16,7 @@ package org.mitre.openid.connect.repository.impl; import static org.mitre.util.jpa.JpaUtil.saveOrUpdate; +import static org.mitre.util.jpa.JpaUtil.getSingleResult; import java.util.Collection; @@ -82,10 +83,21 @@ public class JpaUserInfoRepository implements UserInfoRepository { @Transactional public Collection getAll() { - TypedQuery query = manager.createNamedQuery( - "DefaultUserInfo.getAll", DefaultUserInfo.class); + TypedQuery query = manager.createNamedQuery("DefaultUserInfo.getAll", DefaultUserInfo.class); return query.getResultList(); } + /** + * Get a single UserInfo object by its username + */ + @Override + public UserInfo getByUsername(String username) { + TypedQuery query = manager.createNamedQuery("DefaultUserInfo.getByUsername", DefaultUserInfo.class); + query.setParameter("username", username); + + return getSingleResult(query.getResultList()); + + } + } diff --git a/openid-connect-server/src/main/java/org/mitre/openid/connect/service/impl/UserInfoUserDetailsService.java b/openid-connect-server/src/main/java/org/mitre/openid/connect/service/impl/UserInfoUserDetailsService.java index e2bf2e41a..ae933abf1 100644 --- a/openid-connect-server/src/main/java/org/mitre/openid/connect/service/impl/UserInfoUserDetailsService.java +++ b/openid-connect-server/src/main/java/org/mitre/openid/connect/service/impl/UserInfoUserDetailsService.java @@ -16,6 +16,12 @@ import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; +/** + * A UserDetailsService backed by a UserInfoRepository. + * + * @author jricher + * + */ @Service("userInfoUserDetailsService") public class UserInfoUserDetailsService implements UserDetailsService { @@ -28,25 +34,14 @@ public class UserInfoUserDetailsService implements UserDetailsService { private List admins = new ArrayList(); @Override - public UserDetails loadUserByUsername(String username) - throws UsernameNotFoundException { - UserInfo userInfo = repository.getByUserId(username); + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + UserInfo userInfo = repository.getByUsername(username); if (userInfo != null) { // TODO: make passwords configurable? part of object? String password = "password"; - boolean enabled = true; - /* - * TODO: this was for a MITRE-specific flag - if(userInfo.getDeleteFlag() > 0){ - enabled = false; - } - */ - boolean accountNonExpired = true; - boolean credentialsNonExpired = true; - boolean accountNonLocked = true; List authorities = new ArrayList(); authorities.add(ROLE_USER); @@ -55,10 +50,10 @@ public class UserInfoUserDetailsService implements UserDetailsService { } // TODO: this should really be our own UserDetails wrapper class, shouldn't it? - User user = new User(userInfo.getPreferredUsername(), password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); + User user = new User(userInfo.getUserId(), password, authorities); return user; } else { - return null; + throw new UsernameNotFoundException("Could not find username: " + username); } }