У меня есть фундаментальная проблема с приложением весенней загрузки. Начальная веб-страница http://127.0.0.1:8080/login и после входа в систему пользователь перенаправляется http://127.0.0.1:8080/MainMenu. К сожалению, также можно написать в строке URL http://127.0.0.1:8080/MainMenu и иду туда без аутентификации. Какова основная идея заблокировать это действие?

@edit Это моя конфигурация:

 package local.vlex.security;

import org.springframework.context.annotation.Configuration;
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.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "src/main/resources/static/assets/css/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
}

И контроллер:

@GetMapping("/MainMenu")
    public ModelAndView correctCredentials(){
        ModelAndView mav = new ModelAndView();
        mav.setViewName("MainMenu");
        return mav;
    }

Подводя итог: я хотел бы заблокировать переход на другие сайты без аутентификации - если кто-то не вошел в систему, то он должен перейти 404 на все, кроме / login

1
Michu93 8 Сен 2017 в 13:49

3 ответа

Лучший ответ

если кто-то не вошел в систему, он должен перейти 404 на все, кроме / login

Это немного особенное требование. Обычно делается то, что люди перенаправляются на страницу входа по всем другим URL-адресам, кроме входа в систему, или получают 401 Unauthorized или 403 Forbidden. Тем не менее, это не сложно сделать это тоже.

Вы упомянули, что вам нужны ваши статические ресурсы (css, js, images) и в каталоге assets, поэтому, учитывая, что это должно работать:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.WebSecurityConfigurerAdapter;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.authentication.HttpStatusEntryPoint;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Configuration
@EnableWebSecurity
public class YourSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/login", "/assets/**").permitAll()
                .anyRequest().authenticated()
            .and()
                .exceptionHandling()
                .authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.NOT_FOUND))
                ;
    }
}

С помощью

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
</parent>

И

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

В Maven pom.xml

Обратите внимание, что есть также accessDeniedHandler () в exceptionHandling (), но, похоже, он срабатывает только тогда, когда пользователь уже аутентифицирован, но ему отказано в доступе, поэтому вам потребуется точка входа для аутентификации для вашего варианта использования.


Дополнение :

Иногда наличие пользовательской точки входа аутентификации портит существующий обработчик точки входа. Это имеет место по крайней мере, если вы используете стандартную сгенерированную форму входа в систему. Один из способов обойти это - указать точку входа, которая соответствует только URL-адресам, которые не соответствуют URL-адресу вашего обработчика аутентификации, например:

import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.util.matcher.NegatedRequestMatcher;

// snip...

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
                .antMatchers("/login", "/assets/**").permitAll()
                .anyRequest().authenticated()
            .and()
                .exceptionHandling()
                .defaultAuthenticationEntryPointFor(new HttpStatusEntryPoint(HttpStatus.NOT_FOUND),
                        new NegatedRequestMatcher(new AntPathRequestMatcher("/login")) )
            .and()
                .formLogin()
            ;
}
2
eis 18 Сен 2017 в 11:17

Добавьте следующий код, он заблокирует все запросы, кроме "/" & "/ login"

  @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter{

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .antMatchers("/").permitAll()
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/login")
                    .permitAll()
                    .and()
                .logout()
                    .permitAll();
        }

       @Override
      public void configure(WebSecurity web) throws Exception {
            web
            .ignoring()
            .antMatchers(
                    "/css/**",
                    "/js/**",
                    "/lib/**",
                    "/video/**",
                    "/images/**"
            );
       }

    }

И добавить веб-конфигурацию

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter{


    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry
                .addResourceHandler("/**")
                .addResourceLocations("classpath:/static/")
                .setCachePeriod(31556926)
                .resourceChain(true);
    }
}

Не забудьте добавить зависимость безопасности в ваш файл pom.xml.

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
 </dependency>
1
maruf571 8 Сен 2017 в 12:57

При условии, что у вас есть зависимости Spring-Security от classpath, это рабочий пример из моего кода.

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/", "/login**")
                .permitAll()
            .anyRequest()
                .authenticated();

Это блокирует меня от любых других запросов, кроме '/' или 'login', 'loginPage' и т. Д. С авторизацией.

Следуйте этому, игнорируя статические, CSS, JS и т. Д.,

Если это все еще не работает, сейчас попробуйте поработать над блокировкой одной страницы:

http.authorizeRequests()
                .antMatchers("/MainMenu")
                .authenticated();

Вышесказанное даст представление о том, что происходит. Проблема зависимости или что-то в этом роде.

1
Karthik R 18 Сен 2017 в 08:25