dagarcos преди 2 години
родител
ревизия
984f5048a8

+ 1 - 17
src/main/java/es/uv/garcosda/config/WebSecurityConfig.java

@@ -3,17 +3,13 @@
  */
 package es.uv.garcosda.config;
 
-import java.util.Arrays;
 
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.core.userdetails.User;
-import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.security.provisioning.InMemoryUserDetailsManager;
 import org.springframework.security.web.SecurityFilterChain;
 import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
 
@@ -50,17 +46,5 @@ public class WebSecurityConfig {
 		
 		return http.build();
 	}
-	
-	@Bean
-	public UserDetailsService userDetailsService() {
-		return new InMemoryUserDetailsManager(Arrays.asList(
-        		User.withUsername("user")
-					.password(passwordEncoder().encode("1234"))
-					.roles("USER")
-					.build(),
-				User.withUsername("admin")
-					.password(passwordEncoder().encode("1234"))
-					.roles("ADMIN")
-					.build()));
-	}
+		
 }

+ 51 - 0
src/main/java/es/uv/garcosda/domain/Role.java

@@ -0,0 +1,51 @@
+package es.uv.garcosda.domain;
+
+import java.util.List;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotEmpty;
+
+@Entity
+@Table(name="roles")
+public class Role
+{
+	@Id @GeneratedValue(strategy=GenerationType.AUTO)
+	private Integer id;
+	@Column(nullable=false, unique=true)
+	@NotEmpty
+	private String name;
+		
+	@ManyToMany(mappedBy="roles")
+	private List<User> users;
+
+	public Integer getId(){
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public List<User> getUsers() {
+		return users;
+	}
+
+	public void setUsers(List<User> users) {
+		this.users = users;
+	}
+	
+}

+ 75 - 0
src/main/java/es/uv/garcosda/domain/User.java

@@ -0,0 +1,75 @@
+package es.uv.garcosda.domain;
+
+import java.util.List;
+
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinTable;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.Size;
+
+
+@Entity
+@Table(name="users")
+public class User {
+	@Id @GeneratedValue(strategy=GenerationType.AUTO)
+	private Integer id;
+	
+	@Column(nullable=false)
+	@NotEmpty
+	private String name;
+	
+	@Column(nullable=false, unique=true)
+	@NotEmpty
+	private String username;
+	
+	@Column(nullable=false)
+	@NotEmpty
+	@Size(min=4)
+	private String password;
+	
+	@ManyToMany(cascade=CascadeType.MERGE)
+	@JoinTable(
+	      name="user_role",
+	      joinColumns={@JoinColumn(name="USER_ID", referencedColumnName="ID")},
+	      inverseJoinColumns={@JoinColumn(name="ROLE_ID", referencedColumnName="ID")})
+	private List<Role> roles;
+	
+	public Integer getId() {
+		return id;
+	}
+	public void setId(Integer id) {
+		this.id = id;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getUsername() {
+		return username;
+	}
+	public void setUsername(String username) {
+		this.username = username;
+	}
+	public String getPassword() {
+		return password;
+	}
+	public void setPassword(String password) {
+		this.password = password;
+	}
+	public List<Role> getRoles() {
+		return roles;
+	}
+	public void setRoles(List<Role> roles) {
+		this.roles = roles;
+	}
+}

+ 18 - 0
src/main/java/es/uv/garcosda/repositories/UserRepository.java

@@ -0,0 +1,18 @@
+/**
+ * 
+ */
+package es.uv.garcosda.repositories;
+
+import java.util.Optional;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import es.uv.garcosda.domain.User;
+
+@Repository
+public interface UserRepository extends JpaRepository<User, Integer> {
+
+	Optional<User> findByUsername(String username);
+
+}

+ 45 - 0
src/main/java/es/uv/garcosda/security/CustomUserDetailsService.java

@@ -0,0 +1,45 @@
+package es.uv.garcosda.security;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.AuthorityUtils;
+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;
+
+import es.uv.garcosda.domain.User;
+import es.uv.garcosda.repositories.UserRepository;
+
+
+@Service
+@Transactional
+public class CustomUserDetailsService implements UserDetailsService {
+
+	@Autowired
+	private UserRepository userRepository;
+	
+	@Override
+	public UserDetails loadUserByUsername(String userName)
+			throws UsernameNotFoundException {
+		User user = userRepository.findByUsername(userName)
+								  .orElseThrow(() -> new UsernameNotFoundException("User "+userName+" not found"));
+		return new org.springframework.security.core.userdetails.User(
+				user.getUsername(), 
+				user.getPassword(),
+				getAuthorities(user));
+	}
+
+	
+	private static Collection<? extends GrantedAuthority> getAuthorities(User user) {		
+		String[] userRoles = user.getRoles()
+								 .stream()
+								 .map((role) -> role.getName())
+								 .toArray(String[]::new);
+		Collection<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(userRoles);
+		return authorities;
+	}
+}

+ 3 - 1
src/main/resources/application.properties

@@ -1 +1,3 @@
-
+spring.jpa.hibernate.ddl-auto=update
+spring.jpa.defer-datasource-initialization = true
+spring.jpa.show-sql=true

+ 19 - 0
src/main/resources/data.sql

@@ -0,0 +1,19 @@
+
+DELETE FROM roles;
+DELETE FROM users;
+DELETE FROM user_role;
+
+INSERT INTO roles (id, name) VALUES 
+(1, 'ROLE_ADMIN'),
+(2, 'ROLE_ACTUATOR'),
+(3, 'ROLE_USER');
+
+INSERT INTO users (id, username, password, name) VALUES 
+(1, 'admin', '$2a$10$BsbENHEAka/4OMaIY7feoOTv17SmbdCN53BtLdJWgZn14dY8bvieu', 'Dani Garcia'),
+(3, 'user', '$2a$10$BsbENHEAka/4OMaIY7feoOTv17SmbdCN53BtLdJWgZn14dY8bvieu', 'Fran Grimaldo');
+
+INSERT INTO user_role(user_id, role_id) VALUES
+(1,1),
+(1,2),
+(1,3),
+(3,3);