Как отобразить только страницу, если в URL указаны определенные параметры? - PullRequest
0 голосов
/ 29 мая 2019

Я хочу создать страницу в Spring с URL-адресом

http://myapp.com/sign-in?email=myemail@provider.com&pw=password

password - это одноразовый пароль, который пользователь получает по электронной почте каждый раз, когда он хочет войти.

Каждый раз, когда пользователь посещает эту страницу, я хочу, чтобы произошли две вещи:

  1. Проверьте правильность предоставленных учетных данных.
  2. Если это так, отобразите HTML-содержимое страницы.

Я сделал первую часть:

    @Autowired
    private var userRepository: UserRepository? = null

    @GetMapping
    fun signIn(@RequestParam email:String, @RequestParam(name="pw") password:String): RedirectView {
        // Is the password correct?

        // TODO: Read password hash of the user
        val existingUser: Optional<UserInfo>? = userRepository?.findById(email)
        if (existingUser == null) {
            return redirectToErrorPage("Please register with your e-mail address first")
        }
        if (!existingUser.isPresent) {
            return redirectToErrorPage("Please register with your e-mail address first")
        }
        val hashInDb = existingUser.get().passwordHash
        val hashInParam = PasswordHashCalculator.calculateHash(password)
        if (!hashInDb.equals(hashInParam)) {
            return redirectToErrorPage("Invalid user name and/or password")
        }

        // TODO: Display the main page
        return null
    }

Как мне нужно изменить код для отображения главной страницы (файл HTML в src/main/resources/static), но только если пройдены проверки подлинности?

Обновление 1: Использование return ClassPathResource("main.html") в соответствии с рекомендациями здесь не помогло.

Ответы [ 3 ]

2 голосов
/ 31 мая 2019
return ClassPathResource("static/main.html") should answer your question, don't forget to specify `static` folder at the beginning as `ClassPathResource` points to the `resources` folder
0 голосов
/ 29 мая 2019

@ RobScully прав, вы не должны обращаться с такой авторизацией.Что вы можете сделать, это включить Spring-Security и использовать аннотации Spring Spring для управления этим сценарием.Используйте следующие зависимости и настройте базовую настройку безопасности пружины.

Аннотации, такие как @PreAuthorize(), могут затем использоваться для проверки привилегий пользователя перед выполнением метода.Вы можете даже добавить эту аннотацию к методам контроллера для проверки перед обработкой каждого запроса, если вы настаиваете.

Вы можете настроить и сервер LDAP или Oauth или даже использовать база данных дляаутентификация (если вы работаете над демо или чем-то подобным).

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>${spring-security.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>${spring-security.version}</version>
        </dependency>

Используйте класс конфигурации, подобный приведенному ниже, для настройки безопасности:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    DataSource dataSource;

    @Autowired
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {

      auth.jdbcAuthentication().dataSource(dataSource)
        .usersByUsernameQuery(
            "select username,password, enabled from users where username=?")
        .authoritiesByUsernameQuery(
            "select username, role from user_roles where username=?");
    }   

    @Override
    protected void configure(HttpSecurity http) throws Exception {

      http.authorizeRequests()
        .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") //To check admin role permission
        .and()
          .formLogin().loginPage("/login").failureUrl("/login?error") //provide failure url
          .usernameParameter("username").passwordParameter("password")
        .and()
          .logout().logoutSuccessUrl("/login?logout") 
        .and()
          .exceptionHandling().accessDeniedPage("/403")
        .and()
        .csrf();
    }
}

Этот пример проекта в github дает базовую настройкугде вы можете использовать пружинную защиту:

https://github.com/mohchi/spring-security-request-mapping

Справочное использование: https://www.mkyong.com/spring-security/spring-security-form-login-using-database/

0 голосов
/ 29 мая 2019

Вы не должны делать свою безопасность таким образом.Не рекомендуется отправлять пароль в виде открытого текста по http.

Здесь приведены примеры базовой аутентификации с пружинной защитой.

https://www.baeldung.com/spring-security-basic-authentication

https://www.baeldung.com/securing-a-restful-web-service-with-spring-security

Что вы можете сделать, так это, если вы будете следовать этому руководству, назначить пользователя в памяти для начинающих.Затем вы можете Base64 закодировать ваши данные аутентификации для пользователя.Затем для каждого пользователя вы можете отправить детали аутентификации, и никто не сможет отследить имя пользователя и пароль, когда они передаются по проводам, и ваш запрос обрабатывается до того, как он достигнет вашего контроллера.Таким образом, вы можете отделить свою бизнес-логику от вашей аутентификации.

Это, по крайней мере, начало.Надеюсь, это поможет.

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