Spring Security простая страница входа не может войти - PullRequest
0 голосов
/ 22 марта 2019

Итак, я пытаюсь создать простую страницу входа с помощью Spring Boot и Security. Так что у меня сейчас есть пользовательская страница входа и аутентификация в памяти с одним пользователем и ролью. Проблема в том, что при вводе правильного имени пользователя / пароля spirng не аутентифицирует его как действительные данные и снова перенаправляет меня на страницу входа, но на этот раз с: /login#error

На стороне клиента я использую тимилиф.

фрагмент формы:

<form th:action="@{/perform_login}" method="post">
    <input name="user" placeholder="Username" /> <br /> 
    <input name="pass" placeholder="Password" /> <br /> 
    <input type="submit" value="Login" />
</form>

Класс конфигурации:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()//
            .withUser("root").password("root").roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests() //
                .antMatchers("/").hasRole("USER") //
                .antMatchers("/login*").permitAll().and() //
                .formLogin() //
                .loginPage("/login")//
                .loginProcessingUrl("/perform_login")//
                .and()//
                .logout()//
                .permitAll();
    }

}

А контроллер прост

@Controller
@RequestMapping("/login")
public class LoginController {

    @GetMapping
    public String getLoginPage() {
        return "login";
    }
}

Есть идеи, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Самый простой способ (для меня) - сделать @Bean, использовать WebSecurityConfigurerAdapter и внедрить WebMvcConfigurer для настройки всего за несколько шагов. Это самый маленький пример из когда-либо сделанных:

@Configuration
@SpringBootApplication
public class DemoApplication implements WebMvcConfigurer {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Controller
    public class HomeController {

        @RequestMapping(value = "/", method = RequestMethod.GET)
        public String home(Model model, Authentication authentication, Principal principal) {
            if (authentication == null) {
                return "forward:/login";
            } else {
                model.addAttribute("user", principal.getName());
                return "home";
            }
        }
    }

    @Bean
    public WebSecurityConfigurerAdapter webSecurityConfig() {
        return new WebSecurityConfigurerAdapter() {
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http.csrf().disable().authorizeRequests()
                        .anyRequest().authenticated()
                        .and().formLogin().loginPage("/login")
                        .defaultSuccessUrl("/")
                        .permitAll()
                        .and().logout().permitAll();
                http.headers().frameOptions().disable();
            }

            @Override
            protected void configure(AuthenticationManagerBuilder builder) throws Exception {
                builder.authenticationProvider(new AuthenticationProvider() {
                    @Override
                    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
                        String username = authentication.getName();
                        String password = authentication.getCredentials().toString();
                        if (username.equals("username") && password.equals("password")) {
                            List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
                            grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_USER"));
                            return new UsernamePasswordAuthenticationToken(username, password, grantedAuthorities);
                        }
                        throw new AuthenticationServiceException("Invalid credentials.");
                    }

                    @Override
                    public boolean supports(Class<?> authentication) {
                        return authentication.equals(UsernamePasswordAuthenticationToken.class);
                    }
                });
            }
        };
    }

    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/login").setViewName("login");
    }
}

Вы сказали, что используете thymeleaf, поэтому допустим, что ваша форма login.html будет выглядеть примерно так:

<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>login example</title>
</head>
<body>
<form th:action="@{/login}" method="post">
    <input name="username" placeholder="Username"/> <br/>
    <input name="password" placeholder="Password"/> <br/>
    <input type="submit" value="Login"/>
</form>
</body>
</html>

И страница home.html, когда вы вошли в систему:

<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>home page</title>
</head>
<body>
Hello, <span th:text="${user}"></span><br>
<a href="/logout"> sign out</a>
</body>
</html>
0 голосов
/ 22 марта 2019

Я считаю, что функция конфигурации неверна. Если вы посмотрите на этот учебник , это должно помочь.

Глядя на ваш код, я считаю, что есть несколько проблем:

  1. Страницы, которые вы разрешаете аутентифицированным пользователям, выглядят неправильно. Попробуйте изменить:
.antMatchers("/").hasRole("USER") //

до:

.antMatchers("/**").hasRole("USER") //

Это означает, что пользователь, прошедший аутентификацию с ролью «ПОЛЬЗОВАТЕЛЬ», может получить доступ к любой странице. В вашем примере доступен только корень сайта.

  1. Вы должны кодировать пароли, которые вы устанавливаете.

Из упомянутого выше учебника взято следующее:

.withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER")

Возможно, я что-то пропустил, поэтому, пожалуйста, посмотрите учебник. Это хорошо сработало, когда я впервые попробовал настроить Spring Security в прошлом году.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...