From b65237d9eb58f4597ce2f60bdb638d74c6ebf44c Mon Sep 17 00:00:00 2001 From: Rohan Sircar Date: Fri, 27 Sep 2019 12:07:55 +0530 Subject: [PATCH] many changes --- chatto/pom.xml | 30 ++++- .../org/ros/chatto/ChattoApplication.java | 22 +++- .../ros/chatto/WebSecurityConfiguration.java | 113 ++++++++++++++++++ .../chatto/controller/AdminController.java | 14 +++ .../chatto/controller/BeanConfigurations.java | 15 +++ .../chatto/controller/DemoRestController.java | 19 ++- .../java/org/ros/chatto/controller/Home.java | 10 +- .../java/org/ros/chatto/controller/Login.java | 30 +++-- .../chatto/controller/RegisterController.java | 34 ++++++ .../ros/chatto/controller/UserController.java | 14 +++ .../org/ros/chatto/model/ChatMessage.java | 36 ++++++ .../java/org/ros/chatto/model/ChatUser.java | 61 +++++++--- .../main/java/org/ros/chatto/model/Role.java | 46 +++++++ .../java/org/ros/chatto/model/UserDTO.java | 23 ++++ .../java/org/ros/chatto/model/UserRole.java | 51 ++++++++ .../repository/ChatMessageRepository.java | 8 ++ .../ros/chatto/repository/RoleRepository.java | 12 ++ .../repository/UserRepositoryCustom.java | 43 +------ .../repository/UserRepositoryCustomImpl.java | 44 +++++++ .../UserRepositoryCustomInterface.java | 11 -- .../chatto/repository/UserRoleRepository.java | 14 +++ .../AuthenticationSuccessHandlerImpl.java | 36 ++++++ .../chatto/security/MyUserDetailsService.java | 75 ++++++++++++ .../ros/chatto/security/MyUserPrincipal.java | 71 +++++++++++ .../org/ros/chatto/service/RoleService.java | 7 ++ .../ros/chatto/service/RoleServiceImpl.java | 21 ++++ .../org/ros/chatto/service/UserService.java | 11 ++ .../ros/chatto/service/UserServiceImpl.java | 53 ++++++++ .../src/main/resources/application.properties | 2 + .../main/resources/templates/admin/home.html | 13 ++ chatto/src/main/resources/templates/home.html | 7 +- .../src/main/resources/templates/login.html | 30 +++++ .../src/main/resources/templates/logout.html | 10 ++ .../resources/templates/registration.html | 17 +++ .../main/resources/templates/user/home.html | 13 ++ .../ros/chatto/ChattoApplicationTests.java | 54 +++++++++ 36 files changed, 977 insertions(+), 93 deletions(-) create mode 100644 chatto/src/main/java/org/ros/chatto/WebSecurityConfiguration.java create mode 100644 chatto/src/main/java/org/ros/chatto/controller/AdminController.java create mode 100644 chatto/src/main/java/org/ros/chatto/controller/BeanConfigurations.java create mode 100644 chatto/src/main/java/org/ros/chatto/controller/RegisterController.java create mode 100644 chatto/src/main/java/org/ros/chatto/controller/UserController.java create mode 100644 chatto/src/main/java/org/ros/chatto/model/ChatMessage.java create mode 100644 chatto/src/main/java/org/ros/chatto/model/Role.java create mode 100644 chatto/src/main/java/org/ros/chatto/model/UserDTO.java create mode 100644 chatto/src/main/java/org/ros/chatto/model/UserRole.java create mode 100644 chatto/src/main/java/org/ros/chatto/repository/ChatMessageRepository.java create mode 100644 chatto/src/main/java/org/ros/chatto/repository/RoleRepository.java create mode 100644 chatto/src/main/java/org/ros/chatto/repository/UserRepositoryCustomImpl.java delete mode 100644 chatto/src/main/java/org/ros/chatto/repository/UserRepositoryCustomInterface.java create mode 100644 chatto/src/main/java/org/ros/chatto/repository/UserRoleRepository.java create mode 100644 chatto/src/main/java/org/ros/chatto/security/AuthenticationSuccessHandlerImpl.java create mode 100644 chatto/src/main/java/org/ros/chatto/security/MyUserDetailsService.java create mode 100644 chatto/src/main/java/org/ros/chatto/security/MyUserPrincipal.java create mode 100644 chatto/src/main/java/org/ros/chatto/service/RoleService.java create mode 100644 chatto/src/main/java/org/ros/chatto/service/RoleServiceImpl.java create mode 100644 chatto/src/main/java/org/ros/chatto/service/UserService.java create mode 100644 chatto/src/main/java/org/ros/chatto/service/UserServiceImpl.java create mode 100644 chatto/src/main/resources/templates/admin/home.html create mode 100644 chatto/src/main/resources/templates/login.html create mode 100644 chatto/src/main/resources/templates/logout.html create mode 100644 chatto/src/main/resources/templates/registration.html create mode 100644 chatto/src/main/resources/templates/user/home.html diff --git a/chatto/pom.xml b/chatto/pom.xml index bd1d7e7..13ba685 100644 --- a/chatto/pom.xml +++ b/chatto/pom.xml @@ -1,22 +1,23 @@ - 4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.8.RELEASE - + org.ros Chatto 0.0.1-SNAPSHOT - war + jar chatto Demo project for Spring Boot - 12 + 11 @@ -58,6 +59,27 @@ org.springframework.boot spring-boot-starter-thymeleaf + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.security + spring-security-test + test + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + 2.1.2 + + + + + + org.projectlombok + lombok + diff --git a/chatto/src/main/java/org/ros/chatto/ChattoApplication.java b/chatto/src/main/java/org/ros/chatto/ChattoApplication.java index 268c5fc..8fa00f5 100644 --- a/chatto/src/main/java/org/ros/chatto/ChattoApplication.java +++ b/chatto/src/main/java/org/ros/chatto/ChattoApplication.java @@ -3,13 +3,33 @@ package org.ros.chatto; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @EnableAutoConfiguration @SpringBootApplication -public class ChattoApplication { +public class ChattoApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(ChattoApplication.class, args); } + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(ChattoApplication.class); + } } + +//public class Application extends SpringBootServletInitializer { +// +// public static void main(String[] args) { +// SpringApplication.run(applicationClass, args); +// } +// +// @Override +// protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { +// return application.sources(applicationClass); +// } +// +// private static Class applicationClass = Application.class; +//} \ No newline at end of file diff --git a/chatto/src/main/java/org/ros/chatto/WebSecurityConfiguration.java b/chatto/src/main/java/org/ros/chatto/WebSecurityConfiguration.java new file mode 100644 index 0000000..c791b14 --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/WebSecurityConfiguration.java @@ -0,0 +1,113 @@ +package org.ros.chatto; + +import org.ros.chatto.security.MyUserDetailsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.factory.PasswordEncoderFactories; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; + +@Configuration +@EnableWebSecurity +public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { + + @Autowired + private AuthenticationSuccessHandler authenticationSuccessHandler; + @Autowired + private MyUserDetailsService myUserDetailsService; + @Autowired + private PasswordEncoder passwordEncoder; +// @SuppressWarnings("deprecation") + @Bean + public AuthenticationProvider authenticationProvider() + { + DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); + provider.setUserDetailsService(myUserDetailsService); + provider.setPasswordEncoder(passwordEncoder); + return provider; + } + @Bean + public static PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Override + protected void configure(HttpSecurity httpSecurity) throws Exception { + httpSecurity.authorizeRequests() + .antMatchers("/","/login*","/registration","/perform_registration","/css/**", "/js/**", "/images/**").permitAll() + .antMatchers("/user/**").hasAnyRole("USER", "ADMIN","SUPER_USER") + .antMatchers("/admin/**","/api/**").hasAnyRole("ADMIN","SUPER_USER") + .anyRequest() + .authenticated() + .and() + .formLogin() +// .loginPage("/login").permitAll() + .loginProcessingUrl("/perform_login") + .successHandler(authenticationSuccessHandler) + .failureUrl("/?login_error") + .and() + .logout().invalidateHttpSession(true) + .clearAuthentication(true) + .logoutRequestMatcher(new AntPathRequestMatcher("/perform_logout")) + .logoutSuccessUrl("/").permitAll();; + + + +// httpSecurity +// .csrf().disable() +// .authorizeRequests().antMatchers("login").permitAll() +// .anyRequest().authenticated() +// .and() +// .formLogin() +// .loginPage("/login").permitAll() +// .and() +// .logout().invalidateHttpSession(true) +// .clearAuthentication(true) +// .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) +// .logoutSuccessUrl("/").permitAll(); + + } + +// @Override +// protected void configure(AuthenticationManagerBuilder auth) throws Exception { +// auth.inMemoryAuthentication() +// .withUser("user") +// .password("{noop}user") +// .roles("USER") +// .and() +// .withUser("admin") +// .password("{noop}admin") +// .roles("ADMIN"); +//// auth.userDetailsService(myUserDetailsService); +// +// } +// @Bean +// @Override +// public UserDetailsService userDetailsService(String usern) { +//// UserDetails user = +//// User.withDefaultPasswordEncoder() +//// .username("user") +//// .password("password") +//// .roles("USER") +//// .build(); +//// +//// return new InMemoryUserDetailsManager(user); +// myUserDetailsService.loadUserByUsername(username) +// +// } +// @Override +// protected void configure(AuthenticationManagerBuilder auth) throws Exception { +// auth.userDetailsService(myUserDetailsService); +// } +// auth.userDetailsService(myUserDetailsService); + +// } +} diff --git a/chatto/src/main/java/org/ros/chatto/controller/AdminController.java b/chatto/src/main/java/org/ros/chatto/controller/AdminController.java new file mode 100644 index 0000000..1a1f065 --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/controller/AdminController.java @@ -0,0 +1,14 @@ +package org.ros.chatto.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/admin") +public class AdminController { + + @RequestMapping + public String viewManageUsers() { + return "/admin/home"; + } +} diff --git a/chatto/src/main/java/org/ros/chatto/controller/BeanConfigurations.java b/chatto/src/main/java/org/ros/chatto/controller/BeanConfigurations.java new file mode 100644 index 0000000..d457bce --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/controller/BeanConfigurations.java @@ -0,0 +1,15 @@ +package org.ros.chatto.controller; + +import org.ros.chatto.security.AuthenticationSuccessHandlerImpl; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; + +@Configuration +public class BeanConfigurations { + + @Bean + public AuthenticationSuccessHandler authenticationSuccessHandler() { + return new AuthenticationSuccessHandlerImpl(); + } +} diff --git a/chatto/src/main/java/org/ros/chatto/controller/DemoRestController.java b/chatto/src/main/java/org/ros/chatto/controller/DemoRestController.java index a53c106..db3c12b 100644 --- a/chatto/src/main/java/org/ros/chatto/controller/DemoRestController.java +++ b/chatto/src/main/java/org/ros/chatto/controller/DemoRestController.java @@ -1,6 +1,8 @@ package org.ros.chatto.controller; -import org.ros.chatto.repository.UserRepositoryCustomInterface; +import org.ros.chatto.repository.UserRepositoryCustom; +import org.ros.chatto.repository.UserRoleRepository; +import org.ros.chatto.repository.RoleRepository; import org.ros.chatto.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -10,6 +12,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; import org.ros.chatto.model.ChatUser; +import org.ros.chatto.model.UserRole; @RestController @RequestMapping("/api") @@ -18,7 +21,11 @@ public class DemoRestController { @Autowired UserRepository userRepository; @Autowired - UserRepositoryCustomInterface userRepositoryCustomInterface; + UserRepositoryCustom userRepositoryCustom; + @Autowired + RoleRepository roleRepository; + @Autowired + UserRoleRepository userRoleRepository; @GetMapping("/users") public List getAllUsers() { @@ -27,12 +34,18 @@ public class DemoRestController { @GetMapping("/usernames") public List getUserNames() { - return userRepositoryCustomInterface.getAllUserNames("hmm"); + return userRepositoryCustom.getAllUserNames("hmm"); } @GetMapping("/user") public ChatUser getUser() { return userRepository.findByUserName("hmm"); } + + @GetMapping("/roles") + public List getAllRoles() + { + return userRoleRepository.findAll(); + } } diff --git a/chatto/src/main/java/org/ros/chatto/controller/Home.java b/chatto/src/main/java/org/ros/chatto/controller/Home.java index f3aad8c..20b3d32 100644 --- a/chatto/src/main/java/org/ros/chatto/controller/Home.java +++ b/chatto/src/main/java/org/ros/chatto/controller/Home.java @@ -1,8 +1,7 @@ package org.ros.chatto.controller; -import org.ros.chatto.repository.UserRepositoryCustomInterface; +import org.ros.chatto.repository.UserRepositoryCustom; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @@ -23,15 +22,14 @@ public class TestController { }*/ @Controller -@RequestMapping("/home") public class Home { @Autowired - UserRepositoryCustomInterface userRepositoryCustomInterface; - @GetMapping + UserRepositoryCustom userRepositoryCustom; + @RequestMapping("/") public ModelAndView showPage() { ModelAndView mv = new ModelAndView("home"); mv.addObject("message", "Welcome!"); - mv.addObject("userNames", userRepositoryCustomInterface.getAllUserNames("hmm")); + mv.addObject("userNames", userRepositoryCustom.getAllUserNames("hmm")); return mv; } // public String showHome(Model model) diff --git a/chatto/src/main/java/org/ros/chatto/controller/Login.java b/chatto/src/main/java/org/ros/chatto/controller/Login.java index 095384c..530f782 100644 --- a/chatto/src/main/java/org/ros/chatto/controller/Login.java +++ b/chatto/src/main/java/org/ros/chatto/controller/Login.java @@ -1,20 +1,28 @@ package org.ros.chatto.controller; -import org.ros.chatto.model.ChatUser; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.bind.annotation.GetMapping; @Controller -@RequestMapping("/login") public class Login { - @PostMapping - public ModelAndView login(@ModelAttribute ChatUser chatUser) + @GetMapping("/login") + public String loginForm() { +// model.addAttribute("user", new ChatUser()); + return "login"; + } +// @PostMapping("/login") +// public String loginSubmit(@ModelAttribute ChatUser chatUser) +// { +// if(chatUser.getUserName().equalsIgnoreCase("") || chatUser.getPassword().equalsIgnoreCase("")) { +// return "error"; +// } +//// System.out.println(chatUser.getPassword()); +// return "user"; +// } + + @GetMapping("logout-success") + public String doLogout() { - ModelAndView mv = new ModelAndView("login"); - mv.addObject(chatUser); - return mv; + return "logout"; } } diff --git a/chatto/src/main/java/org/ros/chatto/controller/RegisterController.java b/chatto/src/main/java/org/ros/chatto/controller/RegisterController.java new file mode 100644 index 0000000..a13e786 --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/controller/RegisterController.java @@ -0,0 +1,34 @@ +package org.ros.chatto.controller; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.ros.chatto.model.UserDTO; +import org.ros.chatto.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.servlet.ModelAndView; + +@Controller +public class RegisterController { + + @Autowired + private UserService userService; + @GetMapping("/registration") + public ModelAndView registrationForm() + { + ModelAndView modelAndView = new ModelAndView("registration"); + modelAndView.addObject("userDTO",new UserDTO()); + return modelAndView; + } + @PostMapping("/perform_registration") + public ModelAndView performRegistration(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @ModelAttribute("userDTO") UserDTO userDTO) + { + ModelAndView modelAndView = new ModelAndView("user/home"); + userService.registerUser(userDTO); + return modelAndView; + } +} diff --git a/chatto/src/main/java/org/ros/chatto/controller/UserController.java b/chatto/src/main/java/org/ros/chatto/controller/UserController.java new file mode 100644 index 0000000..bbd2cd8 --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/controller/UserController.java @@ -0,0 +1,14 @@ +package org.ros.chatto.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/user") +public class UserController { + + @RequestMapping + public String viewUserProfile() { + return "user/home"; + } +} \ No newline at end of file diff --git a/chatto/src/main/java/org/ros/chatto/model/ChatMessage.java b/chatto/src/main/java/org/ros/chatto/model/ChatMessage.java new file mode 100644 index 0000000..56f695b --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/model/ChatMessage.java @@ -0,0 +1,36 @@ +package org.ros.chatto.model; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import lombok.Data; +import net.bytebuddy.asm.Advice.This; + +@Data +@Entity +@Table(name = "chat_messages") +public class ChatMessage { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "m_id") + private Long messageID; + @OneToOne + @JoinColumn(name = "from_user") + private ChatUser fromUser; + @OneToOne + @JoinColumn(name = "to_user") + private ChatUser toUser; + private String message; + @Temporal(TemporalType.TIMESTAMP) + private Date messageTime; +} diff --git a/chatto/src/main/java/org/ros/chatto/model/ChatUser.java b/chatto/src/main/java/org/ros/chatto/model/ChatUser.java index 961ec52..7328bc7 100644 --- a/chatto/src/main/java/org/ros/chatto/model/ChatUser.java +++ b/chatto/src/main/java/org/ros/chatto/model/ChatUser.java @@ -1,76 +1,101 @@ package org.ros.chatto.model; import java.util.Date; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; +import javax.persistence.OneToMany; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; +import javax.persistence.JoinColumn; import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @Entity @Table(name = "users") @EntityListeners(AuditingEntityListener.class) -@JsonIgnoreProperties(value = {"password", "salt"}, - allowGetters = false) +@JsonIgnoreProperties(value = { "password"}, allowGetters = false) public class ChatUser { @Id - @Column(name="user_id") + @GeneratedValue(strategy = GenerationType.IDENTITY) +// @SequenceGenerator(name="user_generator", sequenceName = "user_seq", allocationSize=50) + @Column(name = "user_id") private int userID; @Column(name = "name") private String userName; - String password, salt; + String password; @Temporal(TemporalType.TIMESTAMP) private Date joinDate; +// @ManyToMany(cascade = CascadeType.ALL) +// @JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id")) + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) + @JsonBackReference + private Set userRoles = new HashSet(); + public int getUserID() { return userID; } + public void setUserID(int userID) { this.userID = userID; } - - + 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 getSalt() { - return salt; - } - public void setSalt(String salt) { - this.salt = salt; - } + public Date getJoinDate() { return joinDate; } + public void setJoinDate(Date joinDate) { this.joinDate = joinDate; } - public ChatUser(int userID, String userName, String password, String salt, Date joinDate) { + + public ChatUser(int userID, String userName, String password, Date joinDate) { super(); this.userID = userID; this.userName = userName; this.password = password; - this.salt = salt; this.joinDate = joinDate; } - - public ChatUser() {} - - + + public ChatUser() { + } + + public Set getUserRoles() { + return userRoles; + } + + public void setUserRoles(Set userRoles) { + this.userRoles = userRoles; + } + } diff --git a/chatto/src/main/java/org/ros/chatto/model/Role.java b/chatto/src/main/java/org/ros/chatto/model/Role.java new file mode 100644 index 0000000..a782ff5 --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/model/Role.java @@ -0,0 +1,46 @@ +package org.ros.chatto.model; + +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import com.fasterxml.jackson.annotation.JsonBackReference; + + +@Entity +@Table(name = "roles") +public class Role { + @Id + @Column(name = "role_id") + private int roleID; + @Column(name = "role_name") + private String name; + private String description; + @OneToMany(mappedBy = "role") + @JsonBackReference + private Set userRoles = new HashSet<>(); + public int getRoleId() { + return roleID; + } + public void setRoleId(int id) { + this.roleID = id; + } + public String getName() { + return name; + } + public void setName(String role) { + this.name = role; + } + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + +} diff --git a/chatto/src/main/java/org/ros/chatto/model/UserDTO.java b/chatto/src/main/java/org/ros/chatto/model/UserDTO.java new file mode 100644 index 0000000..fd3b718 --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/model/UserDTO.java @@ -0,0 +1,23 @@ +package org.ros.chatto.model; + +import javax.persistence.Transient; + +public class UserDTO { + private String userName; + @Transient + private String password; + 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; + } + + +} diff --git a/chatto/src/main/java/org/ros/chatto/model/UserRole.java b/chatto/src/main/java/org/ros/chatto/model/UserRole.java new file mode 100644 index 0000000..45d9acb --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/model/UserRole.java @@ -0,0 +1,51 @@ +package org.ros.chatto.model; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import com.fasterxml.jackson.annotation.JsonManagedReference; + +@Entity +@Table(name = "users_roles") +public class UserRole { + @Id + private int id; + + @ManyToOne + @JoinColumn(name = "user_id") + @JsonManagedReference + private ChatUser user; + + @ManyToOne + @JoinColumn(name = "role_id") + @JsonManagedReference + private Role role; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public ChatUser getUser() { + return user; + } + + public void setUser(ChatUser user) { + this.user = user; + } + + public Role getRole() { + return role; + } + + public void setRole(Role role) { + this.role = role; + } + +} diff --git a/chatto/src/main/java/org/ros/chatto/repository/ChatMessageRepository.java b/chatto/src/main/java/org/ros/chatto/repository/ChatMessageRepository.java new file mode 100644 index 0000000..eea47c5 --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/repository/ChatMessageRepository.java @@ -0,0 +1,8 @@ +package org.ros.chatto.repository; + +import org.ros.chatto.model.ChatMessage; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ChatMessageRepository extends JpaRepository { + +} diff --git a/chatto/src/main/java/org/ros/chatto/repository/RoleRepository.java b/chatto/src/main/java/org/ros/chatto/repository/RoleRepository.java new file mode 100644 index 0000000..c7424dc --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/repository/RoleRepository.java @@ -0,0 +1,12 @@ +package org.ros.chatto.repository; + +import org.ros.chatto.model.Role; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +@Repository +public interface RoleRepository extends JpaRepository{ +// @Query("select r from RoleRepository where name = ?1") + public Role findByName(String roleName); +} diff --git a/chatto/src/main/java/org/ros/chatto/repository/UserRepositoryCustom.java b/chatto/src/main/java/org/ros/chatto/repository/UserRepositoryCustom.java index 439e1c4..a5f7434 100644 --- a/chatto/src/main/java/org/ros/chatto/repository/UserRepositoryCustom.java +++ b/chatto/src/main/java/org/ros/chatto/repository/UserRepositoryCustom.java @@ -2,43 +2,10 @@ package org.ros.chatto.repository; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; +public interface UserRepositoryCustom { -import org.springframework.stereotype.Service; -import org.ros.chatto.model.ChatUser; - -import org.ros.chatto.repository.UserRepositoryCustomInterface; - -@Service -class UserRepositoryCustom implements UserRepositoryCustomInterface{ - @PersistenceContext - private EntityManager entityManager; - - @Override - public List getAllUserNames(String userName) { - List userNamesList = null; -// Session session = null; - try { - CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); - CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(String.class); - Root root = criteriaQuery.from(ChatUser.class); - criteriaQuery.select(root.get("userName")); - criteriaQuery.where(criteriaBuilder.notEqual(root.get("userName"), userName)); - - userNamesList = entityManager.createQuery(criteriaQuery).getResultList(); - for(String un: userNamesList) - { - System.out.println(un); - } - } catch (Exception e) { - // TODO: handle exception - e.printStackTrace(); - } - return userNamesList; - } - +// @Query("select s from Article s where s.author like ?1 and s.title = ?2") +// List
findByAuthorAndTitle(String author, String title); +// @Query("select u from ChatUser u") + public List getAllUserNames(String s); } diff --git a/chatto/src/main/java/org/ros/chatto/repository/UserRepositoryCustomImpl.java b/chatto/src/main/java/org/ros/chatto/repository/UserRepositoryCustomImpl.java new file mode 100644 index 0000000..339d9ed --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/repository/UserRepositoryCustomImpl.java @@ -0,0 +1,44 @@ +package org.ros.chatto.repository; + +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +import org.springframework.stereotype.Service; +import org.ros.chatto.model.ChatUser; + +import org.ros.chatto.repository.UserRepositoryCustom; + +@Service +class UserRepositoryCustomImpl implements UserRepositoryCustom{ + @PersistenceContext + private EntityManager entityManager; + + @Override + public List getAllUserNames(String userName) { + List userNamesList = null; +// Session session = null; + try { + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(String.class); + Root root = criteriaQuery.from(ChatUser.class); + criteriaQuery.select(root.get("userName")); + criteriaQuery.where(criteriaBuilder.notEqual(root.get("userName"), userName)); + + userNamesList = entityManager.createQuery(criteriaQuery).getResultList(); + for(String un: userNamesList) + { + System.out.println(un); + } + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + } + return userNamesList; + } + +} diff --git a/chatto/src/main/java/org/ros/chatto/repository/UserRepositoryCustomInterface.java b/chatto/src/main/java/org/ros/chatto/repository/UserRepositoryCustomInterface.java deleted file mode 100644 index b4b8284..0000000 --- a/chatto/src/main/java/org/ros/chatto/repository/UserRepositoryCustomInterface.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.ros.chatto.repository; - -import java.util.List; - -public interface UserRepositoryCustomInterface { - -// @Query("select s from Article s where s.author like ?1 and s.title = ?2") -// List
findByAuthorAndTitle(String author, String title); -// @Query("select u from ChatUser u") - public List getAllUserNames(String s); -} diff --git a/chatto/src/main/java/org/ros/chatto/repository/UserRoleRepository.java b/chatto/src/main/java/org/ros/chatto/repository/UserRoleRepository.java new file mode 100644 index 0000000..943a946 --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/repository/UserRoleRepository.java @@ -0,0 +1,14 @@ +package org.ros.chatto.repository; + +import java.util.List; + +import org.ros.chatto.model.UserRole; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRoleRepository extends JpaRepository{ + @Query("select ur from UserRole ur where ur.user.userID = ?1") + public List findByUser(int userID); +} diff --git a/chatto/src/main/java/org/ros/chatto/security/AuthenticationSuccessHandlerImpl.java b/chatto/src/main/java/org/ros/chatto/security/AuthenticationSuccessHandlerImpl.java new file mode 100644 index 0000000..8ef29bc --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/security/AuthenticationSuccessHandlerImpl.java @@ -0,0 +1,36 @@ +package org.ros.chatto.security; + +import java.io.IOException; +import java.util.Collection; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.web.DefaultRedirectStrategy; +import org.springframework.security.web.RedirectStrategy; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; +import org.springframework.stereotype.Component; + +@Component +public class AuthenticationSuccessHandlerImpl implements AuthenticationSuccessHandler { + + private static final SimpleGrantedAuthority SUPER_USER_AUTHORITY = new SimpleGrantedAuthority("ROLE_SUPER_USER"); + private static final SimpleGrantedAuthority ADMIN_AUTHORITY = new SimpleGrantedAuthority("ROLE_ADMIN"); + private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(); + + @Override + public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, + Authentication authentication) throws IOException, ServletException { + // TODO Auto-generated method stub + Collection authorities = authentication.getAuthorities(); + if (authorities.contains(ADMIN_AUTHORITY) || authorities.contains(SUPER_USER_AUTHORITY)) { + redirectStrategy.sendRedirect(httpServletRequest, httpServletResponse, "/admin"); + } else { + redirectStrategy.sendRedirect(httpServletRequest, httpServletResponse, "/user"); + } + } +} diff --git a/chatto/src/main/java/org/ros/chatto/security/MyUserDetailsService.java b/chatto/src/main/java/org/ros/chatto/security/MyUserDetailsService.java new file mode 100644 index 0000000..e86fd8f --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/security/MyUserDetailsService.java @@ -0,0 +1,75 @@ +package org.ros.chatto.security; + +import java.util.List; + +import javax.annotation.PostConstruct; + +import org.ros.chatto.model.ChatUser; +import org.ros.chatto.model.UserRole; +import org.ros.chatto.repository.RoleRepository; +import org.ros.chatto.repository.UserRepository; +import org.ros.chatto.repository.UserRoleRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.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.web.context.WebApplicationContext; + +@Service +public class MyUserDetailsService implements UserDetailsService { + +// @Autowired +// private WebApplicationContext applicationContext; + @Autowired + private UserRepository userRepository; + +// @Autowired +// private RoleRepository roleRepository; + + @Autowired + private UserRoleRepository userRoleRepository; +// @PostConstruct +// public void completeSetup() { +// userRepository = applicationContext.getBean(UserRepository.class); +// } + + public MyUserDetailsService() { + super(); + } + @Override + public UserDetails loadUserByUsername(String username) { + ChatUser user = userRepository.findByUserName(username); + + + + if (user == null) { + throw new UsernameNotFoundException(username); + } + System.out.println("Found useeeeeeeeeeeeeeeeeeeeeeeeeeeeeeer " + user.getUserName() + user.getPassword()); + List userRoles = userRoleRepository.findByUser(user.getUserID()); + System.out.println("User role iddddddddddddddddd = " + userRoles.get(0).getRole().getName()); +// System.out.println(userRoles.); +// return new MyUserPrincipal(user); + return toUserDetails(new UserObject(user.getUserName(), user.getPassword(), userRoles.get(0).getRole().getName())); + } + + private UserDetails toUserDetails(UserObject userObject) { + return User.withUsername(userObject.name) + .password(userObject.password) + .roles(userObject.role).build(); + } + + private static class UserObject { + private String name; + private String password; + private String role; + + public UserObject(String name, String password, String role) { + this.name = name; + this.password = password; + this.role = role; + } + } +} \ No newline at end of file diff --git a/chatto/src/main/java/org/ros/chatto/security/MyUserPrincipal.java b/chatto/src/main/java/org/ros/chatto/security/MyUserPrincipal.java new file mode 100644 index 0000000..aed45cc --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/security/MyUserPrincipal.java @@ -0,0 +1,71 @@ +package org.ros.chatto.security; + +import java.util.Collection; +import java.util.Collections; + +import org.ros.chatto.model.ChatUser; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +public class MyUserPrincipal implements UserDetails { + + /** + * + */ + private static final long serialVersionUID = -2761445275537412028L; + private ChatUser user; + + public MyUserPrincipal(ChatUser user) { + super(); + this.user = user; + } + + @Override + public Collection getAuthorities() { + // TODO Auto-generated method stub + return Collections.singleton(new SimpleGrantedAuthority("USER")); + } + + @Override + public String getPassword() { + // TODO Auto-generated method stub + return user.getPassword(); + } + + @Override + public String getUsername() { + // TODO Auto-generated method stub + return user.getUserName(); + } + + @Override + public boolean isAccountNonExpired() { + // TODO Auto-generated method stub + return true; + } + + @Override + public boolean isAccountNonLocked() { + // TODO Auto-generated method stub + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + // TODO Auto-generated method stub + return true; + } + + @Override + public boolean isEnabled() { + // TODO Auto-generated method stub + return true; + } + + public ChatUser getChatUser() + { + return user; + } + +} diff --git a/chatto/src/main/java/org/ros/chatto/service/RoleService.java b/chatto/src/main/java/org/ros/chatto/service/RoleService.java new file mode 100644 index 0000000..5ad397b --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/service/RoleService.java @@ -0,0 +1,7 @@ +package org.ros.chatto.service; + +import org.ros.chatto.model.Role; + +public interface RoleService { + Role getRole(String roleName); +} diff --git a/chatto/src/main/java/org/ros/chatto/service/RoleServiceImpl.java b/chatto/src/main/java/org/ros/chatto/service/RoleServiceImpl.java new file mode 100644 index 0000000..64b3e85 --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/service/RoleServiceImpl.java @@ -0,0 +1,21 @@ +package org.ros.chatto.service; + +import org.ros.chatto.model.Role; +import org.ros.chatto.repository.RoleRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class RoleServiceImpl implements RoleService { + + @Autowired + private RoleRepository roleRepository; + + @Override + public Role getRole(String roleName) { + // TODO Auto-generated method stub +// Role role = new Role(); + return roleRepository.findByName(roleName); + } + +} diff --git a/chatto/src/main/java/org/ros/chatto/service/UserService.java b/chatto/src/main/java/org/ros/chatto/service/UserService.java new file mode 100644 index 0000000..1941e60 --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/service/UserService.java @@ -0,0 +1,11 @@ +package org.ros.chatto.service; + +import org.ros.chatto.model.ChatUser; +import org.ros.chatto.model.UserDTO; + +//@Service +public interface UserService { + public void saveChatUser(ChatUser user); + + public void registerUser(UserDTO userDTO); +} diff --git a/chatto/src/main/java/org/ros/chatto/service/UserServiceImpl.java b/chatto/src/main/java/org/ros/chatto/service/UserServiceImpl.java new file mode 100644 index 0000000..7148f1b --- /dev/null +++ b/chatto/src/main/java/org/ros/chatto/service/UserServiceImpl.java @@ -0,0 +1,53 @@ +package org.ros.chatto.service; + +import org.ros.chatto.model.ChatUser; +import org.ros.chatto.model.Role; +import org.ros.chatto.model.UserDTO; +import org.ros.chatto.model.UserRole; +import org.ros.chatto.repository.UserRepository; +import org.ros.chatto.repository.UserRoleRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +@Service +public class UserServiceImpl implements UserService{ + @Autowired + UserRepository userRepository; + + @Autowired + UserRoleRepository userRoleRepository; + + @Autowired + PasswordEncoder passwordEncoder; + + @Autowired + RoleService roleService; + + @Override + public void saveChatUser(ChatUser user) { + // TODO Auto-generated method stub + ChatUser changedUser = userRepository.save(user); + UserRole userRole = new UserRole(); + userRole.setRole(roleService.getRole("USER")); + userRole.setUser(changedUser); + userRoleRepository.save(userRole); + } + + @Override + public void registerUser(UserDTO userDTO) { + // TODO Auto-generated method stub + ChatUser user = new ChatUser(); + user.setUserName(userDTO.getUserName()); + user.setPassword(passwordEncoder.encode(userDTO.getPassword())); + ChatUser changedUser = userRepository.save(user); + UserRole userRole = new UserRole(); + Role role = roleService.getRole("USER"); + userRole.setRole(role); + userRole.setUser(changedUser); + System.out.println(role.getRoleId()); + System.out.println(changedUser.getUserID()); + userRoleRepository.save(userRole); + } + +} diff --git a/chatto/src/main/resources/application.properties b/chatto/src/main/resources/application.properties index 56ab549..c19e2be 100644 --- a/chatto/src/main/resources/application.properties +++ b/chatto/src/main/resources/application.properties @@ -9,6 +9,7 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # The SQL dialect makes Hibernate generate better SQL for the chosen database spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect + # Hibernate ddl auto (create, create-drop, validate, update) spring.jpa.hibernate.ddl-auto = validate @@ -16,3 +17,4 @@ logging.level.org.springframework.web=DEBUG logging.level.web=DEBUG logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE +spring.http.log-request-details=true \ No newline at end of file diff --git a/chatto/src/main/resources/templates/admin/home.html b/chatto/src/main/resources/templates/admin/home.html new file mode 100644 index 0000000..901c853 --- /dev/null +++ b/chatto/src/main/resources/templates/admin/home.html @@ -0,0 +1,13 @@ + + + + +Insert title here + + + admin page +
+ +
+ + \ No newline at end of file diff --git a/chatto/src/main/resources/templates/home.html b/chatto/src/main/resources/templates/home.html index ec1a058..85a5d36 100644 --- a/chatto/src/main/resources/templates/home.html +++ b/chatto/src/main/resources/templates/home.html @@ -7,8 +7,13 @@
Web Application. Passed parameter :
+ +

Welcome to home page. Please login to access any features.

+ login + + \ No newline at end of file diff --git a/chatto/src/main/resources/templates/login.html b/chatto/src/main/resources/templates/login.html new file mode 100644 index 0000000..c0a2fc6 --- /dev/null +++ b/chatto/src/main/resources/templates/login.html @@ -0,0 +1,30 @@ + + + +Title + + +
Login Page
+ + + +
+ + +

+

+ +
+ + \ No newline at end of file diff --git a/chatto/src/main/resources/templates/logout.html b/chatto/src/main/resources/templates/logout.html new file mode 100644 index 0000000..98a71e9 --- /dev/null +++ b/chatto/src/main/resources/templates/logout.html @@ -0,0 +1,10 @@ + + + + +Insert title here + + + + + \ No newline at end of file diff --git a/chatto/src/main/resources/templates/registration.html b/chatto/src/main/resources/templates/registration.html new file mode 100644 index 0000000..4f328fc --- /dev/null +++ b/chatto/src/main/resources/templates/registration.html @@ -0,0 +1,17 @@ + + + + +Insert title here + + +
+

+

+ +
+ + \ No newline at end of file diff --git a/chatto/src/main/resources/templates/user/home.html b/chatto/src/main/resources/templates/user/home.html new file mode 100644 index 0000000..1ca6a34 --- /dev/null +++ b/chatto/src/main/resources/templates/user/home.html @@ -0,0 +1,13 @@ + + + + +Insert title here + + + user page +
+ +
+ + \ No newline at end of file diff --git a/chatto/src/test/java/org/ros/chatto/ChattoApplicationTests.java b/chatto/src/test/java/org/ros/chatto/ChattoApplicationTests.java index af19458..cf039ee 100644 --- a/chatto/src/test/java/org/ros/chatto/ChattoApplicationTests.java +++ b/chatto/src/test/java/org/ros/chatto/ChattoApplicationTests.java @@ -2,15 +2,69 @@ package org.ros.chatto; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.ros.chatto.model.ChatMessage; +import org.ros.chatto.model.ChatUser; +import org.ros.chatto.repository.ChatMessageRepository; +import org.ros.chatto.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @RunWith(SpringRunner.class) @SpringBootTest public class ChattoApplicationTests { + + @Autowired + ChatMessageRepository chatMessageRepository; + + @Mock + ChatMessageRepository mockChatMessageRepository; + + @Autowired + UserRepository userRepository; @Test public void contextLoads() { } + @Test + public void testMessageRepo() { + chatMessageRepository.findAll().toString(); + } + +// @Test +// public void testSave() { +// ChatUser fromUser = new ChatUser(); +// fromUser = userRepository.findByUserName("hmm"); +// ChatUser toUser = new ChatUser(); +// toUser = userRepository.findByUserName("user2"); +// ChatMessage chatMessage = new ChatMessage(); +// chatMessage.setMessage("Hello!"); +// chatMessage.setFromUser(fromUser); +// chatMessage.setToUser(toUser); +// +// chatMessageRepository.save(chatMessage); +// } + + @Test + public void testSave() { + ChatUser fromUser = new ChatUser(); + fromUser = userRepository.findByUserName("hmm"); + ChatUser toUser = new ChatUser(); + toUser = userRepository.findByUserName("user2"); + ChatMessage chatMessage = new ChatMessage(); + chatMessage.setMessage("Hello!"); + chatMessage.setFromUser(fromUser); + chatMessage.setToUser(toUser); + +// chatMessageRepository.save(chatMessage); + when(mockChatMessageRepository.save(any(ChatMessage.class))).thenReturn(chatMessage); + verify(mockChatMessageRepository, times(1)).save(Mockito.any(ChatMessage.class)); + } }