Removed test controller, added login controller, and authentication
Only a temporary authentication is set up at the moment.
This commit is contained in:
parent
643124f242
commit
b02b3faa57
|
@ -1,41 +1,68 @@
|
||||||
package nl.andrewlalis.teaching_assistant_assistant.config;
|
package nl.andrewlalis.teaching_assistant_assistant.config;
|
||||||
|
|
||||||
|
import nl.andrewlalis.teaching_assistant_assistant.model.security.UserDetailsService;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
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.builders.HttpSecurity;
|
||||||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
||||||
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
|
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
|
||||||
import org.springframework.security.core.userdetails.User;
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
import org.springframework.security.core.userdetails.UserDetailsService;
|
|
||||||
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@EnableWebSecurity
|
@EnableWebSecurity
|
||||||
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
||||||
|
|
||||||
@Override
|
private UserDetailsService userDetailsService;
|
||||||
protected void configure(HttpSecurity http) throws Exception {
|
|
||||||
http.authorizeRequests()
|
protected WebSecurityConfig(UserDetailsService userDetailsService) {
|
||||||
.antMatchers("/").permitAll()
|
this.userDetailsService = userDetailsService;
|
||||||
.anyRequest().authenticated()
|
|
||||||
.and()
|
|
||||||
.authorizeRequests()
|
|
||||||
.antMatchers("/resources/**").permitAll().anyRequest().permitAll()
|
|
||||||
.and()
|
|
||||||
.formLogin()
|
|
||||||
.loginPage("/login")
|
|
||||||
.permitAll()
|
|
||||||
.and()
|
|
||||||
.logout()
|
|
||||||
.permitAll();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public UserDetailsService userDetailsService () {
|
@Override
|
||||||
UserDetails user = User.withDefaultPasswordEncoder()
|
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
|
||||||
.username("andrewlalis")
|
auth.inMemoryAuthentication()
|
||||||
.password("test")
|
.withUser("tester")
|
||||||
.roles("USER")
|
.password(passwordEncoder().encode("tester"))
|
||||||
.build();
|
.roles("USER");
|
||||||
return new InMemoryUserDetailsManager(user);
|
auth.userDetailsService(this.userDetailsService);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure(final HttpSecurity http) throws Exception {
|
||||||
|
http
|
||||||
|
.csrf().disable() // So that we can GET the logout page.
|
||||||
|
|
||||||
|
.authorizeRequests() // Let anyone view the login and logout pages.
|
||||||
|
.antMatchers("/login*", "/logout*")
|
||||||
|
.permitAll()
|
||||||
|
.anyRequest()
|
||||||
|
.authenticated()
|
||||||
|
.and()
|
||||||
|
|
||||||
|
.authorizeRequests() // Only logged in users should be able to see site content.
|
||||||
|
.antMatchers("/**")
|
||||||
|
.hasRole("USER")
|
||||||
|
.and()
|
||||||
|
|
||||||
|
.formLogin()
|
||||||
|
.loginPage("/login")
|
||||||
|
.loginProcessingUrl("/login")
|
||||||
|
.defaultSuccessUrl("/", true)
|
||||||
|
.failureUrl("/login?error")
|
||||||
|
.and()
|
||||||
|
|
||||||
|
.logout()
|
||||||
|
.clearAuthentication(true)
|
||||||
|
.invalidateHttpSession(true)
|
||||||
|
.logoutUrl("/logout")
|
||||||
|
.logoutSuccessUrl("/login")
|
||||||
|
.deleteCookies("JSESSIONID");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public PasswordEncoder passwordEncoder() {
|
||||||
|
return new BCryptPasswordEncoder();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
package nl.andrewlalis.teaching_assistant_assistant.controllers;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller for the login page, visible to all users.
|
||||||
|
*/
|
||||||
|
@Controller
|
||||||
|
public class LoginController {
|
||||||
|
|
||||||
|
private final Logger logger = LogManager.getLogger(LoginController.class);
|
||||||
|
|
||||||
|
@GetMapping("/login")
|
||||||
|
public String get() {
|
||||||
|
logger.info("User got login page.");
|
||||||
|
|
||||||
|
return "login";
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,17 +0,0 @@
|
||||||
package nl.andrewlalis.teaching_assistant_assistant.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 TestController {
|
|
||||||
|
|
||||||
@GetMapping("/test")
|
|
||||||
public String test (@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
|
|
||||||
model.addAttribute("name", name);
|
|
||||||
return "test";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -3,9 +3,11 @@ package nl.andrewlalis.teaching_assistant_assistant.model.security;
|
||||||
import nl.andrewlalis.teaching_assistant_assistant.model.repositories.UserRepository;
|
import nl.andrewlalis.teaching_assistant_assistant.model.repositories.UserRepository;
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Service
|
||||||
public class UserDetailsService implements org.springframework.security.core.userdetails.UserDetailsService {
|
public class UserDetailsService implements org.springframework.security.core.userdetails.UserDetailsService {
|
||||||
|
|
||||||
private UserRepository userRepository;
|
private UserRepository userRepository;
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
<li><a href="/courses" th:href="@{/courses}">Courses</a>
|
<li><a href="/courses" th:href="@{/courses}">Courses</a>
|
||||||
<li><a href="/students" th:href="@{/students}">Students</a></li>
|
<li><a href="/students" th:href="@{/students}">Students</a></li>
|
||||||
<li><a href="/teaching_assistants" th:href="@{/teaching_assistants}">Teaching Assistants</a></li>
|
<li><a href="/teaching_assistants" th:href="@{/teaching_assistants}">Teaching Assistants</a></li>
|
||||||
|
<li><a href="/logout" th:href="@{/logout}">Log Out</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html xmlns:th="http://www.thymeleaf.org" th:replace="~{layouts/basic_page :: layout (~{::title}, ~{::#content}, ~{::#sidebar})}">
|
<html xmlns:th="http://www.thymeleaf.org" th:replace="~{layouts/basic_page :: layout (~{::title}, ~{::#content}, ~{::#sidebar})}" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<title>Homepage</title>
|
<title>Homepage</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org" lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Login</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div th:if="${param.error}">
|
||||||
|
Invalid username or password!
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div th:if="${param.logout}">
|
||||||
|
You have been logged out!
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form th:action="@{/login}" method="post">
|
||||||
|
<label>Username: <input type="text" name="username"/></label>
|
||||||
|
<label>Password: <input type="password" name="password"/></label>
|
||||||
|
<button type="submit">Login</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -1,12 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en" xmlns:th="http://www.thymeleaf.org">
|
|
||||||
<head>
|
|
||||||
<title>Test Controller Page</title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<p th:text="'Hello, ' + ${name} + '!'"></p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
Loading…
Reference in New Issue