Daniel Garcia Costa 1 年之前
父節點
當前提交
093d9fb49c

+ 1 - 18
src/main/java/es/uv/garcosda/config/WebConfigSecurity.java

@@ -1,14 +1,10 @@
 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.method.configuration.EnableReactiveMethodSecurity;
 import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
 import org.springframework.security.config.web.server.ServerHttpSecurity;
-import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
-import org.springframework.security.core.userdetails.User;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.security.web.server.SecurityWebFilterChain;
@@ -22,20 +18,7 @@ public class WebConfigSecurity {
     public PasswordEncoder passwordEncoder() {
         return new BCryptPasswordEncoder();
     }
-	
-	@Bean
-	public MapReactiveUserDetailsService userDetailsService() {
-		return new MapReactiveUserDetailsService(Arrays.asList(
-        		User.withUsername("user")
-					.password(passwordEncoder().encode("1234"))
-					.roles("USER")
-					.build(),
-				User.withUsername("admin")
-					.password(passwordEncoder().encode("1234"))
-					.roles("USER")
-					.build()));
-	}
-		
+			
 	@Bean
 	public SecurityWebFilterChain securityFilterChain(ServerHttpSecurity http) {
 		return http.csrf().disable()

+ 80 - 0
src/main/java/es/uv/garcosda/domain/MyUser.java

@@ -0,0 +1,80 @@
+package es.uv.garcosda.domain;
+
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.relational.core.mapping.Table;
+import org.springframework.security.core.authority.AuthorityUtils;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@Table(name="MYUSER")
+public class MyUser {
+	
+	@Id
+	@JsonProperty("id")
+	private Integer id;
+	
+	@JsonProperty("name")
+	private String name;
+	
+	@JsonProperty("username")
+	private String username;
+	
+	@JsonProperty("password")
+	private String password;
+	
+	@JsonProperty("role")
+	private String role;
+	
+	public MyUser() {}
+	
+	public MyUser(Integer id, String name, String username, String password, String role) {
+		this.id = id;
+		this.name = name;
+		this.username = username;
+		this.password = password;
+		this.role = role;
+	}
+	
+	public MyUser(String name, String username, String password, String role) {
+		this.name = name;
+		this.username = username;
+		this.password = password;
+		this.role = role;
+	}
+	
+	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 String getRole() {
+		return role;
+	}
+	public void setRole(String roles) {
+		this.role = roles;
+	}
+	public org.springframework.security.core.userdetails.User toAuthUser() {
+    	return new org.springframework.security.core.userdetails.User(this.username, this.password, 
+    																  AuthorityUtils.createAuthorityList(this.getRole()));
+    }
+}

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

@@ -0,0 +1,12 @@
+package es.uv.garcosda.repositories;
+
+import org.springframework.data.repository.reactive.ReactiveCrudRepository;
+
+import es.uv.garcosda.domain.MyUser;
+import reactor.core.publisher.Mono;
+
+public interface UserRepository extends ReactiveCrudRepository<MyUser, Integer> {
+
+	Mono<MyUser> findByUsername(String username);
+	Mono<MyUser> findByUsernameAndPassword(String username, String password);
+}

+ 26 - 0
src/main/java/es/uv/garcosda/services/CustomUserDetailsService.java

@@ -0,0 +1,26 @@
+package es.uv.garcosda.services;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+import es.uv.garcosda.domain.MyUser;
+import reactor.core.publisher.Mono;
+
+@Service
+public class CustomUserDetailsService implements ReactiveUserDetailsService {
+	
+    @Autowired
+    private UserService us;
+
+    @Override
+    public Mono<UserDetails> findByUsername(String username) {
+    	return us.findByUsername(username)
+       		 .switchIfEmpty(Mono.defer(() ->	
+       						Mono.error(new UsernameNotFoundException("User Not Found"))))
+       		 .map(MyUser::toAuthUser);
+    }
+    
+}

+ 16 - 0
src/main/java/es/uv/garcosda/services/ImportService.java

@@ -2,12 +2,14 @@ package es.uv.garcosda.services;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Scanner;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.Resource;
 import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -16,6 +18,7 @@ import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 import es.uv.garcosda.domain.Document;
+import es.uv.garcosda.domain.MyUser;
 import reactor.core.publisher.Flux;
 
 @Service
@@ -23,6 +26,9 @@ public class ImportService {
 	
 	@Autowired
     private NewsService ns;
+	
+	@Autowired
+    private UserService us;
 
 	private List<Document> generateDocs(List<String> lines) throws JsonMappingException, JsonProcessingException {
 		ObjectMapper mapper = new ObjectMapper();
@@ -48,6 +54,15 @@ public class ImportService {
 	        return 0;
 	    }
 	}
+	
+	private void insertUsers() {
+		List<MyUser> users = new ArrayList<MyUser>(
+		        Arrays.asList(new MyUser("user", "user", new BCryptPasswordEncoder().encode("1234"), "ROLE_USER") , 	
+						      new MyUser("admin", "admin", new BCryptPasswordEncoder().encode("1234"), "ROLE_ADMIN")));
+		for(MyUser u : users) {
+			this.us.insert(u).block();
+		}
+	}
 		
 	public int doImport(Resource resource) throws JsonMappingException, JsonProcessingException {
 	    ArrayList<String> jsonlines = new ArrayList<>();
@@ -60,6 +75,7 @@ public class ImportService {
 	    	System.out.println("[ERROR] data file not found");
 	    }
 	    
+	    this.insertUsers();
 	    List<Document> docs = generateDocs(jsonlines);
 	    return insert(docs);
 	}

+ 43 - 0
src/main/java/es/uv/garcosda/services/UserService.java

@@ -0,0 +1,43 @@
+package es.uv.garcosda.services;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import es.uv.garcosda.domain.MyUser;
+import es.uv.garcosda.repositories.UserRepository;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+
+@Service
+@Transactional
+public class UserService {
+	
+	@Autowired UserRepository ur;
+	
+	public Flux<MyUser> findAll(){
+		return this.ur.findAll();
+	}
+	
+	public Mono<MyUser> findByUsername(String username){
+		return this.ur.findByUsername(username);
+	}
+	
+	public Mono<MyUser> findByUsernameAndPassword(String username, String password) {
+		return this.ur.findByUsernameAndPassword(username, password);
+	}
+	
+	public Mono<MyUser> createUser(MyUser user) {
+		return this.ur.save(user);
+	}
+	
+	public Mono<MyUser> insert(MyUser user){
+		return this.ur.save(user);
+	}
+	
+	public Mono<Void> deleteAll() {
+		return this.ur.deleteAll();
+	}
+	
+}