diff --git a/src/main/java/org/springframework/samples/petclinic/configuration/WebSecurityConfig.java b/src/main/java/org/springframework/samples/petclinic/configuration/WebSecurityConfig.java index 660db990a..db7157e54 100644 --- a/src/main/java/org/springframework/samples/petclinic/configuration/WebSecurityConfig.java +++ b/src/main/java/org/springframework/samples/petclinic/configuration/WebSecurityConfig.java @@ -96,7 +96,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Bean public ClientRegistrationRepository clientRegistrationRepository() { - List clients = Arrays.asList("google", "facebook", "github"); + List clients = Arrays.asList("google", "facebook", "github", "twitter"); List registrations = clients.stream().map(c -> getRegistration(c)) .filter(registration -> registration != null).collect(Collectors.toList()); diff --git a/src/main/java/org/springframework/samples/petclinic/controller/UserController.java b/src/main/java/org/springframework/samples/petclinic/controller/UserController.java index d6c20de84..512b5ae7c 100644 --- a/src/main/java/org/springframework/samples/petclinic/controller/UserController.java +++ b/src/main/java/org/springframework/samples/petclinic/controller/UserController.java @@ -92,7 +92,7 @@ public class UserController extends WebSocketSender { } // set default role - user.addRole(roleService.findByName("ROLE_USER")); + user.addRole("ROLE_USER"); // encode password because we get clear password user.encode(user.getPassword()); @@ -175,7 +175,7 @@ public class UserController extends WebSocketSender { user.setFirstName(firstName); user.setLastName(lastName); user.setEnabled(true); - user.addRole(roleService.findByName("ROLE_USER")); + user.addRole("ROLE_USER"); user = userService.save(user); } @@ -293,7 +293,7 @@ public class UserController extends WebSocketSender { UserDTO operator = (UserDTO) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); UserDTO user = userService.findById(userId); - if (user.equals(operator) || operator.getRoles().contains(roleService.findByName("ROLE_ADMIN"))) { + if (user.equals(operator) || operator.getRoles().contains("ROLE_ADMIN")) { model.addAttribute(CommonAttribute.USER, user); model.addAttribute(CommonAttribute.USER_ID, user.getId()); return CommonView.USER_CHANGE_PASSWORD; @@ -329,7 +329,7 @@ public class UserController extends WebSocketSender { try { UserDTO operator = (UserDTO) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - if (user.equals(operator) || operator.getRoles().contains(roleService.findByName("ROLE_ADMIN"))) { + if (user.equals(operator) || operator.getRoles().contains("ROLE_ADMIN")) { // encode password user.encode(newPassword); user = userService.save(user); diff --git a/src/main/java/org/springframework/samples/petclinic/dto/common/RoleDTO.java b/src/main/java/org/springframework/samples/petclinic/dto/common/RoleDTO.java index e8c1c86fa..ea9ef7b22 100644 --- a/src/main/java/org/springframework/samples/petclinic/dto/common/RoleDTO.java +++ b/src/main/java/org/springframework/samples/petclinic/dto/common/RoleDTO.java @@ -11,9 +11,6 @@ import java.io.Serializable; */ public class RoleDTO extends NamedDTO implements Serializable { - @Override - public String toString() { - return super.toString(); - } + } diff --git a/src/main/java/org/springframework/samples/petclinic/dto/common/UserDTO.java b/src/main/java/org/springframework/samples/petclinic/dto/common/UserDTO.java index eb78a7459..c3179b7b0 100644 --- a/src/main/java/org/springframework/samples/petclinic/dto/common/UserDTO.java +++ b/src/main/java/org/springframework/samples/petclinic/dto/common/UserDTO.java @@ -1,7 +1,5 @@ package org.springframework.samples.petclinic.dto.common; -import org.springframework.beans.support.MutableSortDefinition; -import org.springframework.beans.support.PropertyComparator; import org.springframework.samples.petclinic.common.CommonError; import org.springframework.samples.petclinic.common.CommonParameter; import org.springframework.samples.petclinic.dto.PersonDTO; @@ -12,7 +10,6 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; -import javax.xml.bind.annotation.XmlElement; import java.io.Serializable; import java.util.*; @@ -40,7 +37,7 @@ public class UserDTO extends PersonDTO implements Serializable, UserDetails { private boolean credentialsNonExpired; - private Set roles; + private List roles; @Size(max = CommonParameter.PHONE_MAX, message = CommonError.FORMAT_LESS + CommonParameter.PHONE_MAX) // @Pattern(regexp = CommonParameter.PHONE_REGEXP, message = CommonError.PHONE_FORMAT) @@ -143,39 +140,29 @@ public class UserDTO extends PersonDTO implements Serializable, UserDetails { public Collection getAuthorities() { Set grantedAuthorities = new HashSet<>(); - this.roles.forEach(role -> grantedAuthorities.add(new SimpleGrantedAuthority(role.getName()))); + this.roles.forEach(role -> grantedAuthorities.add(new SimpleGrantedAuthority(role))); return grantedAuthorities; } - protected Set getRolesInternal() { - if (this.roles == null) { - this.roles = new HashSet<>(); + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + public void addRole(String role){ + if(this.roles==null){ + this.roles = new ArrayList<>(); } - return this.roles; + + this.roles.add(role); } - protected void setRolesInternal(Set roles) { - this.roles = roles; - } - - @XmlElement - public List getRoles() { - List sortedRoles = new ArrayList<>(getRolesInternal()); - PropertyComparator.sort(sortedRoles, new MutableSortDefinition("name", true, true)); - return Collections.unmodifiableList(sortedRoles); - } - - public int getNrOfRoles() { - return getRolesInternal().size(); - } - - public void addRole(RoleDTO role) { - getRolesInternal().add(role); - } - - public void setRoles(Set roles) { - this.roles = roles; + public void removeRole(String role){ + this.roles.remove(role); } public String getTelephone() { diff --git a/src/main/java/org/springframework/samples/petclinic/model/common/Role.java b/src/main/java/org/springframework/samples/petclinic/model/common/Role.java index 0f33a40ee..d7c2efcc2 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/common/Role.java +++ b/src/main/java/org/springframework/samples/petclinic/model/common/Role.java @@ -1,26 +1,45 @@ package org.springframework.samples.petclinic.model.common; +import org.springframework.samples.petclinic.common.CommonParameter; + import javax.persistence.*; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.io.Serializable; -import java.util.Collection; +import java.util.Set; @Entity(name = "Role") @Table(name = "roles") public class Role implements Serializable { @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + @NotNull + @NotEmpty + @Size(max = CommonParameter.ROLE_MAX) + @Column(name = "name", length = CommonParameter.ROLE_MAX) private String name; - @ManyToMany(mappedBy = "roles") - private Collection users; - public Long getId() { + @ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY) + private Set users; + + public Role(Integer id, @NotNull @NotEmpty @Size(max = CommonParameter.ROLE_MAX) String name) { + this.id = id; + this.name = name; + } + + public Role() { + // empty constructor for creating empty role and add attribute after + } + + public Integer getId() { return id; } - public void setId(Long id) { + public void setId(Integer id) { this.id = id; } @@ -32,11 +51,11 @@ public class Role implements Serializable { this.name = name; } - public Collection getUsers() { + public Set getUsers() { return users; } - public void setUsers(Collection users) { + public void setUsers(Set users) { this.users = users; } } diff --git a/src/main/java/org/springframework/samples/petclinic/model/common/User.java b/src/main/java/org/springframework/samples/petclinic/model/common/User.java index f9fc3a8cd..903408272 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/common/User.java +++ b/src/main/java/org/springframework/samples/petclinic/model/common/User.java @@ -53,10 +53,10 @@ public class User extends Person implements Serializable, UserDetails { @Column(name = "credential_unexpired") private boolean credentialsNonExpired; - @ManyToMany(fetch = FetchType.EAGER) + @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER) @JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id")) - private Collection roles; + private Set roles; @Size(max = CommonParameter.PHONE_MAX, message = CommonError.FORMAT_LESS + CommonParameter.PHONE_MAX) // @Pattern(regexp = CommonParameter.PHONE_REGEXP, message = CommonError.PHONE_FORMAT) @@ -145,14 +145,29 @@ public class User extends Person implements Serializable, UserDetails { this.credentialsNonExpired = credentialsNonExpired; } - public Collection getRoles() { + public Set getRoles() { return roles; } - public void setRoles(Collection roles) { + public void setRoles(Set roles) { this.roles = roles; } + public void addRole(Role role) { + if(this.roles==null){ + this.roles = new HashSet<>(); + } + this.roles.add(role); + role.getUsers().add(this); + } + + public void removeRole(Role role){ + if(this.roles!=null){ + this.roles.remove(role); + role.getUsers().remove(this); + } + } + @Override public Collection getAuthorities() { Set grantedAuthorities = new HashSet<>(); @@ -162,7 +177,6 @@ public class User extends Person implements Serializable, UserDetails { return grantedAuthorities; } - public String getTelephone() { return telephone; } diff --git a/src/main/java/org/springframework/samples/petclinic/service/common/UserService.java b/src/main/java/org/springframework/samples/petclinic/service/common/UserService.java index 0bf0b9482..bbb5bf46c 100644 --- a/src/main/java/org/springframework/samples/petclinic/service/common/UserService.java +++ b/src/main/java/org/springframework/samples/petclinic/service/common/UserService.java @@ -10,9 +10,7 @@ import org.springframework.samples.petclinic.repository.UserRepository; import org.springframework.samples.petclinic.service.business.BaseService; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; /** * Simple Service between User entity and UserDTO Data Transfert Object. @@ -24,10 +22,13 @@ public class UserService implements BaseService { private final UserRepository userRepository; + private final RoleRepository roleRepository; + private final ModelMapper modelMapper = new ModelMapper(); - public UserService(UserRepository userRepository) { + public UserService(UserRepository userRepository, RoleRepository roleRepository) { this.userRepository = userRepository; + this.roleRepository = roleRepository; } @Override @@ -40,10 +41,16 @@ public class UserService implements BaseService { User user = modelMapper.map(dto, User.class); user.setPassword(dto.getPassword()); - /* - * if (dto.getRoles() != null) { for (RoleDTO roleDTO : dto.getRoles()) { Role - * role = modelMapper.map(roleDTO, Role.class); user.addRole(role); } } - */ + if( dto.getRoles()!= null) { + Set roles = new HashSet<>(); + + for (String role : dto.getRoles()) { + roles.add(roleRepository.findByName(role)); + } + + user.setRoles(roles); + } + return user; } @@ -56,10 +63,17 @@ public class UserService implements BaseService { UserDTO userDto = modelMapper.map(entity, UserDTO.class); userDto.setPassword(entity.getPassword()); userDto.setMatchingPassword(entity.getPassword()); - /* - * if (entity.getRoles() != null) { for (Role role : entity.getRoles()) { RoleDTO - * roleDTO = modelMapper.map(role, RoleDTO.class); userDto.addRole(roleDTO); } } - */ + + if( entity.getRoles()!= null) { + List roles = new ArrayList<>(); + + for (Role role : entity.getRoles()) { + roles.add(role.getName()); + } + + userDto.setRoles(roles); + } + return userDto; } @@ -112,7 +126,6 @@ public class UserService implements BaseService { public UserDTO findByEmail(String email) { User user = userRepository.findByEmail(email); - return entityToDTO(user); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d3ea63985..bb63d7ffe 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -44,15 +44,15 @@ spring.h2.console.path=/h2-console spring.security.oauth2.client.registration.google.client-id=${OAUTH2_GOOGLE_CLIENT_ID} spring.security.oauth2.client.registration.google.client-secret=${OAUTH2_GOOGLE_CLIENT_SECRET} -#spring.security.oauth2.client.registration.github.client-id=${OAUTH2_GITHUB_CLIENT_ID} -#spring.security.oauth2.client.registration.github.client-secret=${OAUTH2_GITHUB_CLIENT_SECRET} +spring.security.oauth2.client.registration.github.client-id=${OAUTH2_GITHUB_CLIENT_ID} +spring.security.oauth2.client.registration.github.client-secret=${OAUTH2_GITHUB_CLIENT_SECRET} #spring.security.oauth2.client.registration.facebook.client-id= #spring.security.oauth2.client.registration.facebook.client-secret= -#spring.security.oauth2.client.registration.twitter.client-id= -#spring.security.oauth2.client.registration.twitter.client-secret= +spring.security.oauth2.client.registration.twitter.client-id=${OAUTH2_TWITTER_CLIENT_ID} +spring.security.oauth2.client.registration.twitter.client-secret=${OAUTH2_TWITTER_CLIENT_SECRET} #################################################################### SPRING MAIL spring.mail.host=smtp.mailtrap.io