diff --git a/src/main/java/com/wmi/lti/config/MvcConfig.java b/src/main/java/com/wmi/lti/config/MvcConfig.java index e200aba..61d95d5 100644 --- a/src/main/java/com/wmi/lti/config/MvcConfig.java +++ b/src/main/java/com/wmi/lti/config/MvcConfig.java @@ -8,9 +8,11 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; public class MvcConfig implements WebMvcConfigurer { public void addViewControllers(ViewControllerRegistry registry) { - registry.addViewController("/home").setViewName("home"); - registry.addViewController("/").setViewName("home"); + registry.addViewController("/addCourse").setViewName("addCourse"); + registry.addViewController("/").setViewName("start"); registry.addViewController("/login").setViewName("login"); + registry.addViewController("/start").setViewName("start"); + registry.addViewController("/register").setViewName("register"); } } diff --git a/src/main/java/com/wmi/lti/config/WebSecurityConfig.java b/src/main/java/com/wmi/lti/config/WebSecurityConfig.java index 6b1bd91..2882b8a 100644 --- a/src/main/java/com/wmi/lti/config/WebSecurityConfig.java +++ b/src/main/java/com/wmi/lti/config/WebSecurityConfig.java @@ -1,23 +1,43 @@ package com.wmi.lti.config; +import com.wmi.lti.model.user.MyUserDetailsService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +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.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; @Configuration @EnableWebSecurity +@ComponentScan public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + + @Autowired + public void configAuthentication(final AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService()).passwordEncoder(new BCryptPasswordEncoder()); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() - .antMatchers("/", "/home").permitAll() + .antMatchers( "/courses/**").authenticated() + .antMatchers("/", "/register").permitAll() .antMatchers("/", "/start").authenticated() //.anyRequest().authenticated() .and() @@ -34,13 +54,14 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Bean @Override public UserDetailsService userDetailsService() { - UserDetails user = + /* UserDetails user = User.withDefaultPasswordEncoder() .username("adrianw") .password("eduserwis1245") .roles("USER") .build(); - - return new InMemoryUserDetailsManager(user); + */ + return new MyUserDetailsService() { + }; } } diff --git a/src/main/java/com/wmi/lti/controllers/CourseController.java b/src/main/java/com/wmi/lti/controllers/CourseController.java new file mode 100644 index 0000000..a5058de --- /dev/null +++ b/src/main/java/com/wmi/lti/controllers/CourseController.java @@ -0,0 +1,52 @@ +package com.wmi.lti.controllers; + +import com.wmi.lti.model.course.Course; +import com.wmi.lti.model.course.CourseRepository; +import com.wmi.lti.model.user.UserPrincipal; +import org.imsglobal.lti.launch.LtiOauthSigner; +import org.imsglobal.lti.launch.LtiSigner; +import org.imsglobal.lti.launch.LtiSigningException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.HashMap; +import java.util.Map; + +@Controller +public class CourseController { + + @Autowired + private CourseRepository courseRepository; + + @GetMapping("/courses") + public String listCourses() { + + //model.addAttribute("message", name); + + return "start"; //view + } + + @GetMapping("/addCourse") + public String addCourseView() { + return "addCourse"; //view + } + + @PostMapping("") + public String addCourse( + @RequestParam(name = "key", required = false, defaultValue = "") + String key, @RequestParam(name = "secret", required = false, defaultValue = "") + String secret, @RequestParam(name = "url", required = false, defaultValue = "") + String url, @RequestParam(name = "name", required = false, defaultValue = "") + String name, Model model) { + + courseRepository.save(new Course(null, name, url, key, secret)); + return "start"; //view + + } + +} diff --git a/src/main/java/com/wmi/lti/controllers/HomeController.java b/src/main/java/com/wmi/lti/controllers/HomeController.java deleted file mode 100644 index b53dfea..0000000 --- a/src/main/java/com/wmi/lti/controllers/HomeController.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.wmi.lti.controllers; - -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -@Controller -public class HomeController { - - @GetMapping("/home") - public String home( - @RequestParam(name = "name", required = false, defaultValue = "") - String name, Model model) { - - //model.addAttribute("message", name); - - return "home"; //view - } -} diff --git a/src/main/java/com/wmi/lti/controllers/StartController.java b/src/main/java/com/wmi/lti/controllers/StartController.java index 3efe149..6fd7f83 100644 --- a/src/main/java/com/wmi/lti/controllers/StartController.java +++ b/src/main/java/com/wmi/lti/controllers/StartController.java @@ -1,17 +1,15 @@ package com.wmi.lti.controllers; +import com.wmi.lti.model.user.UserPrincipal; import org.imsglobal.lti.launch.LtiOauthSigner; import org.imsglobal.lti.launch.LtiSigner; import org.imsglobal.lti.launch.LtiSigningException; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; -import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; @@ -29,7 +27,7 @@ public class StartController { Map parameters = new HashMap<>(); parameters.put("lti_message_type","basic-lti-launch-request"); parameters.put("lti_version", "LTI-1p0"); - parameters.put("resource_link_id", ((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUsername()); + parameters.put("resource_link_id", ((UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUsername()); try { Map signedParameters = signer.signParameters(parameters, key, secret, url, "POST"); String link = url + "?" + "oauth_nonce=" + signedParameters.get("oauth_nonce") + "&oauth_signature=" + signedParameters.get("oauth_signature") + "&oauth_consumer_key=" + signedParameters.get("oauth_consumer_key") + "&oauth_signature_method=" + signedParameters.get("oauth_signature_method") + "&oauth_timestamp=" + signedParameters.get("oauth_timestamp") + "&oauth_version=" + signedParameters.get("oauth_version") + "<i_message_type=" + signedParameters.get("lti_message_type") + "<i_version=" + signedParameters.get("lti_version") + "&resource_link_id=" + signedParameters.get("resource_link_id"); diff --git a/src/main/java/com/wmi/lti/controllers/UserController.java b/src/main/java/com/wmi/lti/controllers/UserController.java new file mode 100644 index 0000000..583279e --- /dev/null +++ b/src/main/java/com/wmi/lti/controllers/UserController.java @@ -0,0 +1,38 @@ +package com.wmi.lti.controllers; + +import com.wmi.lti.model.user.User; +import com.wmi.lti.model.user.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@Controller +@RequestMapping("/users") +public class UserController { + + @Autowired + private UserRepository userRepository; + + @Autowired + private PasswordEncoder passwordEncoder; + + @PostMapping("") + public String create(@RequestParam String username, @RequestParam String password, Model model) { + User user = new User(); + user.setUsername(username); + user.setPassword(passwordEncoder.encode(password)); + userRepository.save(user); + return "login"; + } + + @GetMapping("/register") + public String getRegisterView() { + return "register"; + } +} diff --git a/src/main/java/com/wmi/lti/model/course/Course.java b/src/main/java/com/wmi/lti/model/course/Course.java new file mode 100644 index 0000000..fda94b0 --- /dev/null +++ b/src/main/java/com/wmi/lti/model/course/Course.java @@ -0,0 +1,38 @@ +package com.wmi.lti.model.course; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +@AllArgsConstructor +public class Course { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Getter + @Setter + private Long id; + + @Getter + @Setter + private String name; + + @Getter + @Setter + private String url; + + @Getter + @Setter + private String course_key; + + @Getter + @Setter + private String secret; + +} diff --git a/src/main/java/com/wmi/lti/model/course/CourseRepository.java b/src/main/java/com/wmi/lti/model/course/CourseRepository.java new file mode 100644 index 0000000..c56d0e4 --- /dev/null +++ b/src/main/java/com/wmi/lti/model/course/CourseRepository.java @@ -0,0 +1,9 @@ +package com.wmi.lti.model.course; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CourseRepository extends JpaRepository { + + + +} diff --git a/src/main/java/com/wmi/lti/model/user/MyUserDetailsService.java b/src/main/java/com/wmi/lti/model/user/MyUserDetailsService.java new file mode 100644 index 0000000..6e1785b --- /dev/null +++ b/src/main/java/com/wmi/lti/model/user/MyUserDetailsService.java @@ -0,0 +1,24 @@ +package com.wmi.lti.model.user; + +import org.springframework.beans.factory.annotation.Autowired; +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; + +@Service +public class MyUserDetailsService implements UserDetailsService { + + @Autowired + private UserRepository userRepository; + + @Override + public UserDetails loadUserByUsername(String username) { + User user = userRepository.findByUsername(username); + if (user == null) { + throw new UsernameNotFoundException(username); + } + return new UserPrincipal(user); + } + +} diff --git a/src/main/java/com/wmi/lti/model/user/User.java b/src/main/java/com/wmi/lti/model/user/User.java new file mode 100644 index 0000000..2d7e053 --- /dev/null +++ b/src/main/java/com/wmi/lti/model/user/User.java @@ -0,0 +1,26 @@ +package com.wmi.lti.model.user; + +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.*; + +@Entity +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Getter + @Setter + private Long id; + + @Getter + @Setter + @Column(nullable = false, unique = true) + private String username; + + @Getter + @Setter + private String password; + +} diff --git a/src/main/java/com/wmi/lti/model/user/UserPrincipal.java b/src/main/java/com/wmi/lti/model/user/UserPrincipal.java new file mode 100644 index 0000000..7b2f284 --- /dev/null +++ b/src/main/java/com/wmi/lti/model/user/UserPrincipal.java @@ -0,0 +1,49 @@ +package com.wmi.lti.model.user; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Collection; + +public class UserPrincipal implements UserDetails { + private User user; + + public UserPrincipal(User user) { + this.user = user; + } + + @Override + public Collection getAuthorities() { + return null; + } + + @Override + public String getPassword() { + return user.getPassword(); + } + + @Override + public String getUsername() { + return user.getUsername(); + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/wmi/lti/model/user/UserRepository.java b/src/main/java/com/wmi/lti/model/user/UserRepository.java new file mode 100644 index 0000000..f7a5111 --- /dev/null +++ b/src/main/java/com/wmi/lti/model/user/UserRepository.java @@ -0,0 +1,9 @@ +package com.wmi.lti.model.user; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { + + User findByUsername(String username); + +} diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/addCourse.html similarity index 83% rename from src/main/resources/templates/home.html rename to src/main/resources/templates/addCourse.html index d1b8ecf..4946d2e 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/templates/addCourse.html @@ -10,10 +10,11 @@ This is tool consumer for LTI
-
+
+
diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html index 87b744c..17f4d29 100644 --- a/src/main/resources/templates/login.html +++ b/src/main/resources/templates/login.html @@ -16,5 +16,9 @@
+ +
+
+
\ No newline at end of file diff --git a/src/main/resources/templates/register.html b/src/main/resources/templates/register.html new file mode 100644 index 0000000..a057321 --- /dev/null +++ b/src/main/resources/templates/register.html @@ -0,0 +1,18 @@ + + + + + + + LTI start + + + + +
+
+
+
+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/start.html b/src/main/resources/templates/start.html index a039a71..1ce7daf 100644 --- a/src/main/resources/templates/start.html +++ b/src/main/resources/templates/start.html @@ -12,5 +12,9 @@
Launch Tool
+


+
+
+
\ No newline at end of file