Не могу вернуть login.html - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь использовать thymleaf с spring.Но мне не удалось вернуть свой login.html при переходе на /login.

Это мой контроллер:

@GetMapping("/login")
public String login() {
    return "/login";//i also tried return "login" or "login.html
}

Это конфигурация безопасности:

@EnableWebSecurity
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Autowired
    protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {


        auth
                .inMemoryAuthentication()
                .withUser("user").password(passwordEncoder().encode("password")).roles("USER")
                .and()
                .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
    }

    @Override//when I comment those method, it works
    protected void configure(HttpSecurity http) throws Exception {
        http
//                .csrf().disable()//i also enabled this but still same
                .authorizeRequests()
                .antMatchers("/", "/home", "/about").permitAll()
                .antMatchers("/admin/**").hasAnyRole("ADMIN")
                .antMatchers("/user/**").hasAnyRole("USER")
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
                .logout()
                .permitAll();
    }

это login.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
>
<head>
    <title>Spring Security Example </title>
</head>
<body>


<div class="container">

    <div class="row" style="margin-top:20px">
        <div class="col-xs-12 col-sm-8 col-md-6 col-sm-offset-2 col-md-offset-3">
            <form th:action="@{/login}" method="post">
                <fieldset>
                    <h1>Please Sign In</h1>

                    <div th:if="${param.error}">
                        <div class="alert alert-danger">
                            Invalid username and password.
                        </div>
                    </div>
                    <div th:if="${param.logout}">
                        <div class="alert alert-info">
                            You have been logged out.
                        </div>
                    </div>

                    <div class="form-group">
                        <input type="text" name="username" id="username" class="form-control input-lg"
                               placeholder="UserName" required="true" autofocus="true"/>
                    </div>
                    <div class="form-group">
                        <input type="password" name="password" id="password" class="form-control input-lg"
                               placeholder="Password" required="true"/>
                    </div>

                    <div class="row">
                        <div class="col-xs-6 col-sm-6 col-md-6">
                            <input type="submit" class="btn btn-lg btn-primary btn-block" value="Sign In"/>
                        </div>
                        <div class="col-xs-6 col-sm-6 col-md-6">
                        </div>
                    </div>
                </fieldset>
            </form>
        </div>
    </div>

</div>


</body>
</html>

Я написал в коде как комментарий.

Когда я отключаю метод:

protected void configure(HttpSecurity http) throws Exception {

я могу перейти настраница входа в систему.

Но без отключения я могу видеть строку как login только когда захожу на http://localhost:8080/login

Ответы [ 3 ]

1 голос
/ 19 июня 2019

Как выяснилось из комментариев;Вам нужно пометить ваш контроллер с @Controller вместо @RestController.Это скажет весне, чтобы вернуть представление.

Тогда return: "login"; и тебе должно быть хорошо.

Убедитесь, что ваши html-страницы находятся в src / main / resources или src / main / resources / templates.

Я не знаю, будет ли это иметь значение, но в вашем securityConfig после.loginPage("login") добавить .loginProcessingUrl("/login") и .defaultSuccessUrl("/home", true); возможно..permitAll() не обязательно, я думаю.

0 голосов
/ 19 июня 2019

То, что на самом деле происходит в protected void configure(HttpSecurity http), - это когда пользователь пытается получить доступ к URL-адресам с помощью этих шаблонов ("/user/**") , ("/admin/**") (которые вы упомянули в методе настройки выше), метод проверяет, есть ли у пользователя необходимые полномочия для доступа к этому.конкретный URL.В вашем случае для доступа к ("/admin/**") он / она должен иметь роль администратора.Если текущий пользователь пытается получить доступ к этому URL-адресу ("/admin/**"), у которого есть роль администратора, он будет перенаправлен на нужную страницу.В случае, если у пользователя нет прав администратора, он будет перенаправлен на вашу страницу входа, которая описывается с использованием .formLogin().loginPage("/login") в вашем методе.Следовательно, если вы хотите получить доступ к странице входа с существующим кодом, вам придется изменить шаблон URL в контроллере @GetMapping("/login") на один из этих шаблонов ("/user/**") , ("/admin/**").Выше приведена причина, по которой ваш код работает нормально при комментировании protected void configure(HttpSecurity http).

0 голосов
/ 19 июня 2019

Вы должны настроить свой шаблонизатор

Пример конфигурации компонента:

    @Bean
public SpringResourceTemplateResolver templateResolver(){
    // SpringResourceTemplateResolver automatically integrates with Spring's own
    // resource resolution infrastructure, which is highly recommended.
    SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
    templateResolver.setApplicationContext(this.applicationContext);
    templateResolver.setPrefix("/WEB-INF/templates/");
    templateResolver.setSuffix(".html");
    // HTML is the default value, added here for the sake of clarity.
    templateResolver.setTemplateMode(TemplateMode.HTML);
    // Template cache is true by default. Set to false if you want
    // templates to be automatically updated when modified.
    templateResolver.setCacheable(true);
    return templateResolver;
}

@Bean
public SpringTemplateEngine templateEngine(){
    // SpringTemplateEngine automatically applies SpringStandardDialect and
    // enables Spring's own MessageSource message resolution mechanisms.
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResolver(templateResolver());
    // Enabling the SpringEL compiler with Spring 4.2.4 or newer can
    // speed up execution in most scenarios, but might be incompatible
    // with specific cases when expressions in one template are reused
    // across different data types, so this flag is "false" by default
    // for safer backwards compatibility.
    templateEngine.setEnableSpringELCompiler(true);
    return templateEngine;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...