From d3775947204d814dcc1ab8f75d99d1c4b5512bba Mon Sep 17 00:00:00 2001 From: Maximilian Leopold Date: Sun, 24 Mar 2019 15:09:28 +0100 Subject: [PATCH 01/11] Implemented Login --- build.gradle | 7 +++ .../hhn/labsw/bugageocaching/Application.java | 11 +++- .../config/WebSecurityConfig.java | 52 +++++++++++++++++++ .../bugageocaching/controller/Controller.java | 21 ++++++++ .../labsw/bugageocaching/entities/Role.java | 44 ++++++++++++++++ .../labsw/bugageocaching/entities/User.java | 41 ++++++++------- .../repositories/BearbeitetRepository.java | 3 +- .../CacheAccesDefinitionRepository.java | 3 +- .../repositories/CacheRepository.java | 3 +- .../repositories/RewardRepository.java | 3 +- .../repositories/RoleRepository.java | 7 +++ .../repositories/StationRepository.java | 3 +- .../repositories/TeamRepository.java | 3 +- .../repositories/UserRepository.java | 4 +- .../service/SecurityService.java | 8 +++ .../service/SecurityServiceImpl.java | 48 +++++++++++++++++ .../service/UserDetailsServiceImpl.java | 37 +++++++++++++ .../bugageocaching/service/UserService.java | 10 ++++ .../service/UserServiceImpl.java | 33 ++++++++++++ 19 files changed, 314 insertions(+), 27 deletions(-) create mode 100644 src/main/java/hhn/labsw/bugageocaching/config/WebSecurityConfig.java create mode 100644 src/main/java/hhn/labsw/bugageocaching/entities/Role.java create mode 100644 src/main/java/hhn/labsw/bugageocaching/repositories/RoleRepository.java create mode 100644 src/main/java/hhn/labsw/bugageocaching/service/SecurityService.java create mode 100644 src/main/java/hhn/labsw/bugageocaching/service/SecurityServiceImpl.java create mode 100644 src/main/java/hhn/labsw/bugageocaching/service/UserDetailsServiceImpl.java create mode 100644 src/main/java/hhn/labsw/bugageocaching/service/UserService.java create mode 100644 src/main/java/hhn/labsw/bugageocaching/service/UserServiceImpl.java diff --git a/build.gradle b/build.gradle index 5724707..26ee00d 100644 --- a/build.gradle +++ b/build.gradle @@ -34,6 +34,13 @@ dependencies { //JSON Parser implementation 'com.google.code.gson:gson:2.8.5' + + compile 'org.springframework.boot:spring-boot-starter-tomcat' + compile 'org.springframework.boot:spring-boot-starter-security' + compile 'org.springframework.boot:spring-boot-starter-actuator' + compile 'org.springframework.boot:spring-boot-starter-aop' + compile group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '1.2.0.RELEASE' + } node { diff --git a/src/main/java/hhn/labsw/bugageocaching/Application.java b/src/main/java/hhn/labsw/bugageocaching/Application.java index 8362492..0212443 100644 --- a/src/main/java/hhn/labsw/bugageocaching/Application.java +++ b/src/main/java/hhn/labsw/bugageocaching/Application.java @@ -3,11 +3,18 @@ package hhn.labsw.bugageocaching; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication -public class Application { +public class Application{ - public static void main(String[] args) { + /**@Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(Application.class); + }**/ + + public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } } diff --git a/src/main/java/hhn/labsw/bugageocaching/config/WebSecurityConfig.java b/src/main/java/hhn/labsw/bugageocaching/config/WebSecurityConfig.java new file mode 100644 index 0000000..7af8e75 --- /dev/null +++ b/src/main/java/hhn/labsw/bugageocaching/config/WebSecurityConfig.java @@ -0,0 +1,52 @@ +package hhn.labsw.bugageocaching.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +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.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +@Configuration +@EnableWebSecurity +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Qualifier("userDetailsServiceImpl") + @Autowired + private UserDetailsService userDetailsService; + + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeRequests() + .antMatchers("/allCaches").permitAll() + .anyRequest().authenticated() + .and() + .formLogin() + .defaultSuccessUrl("/allCaches") + .permitAll() + .and() + .logout() + .permitAll(); + } + + @Bean + public AuthenticationManager customAuthenticationManager() throws Exception { + return authenticationManager(); + } + + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); + } +} diff --git a/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java b/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java index c524e99..be59059 100644 --- a/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java +++ b/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java @@ -3,7 +3,14 @@ package hhn.labsw.bugageocaching.controller; import com.google.gson.Gson; import hhn.labsw.bugageocaching.entities.*; import hhn.labsw.bugageocaching.repositories.*; +import hhn.labsw.bugageocaching.service.SecurityService; +import hhn.labsw.bugageocaching.service.UserService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import java.util.Optional; @@ -32,6 +39,13 @@ public class Controller { @Autowired UserRepository userRepository; + @Autowired + private UserService userService; + + @Autowired + private SecurityService securityService; + + @RequestMapping("/allCaches") @ResponseBody public String getAllCaches(){ @@ -63,4 +77,11 @@ public class Controller { return bearbeitet; } + + @RequestMapping("/securityCheck") + @ResponseBody + public String securityCheck(){ + return "Angemeldet"; + } + } diff --git a/src/main/java/hhn/labsw/bugageocaching/entities/Role.java b/src/main/java/hhn/labsw/bugageocaching/entities/Role.java new file mode 100644 index 0000000..47da1bd --- /dev/null +++ b/src/main/java/hhn/labsw/bugageocaching/entities/Role.java @@ -0,0 +1,44 @@ +package hhn.labsw.bugageocaching.entities; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToMany; +import java.util.Set; + +@Entity +public class Role { + + @Id + @GeneratedValue + int id; + + private String name; + + @ManyToMany(mappedBy = "roles") + private Set users; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Set getUsers() { + return users; + } + + public void setUsers(Set users) { + this.users = users; + } +} diff --git a/src/main/java/hhn/labsw/bugageocaching/entities/User.java b/src/main/java/hhn/labsw/bugageocaching/entities/User.java index eb0e75d..7c0abe4 100644 --- a/src/main/java/hhn/labsw/bugageocaching/entities/User.java +++ b/src/main/java/hhn/labsw/bugageocaching/entities/User.java @@ -1,6 +1,7 @@ package hhn.labsw.bugageocaching.entities; import javax.persistence.*; +import java.util.Set; @Entity @Table @@ -14,14 +15,18 @@ public class User { private String lastname; private String username; private int rankingPointsSum; - private String discriminator; //should be Admin or Cacher private String email; private String password; - private String salt; @ManyToOne private Team team; + @ManyToMany + Set roles; + + @Transient + private String passwordConfirm; + public int getId() { return id; } @@ -62,14 +67,6 @@ public class User { this.rankingPointsSum = rankingPointsSum; } - public String getDiscriminator() { - return discriminator; - } - - public void setDiscriminator(String discriminator) { - this.discriminator = discriminator; - } - public String getEmail() { return email; } @@ -86,14 +83,6 @@ public class User { this.password = password; } - public String getSalt() { - return salt; - } - - public void setSalt(String salt) { - this.salt = salt; - } - public Team getTeam() { return team; } @@ -101,4 +90,20 @@ public class User { public void setTeam(Team team) { this.team = team; } + + public Set getRoles() { + return roles; + } + + public void setRoles(Set roles) { + this.roles = roles; + } + + public String getPasswordConfirm() { + return passwordConfirm; + } + + public void setPasswordConfirm(String passwordConfirm) { + this.passwordConfirm = passwordConfirm; + } } diff --git a/src/main/java/hhn/labsw/bugageocaching/repositories/BearbeitetRepository.java b/src/main/java/hhn/labsw/bugageocaching/repositories/BearbeitetRepository.java index fb4a270..ac5484c 100644 --- a/src/main/java/hhn/labsw/bugageocaching/repositories/BearbeitetRepository.java +++ b/src/main/java/hhn/labsw/bugageocaching/repositories/BearbeitetRepository.java @@ -1,7 +1,8 @@ package hhn.labsw.bugageocaching.repositories; import hhn.labsw.bugageocaching.entities.Bearbeitet; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.CrudRepository; -public interface BearbeitetRepository extends CrudRepository { +public interface BearbeitetRepository extends JpaRepository { } diff --git a/src/main/java/hhn/labsw/bugageocaching/repositories/CacheAccesDefinitionRepository.java b/src/main/java/hhn/labsw/bugageocaching/repositories/CacheAccesDefinitionRepository.java index 2a01cab..a807947 100644 --- a/src/main/java/hhn/labsw/bugageocaching/repositories/CacheAccesDefinitionRepository.java +++ b/src/main/java/hhn/labsw/bugageocaching/repositories/CacheAccesDefinitionRepository.java @@ -1,7 +1,8 @@ package hhn.labsw.bugageocaching.repositories; import hhn.labsw.bugageocaching.entities.CacheAccesDefinition; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.CrudRepository; -public interface CacheAccesDefinitionRepository extends CrudRepository { +public interface CacheAccesDefinitionRepository extends JpaRepository { } diff --git a/src/main/java/hhn/labsw/bugageocaching/repositories/CacheRepository.java b/src/main/java/hhn/labsw/bugageocaching/repositories/CacheRepository.java index b480c64..9ac29b1 100644 --- a/src/main/java/hhn/labsw/bugageocaching/repositories/CacheRepository.java +++ b/src/main/java/hhn/labsw/bugageocaching/repositories/CacheRepository.java @@ -1,7 +1,8 @@ package hhn.labsw.bugageocaching.repositories; import hhn.labsw.bugageocaching.entities.Cache; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.CrudRepository; -public interface CacheRepository extends CrudRepository { +public interface CacheRepository extends JpaRepository { } diff --git a/src/main/java/hhn/labsw/bugageocaching/repositories/RewardRepository.java b/src/main/java/hhn/labsw/bugageocaching/repositories/RewardRepository.java index ca51b18..0756cec 100644 --- a/src/main/java/hhn/labsw/bugageocaching/repositories/RewardRepository.java +++ b/src/main/java/hhn/labsw/bugageocaching/repositories/RewardRepository.java @@ -1,7 +1,8 @@ package hhn.labsw.bugageocaching.repositories; import hhn.labsw.bugageocaching.entities.Reward; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.CrudRepository; -public interface RewardRepository extends CrudRepository { +public interface RewardRepository extends JpaRepository { } diff --git a/src/main/java/hhn/labsw/bugageocaching/repositories/RoleRepository.java b/src/main/java/hhn/labsw/bugageocaching/repositories/RoleRepository.java new file mode 100644 index 0000000..b5f8798 --- /dev/null +++ b/src/main/java/hhn/labsw/bugageocaching/repositories/RoleRepository.java @@ -0,0 +1,7 @@ +package hhn.labsw.bugageocaching.repositories; + +import hhn.labsw.bugageocaching.entities.Role; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface RoleRepository extends JpaRepository { +} diff --git a/src/main/java/hhn/labsw/bugageocaching/repositories/StationRepository.java b/src/main/java/hhn/labsw/bugageocaching/repositories/StationRepository.java index c902ec5..146c9bb 100644 --- a/src/main/java/hhn/labsw/bugageocaching/repositories/StationRepository.java +++ b/src/main/java/hhn/labsw/bugageocaching/repositories/StationRepository.java @@ -1,7 +1,8 @@ package hhn.labsw.bugageocaching.repositories; import hhn.labsw.bugageocaching.entities.Station; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.CrudRepository; -public interface StationRepository extends CrudRepository { +public interface StationRepository extends JpaRepository { } diff --git a/src/main/java/hhn/labsw/bugageocaching/repositories/TeamRepository.java b/src/main/java/hhn/labsw/bugageocaching/repositories/TeamRepository.java index edf1d5d..77c69d9 100644 --- a/src/main/java/hhn/labsw/bugageocaching/repositories/TeamRepository.java +++ b/src/main/java/hhn/labsw/bugageocaching/repositories/TeamRepository.java @@ -1,7 +1,8 @@ package hhn.labsw.bugageocaching.repositories; import hhn.labsw.bugageocaching.entities.Team; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.CrudRepository; -public interface TeamRepository extends CrudRepository { +public interface TeamRepository extends JpaRepository { } diff --git a/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java b/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java index f899608..a56391e 100644 --- a/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java +++ b/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java @@ -1,7 +1,9 @@ package hhn.labsw.bugageocaching.repositories; import hhn.labsw.bugageocaching.entities.User; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.CrudRepository; -public interface UserRepository extends CrudRepository { +public interface UserRepository extends JpaRepository { + User findByUsername(String username); } diff --git a/src/main/java/hhn/labsw/bugageocaching/service/SecurityService.java b/src/main/java/hhn/labsw/bugageocaching/service/SecurityService.java new file mode 100644 index 0000000..aed5944 --- /dev/null +++ b/src/main/java/hhn/labsw/bugageocaching/service/SecurityService.java @@ -0,0 +1,8 @@ +package hhn.labsw.bugageocaching.service; + +public interface SecurityService { + + String findLoggedInUsername(); + + void autoLogin(String username, String password); +} diff --git a/src/main/java/hhn/labsw/bugageocaching/service/SecurityServiceImpl.java b/src/main/java/hhn/labsw/bugageocaching/service/SecurityServiceImpl.java new file mode 100644 index 0000000..9bdd3f6 --- /dev/null +++ b/src/main/java/hhn/labsw/bugageocaching/service/SecurityServiceImpl.java @@ -0,0 +1,48 @@ +package hhn.labsw.bugageocaching.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.stereotype.Service; + +@Service +public class SecurityServiceImpl implements SecurityService{ + + @Autowired + private AuthenticationManager authenticationManager; + + @Qualifier("userDetailsServiceImpl") + @Autowired + private UserDetailsService userDetailsService; + + private static final Logger logger = LoggerFactory.getLogger(SecurityServiceImpl.class); + + @Override + public String findLoggedInUsername() { + Object userDetails = SecurityContextHolder.getContext().getAuthentication().getDetails(); + if (userDetails instanceof UserDetails) { + return ((UserDetails)userDetails).getUsername(); + } + + return null; + } + + @Override + public void autoLogin(String username, String password) { + UserDetails userDetails = userDetailsService.loadUserByUsername(username); + UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userDetails, password, userDetails.getAuthorities()); + + authenticationManager.authenticate(usernamePasswordAuthenticationToken); + + if (usernamePasswordAuthenticationToken.isAuthenticated()) { + SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); + logger.debug(String.format("Auto login %s successfully!", username)); + } + } +} diff --git a/src/main/java/hhn/labsw/bugageocaching/service/UserDetailsServiceImpl.java b/src/main/java/hhn/labsw/bugageocaching/service/UserDetailsServiceImpl.java new file mode 100644 index 0000000..c261830 --- /dev/null +++ b/src/main/java/hhn/labsw/bugageocaching/service/UserDetailsServiceImpl.java @@ -0,0 +1,37 @@ +package hhn.labsw.bugageocaching.service; + +import hhn.labsw.bugageocaching.entities.Role; +import hhn.labsw.bugageocaching.entities.User; +import hhn.labsw.bugageocaching.repositories.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +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 java.util.HashSet; +import java.util.Set; + +@Service +public class UserDetailsServiceImpl implements UserDetailsService { + + @Autowired + private UserRepository userRepository; + + @Override + @Transactional(readOnly = true) + public UserDetails loadUserByUsername(String username) { + User user = userRepository.findByUsername(username); + if (user == null) throw new UsernameNotFoundException(username); + + Set grantedAuthorities = new HashSet<>(); + for (Role role : user.getRoles()){ + grantedAuthorities.add(new SimpleGrantedAuthority(role.getName())); + } + + return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), grantedAuthorities); + } +} diff --git a/src/main/java/hhn/labsw/bugageocaching/service/UserService.java b/src/main/java/hhn/labsw/bugageocaching/service/UserService.java new file mode 100644 index 0000000..e5e1c0b --- /dev/null +++ b/src/main/java/hhn/labsw/bugageocaching/service/UserService.java @@ -0,0 +1,10 @@ +package hhn.labsw.bugageocaching.service; + +import hhn.labsw.bugageocaching.entities.User; + +public interface UserService { + void save(User user); + + User findByUsername(String username); + +} diff --git a/src/main/java/hhn/labsw/bugageocaching/service/UserServiceImpl.java b/src/main/java/hhn/labsw/bugageocaching/service/UserServiceImpl.java new file mode 100644 index 0000000..6374d36 --- /dev/null +++ b/src/main/java/hhn/labsw/bugageocaching/service/UserServiceImpl.java @@ -0,0 +1,33 @@ +package hhn.labsw.bugageocaching.service; + +import hhn.labsw.bugageocaching.entities.User; +import hhn.labsw.bugageocaching.repositories.RoleRepository; +import hhn.labsw.bugageocaching.repositories.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; + +import java.util.HashSet; + +@Service +public class UserServiceImpl implements UserService { + + @Autowired + private UserRepository userRepository; + @Autowired + private RoleRepository roleRepository; + @Autowired + private BCryptPasswordEncoder bCryptPasswordEncoder; + + @Override + public void save(User user) { + user.setPassword(bCryptPasswordEncoder.encode(user.getPassword())); + user.setRoles(new HashSet<>(roleRepository.findAll())); + userRepository.save(user); + } + + @Override + public User findByUsername(String username) { + return userRepository.findByUsername(username); + } +} From d06b2aacc1b891afed5041d9d4bb5157511eb1ff Mon Sep 17 00:00:00 2001 From: Maximilian Leopold Date: Mon, 25 Mar 2019 13:17:11 +0100 Subject: [PATCH 02/11] Deleted idea files --- .idea/checkstyle-idea.xml | 16 ---------------- .idea/compiler.xml | 11 ----------- .idea/inspectionProfiles/Project_Default.xml | 6 ------ .idea/misc.xml | 10 ---------- ....de.hhn.labsw.labswp_2019_sose_geocaching.iml | 12 ------------ 5 files changed, 55 deletions(-) delete mode 100644 .idea/checkstyle-idea.xml delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules/LabSWPS.de.hhn.labsw.labswp_2019_sose_geocaching.iml diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml deleted file mode 100644 index 6d6a80d..0000000 --- a/.idea/checkstyle-idea.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 35c475b..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 03d9549..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 216536e..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/LabSWPS.de.hhn.labsw.labswp_2019_sose_geocaching.iml b/.idea/modules/LabSWPS.de.hhn.labsw.labswp_2019_sose_geocaching.iml deleted file mode 100644 index 92b5305..0000000 --- a/.idea/modules/LabSWPS.de.hhn.labsw.labswp_2019_sose_geocaching.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file From 99512b425010216ba27e77cdc6c47846796764a1 Mon Sep 17 00:00:00 2001 From: Maximilian Leopold Date: Sat, 6 Apr 2019 12:29:09 +0200 Subject: [PATCH 03/11] Implemented Login with JWT --- build.gradle | 5 ++ .../bugageocaching/controller/Controller.java | 48 +++++++++++++++---- .../labsw/bugageocaching/entities/Role.java | 5 ++ 3 files changed, 50 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 62a8c2c..94f19e8 100644 --- a/build.gradle +++ b/build.gradle @@ -37,6 +37,11 @@ dependencies { compile group: 'org.springframework.security', name: 'spring-security-core', version: '5.1.4.RELEASE' + //JWT + compile 'io.jsonwebtoken:jjwt-api:0.10.5' + runtime 'io.jsonwebtoken:jjwt-impl:0.10.5', + 'io.jsonwebtoken:jjwt-jackson:0.10.5' + } node { diff --git a/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java b/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java index a962339..d57fd8b 100644 --- a/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java +++ b/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java @@ -1,20 +1,27 @@ package hhn.labsw.bugageocaching.controller; import com.google.gson.Gson; + import hhn.labsw.bugageocaching.entities.*; import hhn.labsw.bugageocaching.exceptions.IllegalParameterException; import hhn.labsw.bugageocaching.repositories.*; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.security.Keys; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.crypto.bcrypt.BCrypt; import org.springframework.web.bind.annotation.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.Random; +import javax.annotation.PostConstruct; +import javax.xml.bind.DatatypeConverter; +import java.security.Key; +import java.security.SecureRandom; +import java.util.*; import java.util.concurrent.atomic.AtomicLong; +import java.util.logging.Logger; @RestController public class Controller { @@ -44,6 +51,13 @@ public class Controller { StationReihenfolgeRepository stationReihenfolgeRepository; private AtomicLong counter = new AtomicLong(); + byte[] key = new byte[64]; + + @PostConstruct + public void init(){ + new SecureRandom().nextBytes(key); + System.out.println(Arrays.toString(key)); + } @CrossOrigin(origins = "http://localhost:8081") // only for dev purpose @RequestMapping("/api/allCaches") @@ -65,14 +79,32 @@ public class Controller { return ResponseEntity.status(404).body("User was not found"); } - if (BCrypt.checkpw(user.getPassword(), userRepository.findByUsername(user.getUsername()).getPassword())) { + SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; + + if(BCrypt.checkpw(user.getPassword(), userRepository.findByUsername(user.getUsername()).getPassword())){ + String token = Jwts.builder().setSubject(user.getUsername()).claim("admin", userRepository.findByUsername(user.getUsername()).getRoles().stream().anyMatch(x->x.getId()==0)).setExpiration(new Date(new Date().getTime() + (1000 * 60 * 60 * 24))).signWith(signatureAlgorithm, key).compact(); + System.out.println(token); + + Claims claims = Jwts.parser() + .setSigningKey(key) + .parseClaimsJws(token).getBody(); + System.out.println("ID: " + claims.getId()); + System.out.println("Subject: " + claims.getSubject()); + System.out.println("Issuer: " + claims.getIssuer()); + System.out.println("Admin: " + claims.get("admin")); + System.out.println("Expiration: " + claims.getExpiration()); + + return ResponseEntity.status(200).body(token); + } + + /*if (BCrypt.checkpw(user.getPassword(), userRepository.findByUsername(user.getUsername()).getPassword())) { String token = user.getUsername() + BCrypt.hashpw(String.valueOf(System.currentTimeMillis() + counter.incrementAndGet()), BCrypt.gensalt()); String hashedToken = BCrypt.hashpw(token, BCrypt.gensalt()); userRepository.findByUsername(user.getUsername()).setToken(hashedToken); userRepository.save(userRepository.findByUsername(user.getUsername())); //return ResponseEntity.ok(new Gson().toJson(token)); return ResponseEntity.status(200).body(token); - } + }*/ return ResponseEntity.status(400).body("Es ist ein Fehler aufgetreten"); } @@ -132,14 +164,14 @@ public class Controller { @ResponseBody public ResponseEntity logout(@RequestParam String token) { // System.out.println("logout"); - User user = userRepository.findByUsername(token.substring(0, token.indexOf("$"))); + /*User user = userRepository.findByUsername(token.substring(0, token.indexOf("$"))); // System.out.println(token); // System.out.println(user.getToken()); if (user == null || user.getToken().isEmpty()) { return ResponseEntity.status(404).body("User was not found"); } user.setToken(null); - userRepository.save(user); + userRepository.save(user);*/ return ResponseEntity.status(200).body("Token was deleted"); } diff --git a/src/main/java/hhn/labsw/bugageocaching/entities/Role.java b/src/main/java/hhn/labsw/bugageocaching/entities/Role.java index 5019a0b..b5612bc 100644 --- a/src/main/java/hhn/labsw/bugageocaching/entities/Role.java +++ b/src/main/java/hhn/labsw/bugageocaching/entities/Role.java @@ -31,4 +31,9 @@ public class Role { public void setName(String name) { this.name = name; } + + @Override + public String toString() { + return name; + } } From e45bdb045661013bb47f9e26dc7a84bc9b708506 Mon Sep 17 00:00:00 2001 From: Maximilian Leopold Date: Sat, 6 Apr 2019 12:36:13 +0200 Subject: [PATCH 04/11] Slight changes to jwt --- .../hhn/labsw/bugageocaching/controller/Controller.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java b/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java index d57fd8b..ebb9744 100644 --- a/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java +++ b/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java @@ -82,7 +82,11 @@ public class Controller { SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; if(BCrypt.checkpw(user.getPassword(), userRepository.findByUsername(user.getUsername()).getPassword())){ - String token = Jwts.builder().setSubject(user.getUsername()).claim("admin", userRepository.findByUsername(user.getUsername()).getRoles().stream().anyMatch(x->x.getId()==0)).setExpiration(new Date(new Date().getTime() + (1000 * 60 * 60 * 24))).signWith(signatureAlgorithm, key).compact(); + String token = Jwts.builder() + .setSubject(user.getUsername()) + .claim("admin", userRepository.findByUsername(user.getUsername()).getRoles().stream().anyMatch(x->x.getId()==0)) //True if user is admin + .setExpiration(new Date(new Date().getTime() + (1000 * 60 * 60 * 24))) //One day expiration + .signWith(signatureAlgorithm, key).compact(); System.out.println(token); Claims claims = Jwts.parser() From affd0a20f8de106c868be85cef11bb2522f28962 Mon Sep 17 00:00:00 2001 From: Maximilian Leopold Date: Sat, 6 Apr 2019 12:39:45 +0200 Subject: [PATCH 05/11] MErge Conflict --- .../config/WebSecurityConfig.java | 52 ------------------- .../labsw/bugageocaching/entities/User.java | 31 +++-------- .../repositories/UserRepository.java | 7 +-- .../service/SecurityService.java | 8 --- .../service/SecurityServiceImpl.java | 48 ----------------- .../service/UserDetailsServiceImpl.java | 37 ------------- .../bugageocaching/service/UserService.java | 10 ---- .../service/UserServiceImpl.java | 33 ------------ 8 files changed, 8 insertions(+), 218 deletions(-) delete mode 100644 src/main/java/hhn/labsw/bugageocaching/config/WebSecurityConfig.java delete mode 100644 src/main/java/hhn/labsw/bugageocaching/service/SecurityService.java delete mode 100644 src/main/java/hhn/labsw/bugageocaching/service/SecurityServiceImpl.java delete mode 100644 src/main/java/hhn/labsw/bugageocaching/service/UserDetailsServiceImpl.java delete mode 100644 src/main/java/hhn/labsw/bugageocaching/service/UserService.java delete mode 100644 src/main/java/hhn/labsw/bugageocaching/service/UserServiceImpl.java diff --git a/src/main/java/hhn/labsw/bugageocaching/config/WebSecurityConfig.java b/src/main/java/hhn/labsw/bugageocaching/config/WebSecurityConfig.java deleted file mode 100644 index 7af8e75..0000000 --- a/src/main/java/hhn/labsw/bugageocaching/config/WebSecurityConfig.java +++ /dev/null @@ -1,52 +0,0 @@ -package hhn.labsw.bugageocaching.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -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.core.userdetails.UserDetailsService; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - -@Configuration -@EnableWebSecurity -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Qualifier("userDetailsServiceImpl") - @Autowired - private UserDetailsService userDetailsService; - - @Bean - public BCryptPasswordEncoder bCryptPasswordEncoder() { - return new BCryptPasswordEncoder(); - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeRequests() - .antMatchers("/allCaches").permitAll() - .anyRequest().authenticated() - .and() - .formLogin() - .defaultSuccessUrl("/allCaches") - .permitAll() - .and() - .logout() - .permitAll(); - } - - @Bean - public AuthenticationManager customAuthenticationManager() throws Exception { - return authenticationManager(); - } - - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); - } -} diff --git a/src/main/java/hhn/labsw/bugageocaching/entities/User.java b/src/main/java/hhn/labsw/bugageocaching/entities/User.java index 3e98d14..ff11f43 100644 --- a/src/main/java/hhn/labsw/bugageocaching/entities/User.java +++ b/src/main/java/hhn/labsw/bugageocaching/entities/User.java @@ -1,11 +1,11 @@ package hhn.labsw.bugageocaching.entities; import javax.persistence.*; -<<<<<<< HEAD + import java.util.Set; -======= + import java.util.List; ->>>>>>> develop + @Entity @Table @@ -21,20 +21,17 @@ public class User { private int rankingPointsSum; private String email; private String password; -<<<<<<< HEAD -======= + @ManyToMany private List roles; private String token; ->>>>>>> develop + @ManyToOne private Team team; - @ManyToMany - Set roles; @Transient private String passwordConfirm; @@ -103,22 +100,6 @@ public class User { this.team = team; } -<<<<<<< HEAD - public Set getRoles() { - return roles; - } - - public void setRoles(Set roles) { - this.roles = roles; - } - - public String getPasswordConfirm() { - return passwordConfirm; - } - - public void setPasswordConfirm(String passwordConfirm) { - this.passwordConfirm = passwordConfirm; -======= public List getRoles() { return roles; } @@ -133,6 +114,6 @@ public class User { public void setToken(String token) { this.token = token; ->>>>>>> develop + } } diff --git a/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java b/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java index 99b0fb2..df051fc 100644 --- a/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java +++ b/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java @@ -1,13 +1,10 @@ package hhn.labsw.bugageocaching.repositories; import hhn.labsw.bugageocaching.entities.User; -<<<<<<< HEAD import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.CrudRepository; -public interface UserRepository extends JpaRepository { - User findByUsername(String username); -======= + import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; @@ -19,5 +16,5 @@ public interface UserRepository extends CrudRepository { @Query(value = "SELECT u.username, u.ranking_points_sum from user u order by ranking_points_sum DESC", nativeQuery = true) List getRankingList(); ->>>>>>> develop + } diff --git a/src/main/java/hhn/labsw/bugageocaching/service/SecurityService.java b/src/main/java/hhn/labsw/bugageocaching/service/SecurityService.java deleted file mode 100644 index aed5944..0000000 --- a/src/main/java/hhn/labsw/bugageocaching/service/SecurityService.java +++ /dev/null @@ -1,8 +0,0 @@ -package hhn.labsw.bugageocaching.service; - -public interface SecurityService { - - String findLoggedInUsername(); - - void autoLogin(String username, String password); -} diff --git a/src/main/java/hhn/labsw/bugageocaching/service/SecurityServiceImpl.java b/src/main/java/hhn/labsw/bugageocaching/service/SecurityServiceImpl.java deleted file mode 100644 index 9bdd3f6..0000000 --- a/src/main/java/hhn/labsw/bugageocaching/service/SecurityServiceImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -package hhn.labsw.bugageocaching.service; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.stereotype.Service; - -@Service -public class SecurityServiceImpl implements SecurityService{ - - @Autowired - private AuthenticationManager authenticationManager; - - @Qualifier("userDetailsServiceImpl") - @Autowired - private UserDetailsService userDetailsService; - - private static final Logger logger = LoggerFactory.getLogger(SecurityServiceImpl.class); - - @Override - public String findLoggedInUsername() { - Object userDetails = SecurityContextHolder.getContext().getAuthentication().getDetails(); - if (userDetails instanceof UserDetails) { - return ((UserDetails)userDetails).getUsername(); - } - - return null; - } - - @Override - public void autoLogin(String username, String password) { - UserDetails userDetails = userDetailsService.loadUserByUsername(username); - UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userDetails, password, userDetails.getAuthorities()); - - authenticationManager.authenticate(usernamePasswordAuthenticationToken); - - if (usernamePasswordAuthenticationToken.isAuthenticated()) { - SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); - logger.debug(String.format("Auto login %s successfully!", username)); - } - } -} diff --git a/src/main/java/hhn/labsw/bugageocaching/service/UserDetailsServiceImpl.java b/src/main/java/hhn/labsw/bugageocaching/service/UserDetailsServiceImpl.java deleted file mode 100644 index c261830..0000000 --- a/src/main/java/hhn/labsw/bugageocaching/service/UserDetailsServiceImpl.java +++ /dev/null @@ -1,37 +0,0 @@ -package hhn.labsw.bugageocaching.service; - -import hhn.labsw.bugageocaching.entities.Role; -import hhn.labsw.bugageocaching.entities.User; -import hhn.labsw.bugageocaching.repositories.UserRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -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 java.util.HashSet; -import java.util.Set; - -@Service -public class UserDetailsServiceImpl implements UserDetailsService { - - @Autowired - private UserRepository userRepository; - - @Override - @Transactional(readOnly = true) - public UserDetails loadUserByUsername(String username) { - User user = userRepository.findByUsername(username); - if (user == null) throw new UsernameNotFoundException(username); - - Set grantedAuthorities = new HashSet<>(); - for (Role role : user.getRoles()){ - grantedAuthorities.add(new SimpleGrantedAuthority(role.getName())); - } - - return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), grantedAuthorities); - } -} diff --git a/src/main/java/hhn/labsw/bugageocaching/service/UserService.java b/src/main/java/hhn/labsw/bugageocaching/service/UserService.java deleted file mode 100644 index e5e1c0b..0000000 --- a/src/main/java/hhn/labsw/bugageocaching/service/UserService.java +++ /dev/null @@ -1,10 +0,0 @@ -package hhn.labsw.bugageocaching.service; - -import hhn.labsw.bugageocaching.entities.User; - -public interface UserService { - void save(User user); - - User findByUsername(String username); - -} diff --git a/src/main/java/hhn/labsw/bugageocaching/service/UserServiceImpl.java b/src/main/java/hhn/labsw/bugageocaching/service/UserServiceImpl.java deleted file mode 100644 index 6374d36..0000000 --- a/src/main/java/hhn/labsw/bugageocaching/service/UserServiceImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package hhn.labsw.bugageocaching.service; - -import hhn.labsw.bugageocaching.entities.User; -import hhn.labsw.bugageocaching.repositories.RoleRepository; -import hhn.labsw.bugageocaching.repositories.UserRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.stereotype.Service; - -import java.util.HashSet; - -@Service -public class UserServiceImpl implements UserService { - - @Autowired - private UserRepository userRepository; - @Autowired - private RoleRepository roleRepository; - @Autowired - private BCryptPasswordEncoder bCryptPasswordEncoder; - - @Override - public void save(User user) { - user.setPassword(bCryptPasswordEncoder.encode(user.getPassword())); - user.setRoles(new HashSet<>(roleRepository.findAll())); - userRepository.save(user); - } - - @Override - public User findByUsername(String username) { - return userRepository.findByUsername(username); - } -} From d8780744a52b20334d920111848f51959fee0ca6 Mon Sep 17 00:00:00 2001 From: Maximilian Leopold Date: Sat, 6 Apr 2019 16:10:01 +0200 Subject: [PATCH 06/11] Implemented JWT --- .../bugageocaching/controller/Controller.java | 135 ++++++++++++------ .../labsw/bugageocaching/entities/User.java | 11 -- 2 files changed, 89 insertions(+), 57 deletions(-) diff --git a/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java b/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java index ebb9744..6e4bbb1 100644 --- a/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java +++ b/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java @@ -6,6 +6,7 @@ import hhn.labsw.bugageocaching.entities.*; import hhn.labsw.bugageocaching.exceptions.IllegalParameterException; import hhn.labsw.bugageocaching.repositories.*; import io.jsonwebtoken.Claims; +import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; @@ -54,7 +55,7 @@ public class Controller { byte[] key = new byte[64]; @PostConstruct - public void init(){ + public void init() { new SecureRandom().nextBytes(key); System.out.println(Arrays.toString(key)); } @@ -81,22 +82,23 @@ public class Controller { SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; - if(BCrypt.checkpw(user.getPassword(), userRepository.findByUsername(user.getUsername()).getPassword())){ + if (BCrypt.checkpw(user.getPassword(), userRepository.findByUsername(user.getUsername()).getPassword())) { String token = Jwts.builder() .setSubject(user.getUsername()) - .claim("admin", userRepository.findByUsername(user.getUsername()).getRoles().stream().anyMatch(x->x.getId()==0)) //True if user is admin + .claim("admin", userRepository.findByUsername(user.getUsername()).getRoles().stream().anyMatch(x -> x.getId() == 0)) //True if user is admin .setExpiration(new Date(new Date().getTime() + (1000 * 60 * 60 * 24))) //One day expiration - .signWith(signatureAlgorithm, key).compact(); - System.out.println(token); + .signWith(signatureAlgorithm, key) + .compact(); + /*System.out.println(token); - Claims claims = Jwts.parser() + Claims claims = Jwts.parser() //Parse JWT .setSigningKey(key) .parseClaimsJws(token).getBody(); System.out.println("ID: " + claims.getId()); System.out.println("Subject: " + claims.getSubject()); System.out.println("Issuer: " + claims.getIssuer()); System.out.println("Admin: " + claims.get("admin")); - System.out.println("Expiration: " + claims.getExpiration()); + System.out.println("Expiration: " + claims.getExpiration());*/ return ResponseEntity.status(200).body(token); } @@ -122,35 +124,46 @@ public class Controller { Bearbeitet bearbeitet = new Bearbeitet(); - User user = userRepository.findByUsername(token.substring(0, token.indexOf("$"))); - if (user == null) { - return ResponseEntity.status(404).body("User was not found"); - } - bearbeitet.setUser(user); + try { + Claims claims = Jwts.parser() //Parse JWT + .setSigningKey(key) + .parseClaimsJws(token).getBody(); - Optional cacheOptional = cacheRepository.findById(Integer.valueOf(cacheID)); - if (cacheOptional.isPresent()) { - Cache cache = cacheOptional.get(); - bearbeitet.setCache(cache); - Station startStation = cache.getStartStation(); - bearbeitet.setAktuelleStation(startStation); - } else { - return ResponseEntity.status(404).body("Couldnt find Cache " + cacheID); - } + User user = userRepository.findByUsername(claims.getSubject()); + if (user == null) { + return ResponseEntity.status(404).body("User was not found"); + } + bearbeitet.setUser(user); - Optional cacheAccesDefinitionOptional = - cacheAccesDefinitionRepository.findById(0); // angefangen - if (cacheAccesDefinitionOptional.isPresent()) { - CacheAccesDefinition cacheAccesDefinition = cacheAccesDefinitionOptional.get(); - bearbeitet.setCacheAccesDefinition(cacheAccesDefinition); - } else { - return ResponseEntity.status(404).body("There is no cacheAccesDefinition with the ID " + 0); + Optional cacheOptional = cacheRepository.findById(Integer.valueOf(cacheID)); + if (cacheOptional.isPresent()) { + Cache cache = cacheOptional.get(); + bearbeitet.setCache(cache); + + Station startStation = cache.getStartStation(); + bearbeitet.setAktuelleStation(startStation); + } else { + return ResponseEntity.status(404).body("Couldnt find Cache " + cacheID); } - bearbeitetRepository.save(bearbeitet); + Optional cacheAccesDefinitionOptional = + cacheAccesDefinitionRepository.findById(0); // angefangen + if (cacheAccesDefinitionOptional.isPresent()) { + CacheAccesDefinition cacheAccesDefinition = cacheAccesDefinitionOptional.get(); + bearbeitet.setCacheAccesDefinition(cacheAccesDefinition); + } else { + return ResponseEntity.status(404).body("There is no cacheAccesDefinition with the ID " + 0); + } - return ResponseEntity.status(200).body(new Gson().toJson(bearbeitet)); + bearbeitetRepository.save(bearbeitet); + + return ResponseEntity.status(200).body(new Gson().toJson(bearbeitet)); + } catch (ExpiredJwtException e) { + return ResponseEntity.status(400).body("JWT Token expired"); + } catch (Exception e){ + return ResponseEntity.status(400).body("JWT Token invalid"); + } } else { // kein angemeldeter User startet den cache(es wird nur der cache als parameter übergeben) Optional cacheOptional = cacheRepository.findById(Integer.valueOf(cacheID)); @@ -163,6 +176,7 @@ public class Controller { } } + //Eigentlich brauchen wir mit JWT keine Logout Methode mehr. @CrossOrigin(origins = "http://localhost:8081") // only for dev purpose @RequestMapping("/api/logout") @ResponseBody @@ -183,9 +197,9 @@ public class Controller { @RequestMapping("/api/createStation") @ResponseBody public ResponseEntity createStation(@RequestParam String description, - @RequestParam String latitude, - @RequestParam String longitude, - @RequestParam String solution) { + @RequestParam String latitude, + @RequestParam String longitude, + @RequestParam String solution) { if (description.length() == 0 || latitude.length() == 0 || longitude.length() == 0 || solution.length() == 0) { return ResponseEntity.status(400).body("At least one Argument was empty"); @@ -233,8 +247,21 @@ public class Controller { @RequestMapping("/api/checkAdmin") @ResponseBody public ResponseEntity checkAdmin(@RequestParam String token) { - User user = userRepository.findByUsername(token.substring(0, token.indexOf("$"))); - if(user == null){ + + try { + Claims claims = Jwts.parser() //Parse JWT + .setSigningKey(key) + .parseClaimsJws(token).getBody(); + + return ResponseEntity.status(200).body(claims.get("admin")); + }catch (ExpiredJwtException e) { + return ResponseEntity.status(400).body("JWT Token expired"); + } catch (Exception e){ + return ResponseEntity.status(400).body("JWT Token invalid"); + } + + /*User user = userRepository.findByUsername(token.substring(0, token.indexOf("$"))); + if (user == null) { return ResponseEntity.status(404).body("User was not found"); } for (Role role : user.getRoles()) { @@ -242,7 +269,7 @@ public class Controller { return ResponseEntity.status(200).body("User is Admin"); } } - return ResponseEntity.status(401).body("User is no Admin"); + return ResponseEntity.status(401).body("User is no Admin");*/ } //Bis hier @@ -257,10 +284,10 @@ public class Controller { @RequestMapping("/api/createCache") @ResponseBody public ResponseEntity createCache(@RequestParam String description, - @RequestParam String name, - @RequestParam String rankingPoints, - @RequestParam(value = "rewardID", defaultValue = "-1") String rewardID, - @RequestParam List stationen) { + @RequestParam String name, + @RequestParam String rankingPoints, + @RequestParam(value = "rewardID", defaultValue = "-1") String rewardID, + @RequestParam List stationen) { if (description.length() == 0 || name.length() == 0 || rankingPoints.length() == 0 || stationen.size() == 0) { return ResponseEntity.status(400).body("Fields can´t be empty"); @@ -340,7 +367,14 @@ public class Controller { @ResponseBody public ResponseEntity getMyCaches(@RequestParam String token) { try { - User user = userRepository.findByUsername(token.substring(0, token.indexOf("$"))); + + Claims claims = Jwts.parser() //Parse JWT + .setSigningKey(key) + .parseClaimsJws(token).getBody(); + + + User user = userRepository.findByUsername(claims.getSubject()); + if (user != null) { ArrayList bearbeitetList = new ArrayList<>(); @@ -353,8 +387,10 @@ public class Controller { } else { return ResponseEntity.status(404).body("User was not found in the database"); } - } catch (StringIndexOutOfBoundsException e) { - return ResponseEntity.status(400).body("Invalid token"); + } catch (ExpiredJwtException e) { + return ResponseEntity.status(400).body("JWT Token expired"); + } catch (Exception e){ + return ResponseEntity.status(400).body("JWT Token invalid"); } } @@ -370,14 +406,21 @@ public class Controller { @ResponseBody public ResponseEntity getUser(@RequestParam String token) { try { - User user = userRepository.findByUsername(token.substring(0, token.indexOf("$"))); + Claims claims = Jwts.parser() //Parse JWT + .setSigningKey(key) + .parseClaimsJws(token).getBody(); + + + User user = userRepository.findByUsername(claims.getSubject()); if (user != null) { return ResponseEntity.status(200).body(new Gson().toJson(user)); } else { return ResponseEntity.status(404).body("User was not found in the database"); } - } catch (StringIndexOutOfBoundsException e) { - return ResponseEntity.status(400).body("Invalid token"); + } catch (ExpiredJwtException e) { + return ResponseEntity.status(400).body("JWT Token expired"); + } catch (Exception e){ + return ResponseEntity.status(400).body("JWT Token invalid"); } } } diff --git a/src/main/java/hhn/labsw/bugageocaching/entities/User.java b/src/main/java/hhn/labsw/bugageocaching/entities/User.java index ff11f43..0b546f6 100644 --- a/src/main/java/hhn/labsw/bugageocaching/entities/User.java +++ b/src/main/java/hhn/labsw/bugageocaching/entities/User.java @@ -26,9 +26,6 @@ public class User { @ManyToMany private List roles; - private String token; - - @ManyToOne private Team team; @@ -108,12 +105,4 @@ public class User { this.roles = roles; } - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - - } } From f28418a8ca1572e32a4e4091c5e84dff0f5cacbe Mon Sep 17 00:00:00 2001 From: Maximilian Leopold Date: Sat, 6 Apr 2019 16:16:13 +0200 Subject: [PATCH 07/11] Merged develop into max/backend --- build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 6ebd538..1a8425f 100644 --- a/build.gradle +++ b/build.gradle @@ -35,15 +35,15 @@ dependencies { //JSON Parser implementation 'com.google.code.gson:gson:2.8.5' -<<<<<<< HEAD + compile 'org.springframework.boot:spring-boot-starter-tomcat' compile 'org.springframework.boot:spring-boot-starter-security' compile 'org.springframework.boot:spring-boot-starter-actuator' compile 'org.springframework.boot:spring-boot-starter-aop' compile group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '1.2.0.RELEASE' -======= + compile group: 'org.springframework.security', name: 'spring-security-core', version: '5.1.4.RELEASE' ->>>>>>> develop + //JWT compile 'io.jsonwebtoken:jjwt-api:0.10.5' From 560e90b7606076b9665c075911e630ec2d41d5be Mon Sep 17 00:00:00 2001 From: Timo Volkmann Date: Mon, 8 Apr 2019 14:46:37 +0200 Subject: [PATCH 08/11] continued work on Cache and Station --- frontend/src/pages/Cache.vue | 39 +++++++++++++++++++++++++++++++- frontend/src/pages/Error404.vue | 2 +- frontend/src/pages/Login.vue | 4 ++-- frontend/src/pages/Overview.vue | 6 +++++ frontend/src/store/auth/state.js | 2 +- 5 files changed, 48 insertions(+), 5 deletions(-) diff --git a/frontend/src/pages/Cache.vue b/frontend/src/pages/Cache.vue index 513310e..6fee21b 100644 --- a/frontend/src/pages/Cache.vue +++ b/frontend/src/pages/Cache.vue @@ -14,6 +14,15 @@ label="Beschreibung" /> +

Stationen

@@ -26,12 +35,40 @@ - Beschreibung: Dies ist der Anfang der Beschreibung... + + Code: 123456 + + + + +
+ + +
+
+ + + + + 1 + + + + + + Beschreibung: + + + Dies ist der Anfang der Beschreibung... + + + Code: 123456 + diff --git a/frontend/src/pages/Error404.vue b/frontend/src/pages/Error404.vue index a091bac..75cff24 100644 --- a/frontend/src/pages/Error404.vue +++ b/frontend/src/pages/Error404.vue @@ -5,7 +5,7 @@

Sorry, nothing here...(404)

Go backZur Startseite diff --git a/frontend/src/pages/Login.vue b/frontend/src/pages/Login.vue index cb0e8cc..320019d 100644 --- a/frontend/src/pages/Login.vue +++ b/frontend/src/pages/Login.vue @@ -123,11 +123,11 @@ }) .then((response) => { console.log("GET/POST http://localhost:8080/api/logout/ - response: " + response.data); - localStorage.removeItem('userToken'); - this.evalAuthentication(); }) .catch((error) => { }); + localStorage.removeItem('userToken'); + this.evalAuthentication(); }, }, }; diff --git a/frontend/src/pages/Overview.vue b/frontend/src/pages/Overview.vue index 7560bed..019aac8 100644 --- a/frontend/src/pages/Overview.vue +++ b/frontend/src/pages/Overview.vue @@ -51,6 +51,9 @@
+
+ +
@@ -108,6 +111,9 @@ this.caches = response.data; }) }, + addCache() { + this.$router.push({ path: `/cache` }) + }, startCache(cacheID) { const userToken = JSON.parse(localStorage.getItem('userToken')); let params = { cacheID: cacheID }; diff --git a/frontend/src/store/auth/state.js b/frontend/src/store/auth/state.js index 0e9581a..1fee418 100644 --- a/frontend/src/store/auth/state.js +++ b/frontend/src/store/auth/state.js @@ -7,6 +7,6 @@ export default { email: "test@user.com", rankingPointsSum: 345, isAuthenticated: false, - isAdmin: false, + isAdmin: true, }, } From 2723c59056449b2d03f8e9fff40e950d750d83ce Mon Sep 17 00:00:00 2001 From: Timo Volkmann Date: Tue, 9 Apr 2019 03:41:05 +0200 Subject: [PATCH 09/11] changes in Cache & Station Editpages, worked on cacheCollector store --- frontend/src/pages/Cache.vue | 243 +++++++++++------- frontend/src/pages/Overview.vue | 13 +- frontend/src/pages/StationEdit.vue | 36 ++- frontend/src/router/routes.js | 18 +- frontend/src/store/auth/mutations.js | 1 - frontend/src/store/cacheCollector/getters.js | 12 +- .../src/store/cacheCollector/mutations.js | 57 +++- frontend/src/store/cacheCollector/state.js | 37 ++- 8 files changed, 307 insertions(+), 110 deletions(-) diff --git a/frontend/src/pages/Cache.vue b/frontend/src/pages/Cache.vue index 6fee21b..5d6b325 100644 --- a/frontend/src/pages/Cache.vue +++ b/frontend/src/pages/Cache.vue @@ -1,111 +1,182 @@ diff --git a/frontend/src/pages/Overview.vue b/frontend/src/pages/Overview.vue index 019aac8..f3b3353 100644 --- a/frontend/src/pages/Overview.vue +++ b/frontend/src/pages/Overview.vue @@ -45,8 +45,8 @@ - - + + @@ -114,6 +114,10 @@ addCache() { this.$router.push({ path: `/cache` }) }, + editCache() { + }, + removeCache() { + }, startCache(cacheID) { const userToken = JSON.parse(localStorage.getItem('userToken')); let params = { cacheID: cacheID }; @@ -124,8 +128,9 @@ this.$axios.get('http://localhost:8080/api/startCache', { params }) .then((response) => { - console.log("Angefangen: " + response.data); - let stationID = response.data.aktuelleStation.id; + console.log(response.data); + // let stationID = response.data.stationen[0].id; + let stationID = this.caches.find(x => x.id === cacheID).stationen[0].id; console.log(stationID); this.$router.push({ path: `/station/${stationID}` }) }) diff --git a/frontend/src/pages/StationEdit.vue b/frontend/src/pages/StationEdit.vue index 547869f..a8e413c 100644 --- a/frontend/src/pages/StationEdit.vue +++ b/frontend/src/pages/StationEdit.vue @@ -28,7 +28,7 @@
- +
@@ -36,13 +36,13 @@