Выбрать главу

Но сначала о главном. Давайте создадим объект домена и интерфейс репозитория, который представляет и сохраняет информацию о пользователе.

ОПРЕДЕЛЕНИЕ ДОМЕНА ПОЛЬЗОВАТЕЛЯ И СОХРАНЯЕМОСТИ(PERSISTENCE)

Когда клиенты Taco Cloud регистрируются в приложении, им необходимо предоставить не только имя пользователя и пароль. Они также дадут вам свое полное имя, адрес и номер телефона. Эта информация может быть использована для различных целей, включая предварительное заполнение формы заказа (не говоря уже о потенциальных маркетинговых возможностях).

Чтобы получить всю эту информацию, создайте класс User, как показано ниже.

Листинг 4.5 Описание сущности user

package tacos;

import java.util.Arrays;

import java.util.Collection;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import org.springframework.security.core.GrantedAuthority;

import org.springframework.security.core.authority.

SimpleGrantedAuthority;

import org.springframework.security.core.userdetails.UserDetails;

import lombok.AccessLevel;

import lombok.Data;

import lombok.NoArgsConstructor;

import lombok.RequiredArgsConstructor;

@Entity

@Data

@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)

@RequiredArgsConstructor

public class User implements UserDetails {

 private static final long serialVersionUID = 1L;

 @Id

 @GeneratedValue(strategy=GenerationType.AUTO)

 private Long id;

 private final String username;

 private final String password;

 private final String fullname;

 private final String street;

 private final String city;

 private final String state;

 private final String zip;

 private final String phoneNumber;

 @Override

 public Collection<? extends GrantedAuthority> getAuthorities() {

   return Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"));

 }

 @Override

 public boolean isAccountNonExpired() {

   return true;

 }

 @Override

 public boolean isAccountNonLocked() {

   return true;

 }

 @Override

 public boolean isCredentialsNonExpired() {

   return true;

 }

 @Override

 public boolean isEnabled() {

   return true;

 }

}

Вы, несомненно, заметили, что класс User немного более связанный, чем любая другая сущность, определенная в главе 3.  В дополнение к определению нескольких свойств, пользователь также реализует интерфейс UserDetails из Spring Security.

Implementations UserDetails предоставит некоторую важную информацию о пользователе от framework, например, какие полномочия предоставлены пользователю и включена ли учетная запись пользователя.

Метод getAuthorities() должен возвращать коллекцию полномочий, предоставленных пользователю. Различные методы is___Expired () возвращают логическое значение, указывающее, включена или нет учетная запись пользователя.

Для сущности User метод getAuthorities () просто возвращает коллекцию, указывающую, что всем пользователям будут предоставлены полномочия ROLE_USER. И, по крайней мере, на данный момент, Taco Cloud не нужно отключать пользователей, поэтому все методы is___Expired() возвращают true, чтобы указать, что пользователи активны.

Определив сущность User, вы можете определить интерфейс репозитория:

package tacos.data;

import org.springframework.data.repository.CrudRepository;

import tacos.User;

public interface UserRepository extends CrudRepository<User, Long> {

 User findByUsername(String username);

}

Помимо операций CRUD, предоставляемых расширением CrudRepository, UserRepository определяет метод findByUsername(), который будет использоваться в сервисе сведений о пользователе для поиска пользователя по его имени пользователя.

Как вы узнали в главе 3, Spring Data JPA будет автоматически генерировать реализацию этого интерфейса во время выполнения. Таким образом, теперь можно написать пользовательский сервис ,сведений о пользователе использующую этот репозиторий.

СОЗДАНИЕ СЕРВИСА СВЕДЕНИЙ О ПОЛЬЗОВАТЕЛЕ

UserDetailsService Spring Security - это довольно простой интерфейс:

public interface UserDetailsService {

 UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

}

Как вы можете видеть, реализации этого интерфейса даны имя пользователя и должны либо вернуть объект UserDetails или бросить UsernameNotFoundException, если данный логин не появляется никаких результатов.

Поскольку класс User implements UserDetails, а UserRepository предоставляет метод findByUsername(), они идеально подходят для использования в пользовательской реализации UserDetailsService. В следующем листинге показан сервис сведений о пользователе, который вы будете использовать в приложении Taco Cloud.

Листинг 4.6 Определение собственного сервиса сведений о пользователе