diff --git a/src/main/java/org/springframework/samples/petclinic/security/UserDetailsServiceImpl.java b/src/main/java/org/springframework/samples/petclinic/security/UserDetailsServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..9997e1481435bcc09c6c9acb3c5075a44822a04a
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/security/UserDetailsServiceImpl.java
@@ -0,0 +1,27 @@
+package org.springframework.samples.petclinic.security;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.samples.petclinic.model.security.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class UserDetailsServiceImpl implements UserDetailsService {
+
+    @Autowired
+    private UserRepository userRepository;
+
+	@Override
+	@Transactional(readOnly = true)
+	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+		User user = userRepository.findByUsername(username);
+        if (user != null) {
+            return user;
+        }
+        throw new UsernameNotFoundException(username);
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/security/UserRepository.java b/src/main/java/org/springframework/samples/petclinic/security/UserRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..a1e9658f17d4812f5c82dfcac0abe2046847da97
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/security/UserRepository.java
@@ -0,0 +1,15 @@
+package org.springframework.samples.petclinic.security;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.samples.petclinic.model.security.User;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface UserRepository extends JpaRepository<User, Long> {
+    @Query("SELECT DISTINCT user FROM User user " +
+            "INNER JOIN FETCH user.authorities AS authorities " +
+            "WHERE user.username = :username")
+    User findByUsername(@Param("username") String username);
+}
\ No newline at end of file