#java #spring #security #thymeleaf
#java #spring #Безопасность #thymeleaf
Вопрос:
Я новичок в Thymeleaf, но раньше работал с JSP, так что это должен быть тот же принцип, о котором я думал.
Во всяком случае… Я пытаюсь собрать следующее руководство по безопасности Spring https://spring.io/guides/gs/securing-web /.
Он использует Thymeleaf для рендеринга страницы интерфейса, а следующая страница входа в систему не работает:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head>
<title>Spring Security Example </title>
</head>
<body>
<div th:if="${param.error}">
Invalid username and password.
</div>
<form th:action="@{/login.html}" method="post">
<div><label> User Name : <input type="text" name="username"/> </label></div>
<div><label> Password: <input type="password" name="password"/> </label></div>
<div><input type="submit" value="Sign In"/></div>
</form>
</body>
</body>
</html>
Затем у меня есть следующий класс конфигурации Spring security:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home", "/greeting").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/homepage.html", true)
.failureUrl("/login.html?error=true")
.permitAll()
.and()
.logout()
.permitAll();
}
@Bean
@Override
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
Страница с формой отображается просто отлично, но когда я предоставляю указанные выше учетные данные (пользователь / пароль), пользователь не входит в систему. Он в основном застревает в цикле, требующем входа в систему; существует homepage.html , но он никогда не перенаправляется на.
В журналах ничего нет, никаких ошибок или каких-либо сообщений.
Пытаясь ее отладить, я добавил следующий контроллер:
@Controller
@Slf4j
public class GreetingController {
@PostMapping("/login")
public String greeting(@RequestParam(name = "username", value = "xxx") String username, @RequestParam(name = "password", value = "yyy") String password, Model model) {
log.info("U " username " P " password);
model.addAttribute("username", username);
model.addAttribute("password", password);
return "login";
}
}
но при попытке вызвать http://localhost:8080/login
я получаю следующую ошибку:
There was an unexpected error (type=Method Not Allowed, status=405).
Request method 'GET' not supported
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported
Итак, попробовав все вышесказанное, я как бы застрял и не уверен, что попробовать дальше.
Как мне отладить такую страницу входа, чтобы узнать, что происходит? Кроме того, может ли кто-нибудь заметить какие-либо проблемы с кодом, который я предоставил выше до сих пор?
Комментарии:
1. Ваша форма должна публиковаться в
/login
not/login.html
, и у вас не должен быть контроллер, поскольку вход в систему обрабатывается Spring Security, а не вашим контроллером.2. Да, отлично, вы правы —
/login
работает, и мне не нужен контроллер.