Spring Security HTTP Status 403 - Доступ запрещен - PullRequest
1 голос
/ 25 сентября 2019

Вход успешен, но весенний URL-адрес блокировки безопасности, даже если я получил доступ к USER .Как я могу управлять этой вещью?

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth)
            throws Exception {
        auth.inMemoryAuthentication().withUser("sahil").password("123")
                .roles("ADMIN","USER");
    }

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

        http.authorizeRequests()
        .antMatchers("/login").permitAll()
        .antMatchers("/welcome","/inventory/**","/sales/**").access("hasRole('USER')")
        .and()
        .csrf().disable();
    }

LoginController.java

    @Controller
public class LoginController {

    @RequestMapping(value = { "/", "/login" }, method = RequestMethod.GET)
    public String showLoginPage() {
        return "login";
    }

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String handleUserLogin(ModelMap model, @RequestParam String name, @RequestParam String password) {
        if (!service.validateUser(name, password)) {
            model.put("errorMsg", "Invalid Credential");
            return "login";
        }
        System.out.println("principal : " + getLoggedInUserName());
        model.put("name", name);
        model.put("password", password);
        return "welcome";
    }

    private String getLoggedInUserName() {

        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

        if (principal instanceof UserDetails) {
            System.out.println("in if");
          return  ((UserDetails)principal).getUsername();

        } else {
            System.out.println("in else");
         return principal.toString();

        }
    }

    @RequestMapping(value = "/welcome", method = RequestMethod.GET)
    public String showWelcomeDashboard() {
        return "welcome";
    }
}

1. После успешной регистрации страница перенаправляется на страницу приветствияно URL все еще localhost: 8080 / логин вместо localhost: 8080 / welcome .

welcome dashboard

2. После перенаправления на URL localhost: 8080 / sales is 403 Доступ запрещен.

sales page

1 Ответ

2 голосов
/ 26 сентября 2019

Что такое защита Spring
Безопасность Spring полностью связана с аутентификацией и авторизацией, в вашем случае вы пропускаете аутентификацию.В вашей конфигурации безопасности нет конфигурации аутентификации.Чего вам не хватает, так это фильтра аутентификации для вашей весенней безопасности.Spring security предоставляет фильтр аутентификации по умолчанию UsernamePasswordAuthenticationFilter, который можно настроить с помощью .formLogin().Вы можете использовать предоставленную по умолчанию или вы можете определить свой собственный пользовательский фильтр аутентификации (реализация UsernamePasswordAuthenticationFilter).

После успешной аутентификации Spring Security предоставит полномочия для аутентифицированного пользователя.Если аутентификация настроена правильно, ниже конфигурация отвечает за аутентификацию и предоставление полномочий

auth.inMemoryAuthentication().withUser("sahil").password("123")
                .roles("ADMIN","USER");

Аутентифицированным пользователям каждый запрос будет проходить через фильтр FilterSecurityInterceptor, и он будет проверять полномочия, предоставленные для аутентифицированного пользователя с авторизацией, настроенной для ресурсовкак указано в приведенном ниже коде.

.antMatchers("/welcome","/inventory/**","/sales/**").access("hasRole('USER')")

Вы пропустили все это, не настроив фильтр аутентификации.
Теперь для упрощения использования use.formLogin () в вашей конфигурации http.

@Override
protected void configure(final HttpSecurity http) throws Exception
{
    http
    .authorizeRequests()
        .antMatchers("/welcome","/inventory/**","/sales/**").access("hasRole('USER')")
    .and().exceptionHandling()
        .accessDeniedPage("/403")
    .and().formLogin()
    .and().logout()
        .logoutSuccessUrl("/login?logout=true")
        .invalidateHttpSession(true)
    .and()
        .csrf()
            .disable();
}

.formLogin() без какой-либо конфигурации предоставляет страницу входа по умолчанию с параметрами формы по умолчанию для имени пользователя и пароля. И после аутентификации она перенаправляет на "/" Если вы хотите предоставить свою пользовательскую страницу входа, используйте следующую конфигурацию.

.and().formLogin()
       .loginPage("/login")
       .usernameParameter("email").passwordParameter("password")
       .defaultSuccessUrl("/app/user/dashboard")
       .failureUrl("/login?error=true")

.loginPage("") - URL-адрес вашей пользовательской страницы входа
.usernameParameter("").passwordParameter("") - Параметры настраиваемой формы входа в систему
.defaultSuccessUrl("") - URL-адрес страницы после успешной аутентификации
.failureUrl("") - Страницаurl после сбоя аутентификации

Примечание: Вы не должны использовать метод POST "/ login" в вашем контроллере, даже если вы пишете, он не будет достигнут из цепочки фильтров безопасности Spring.Поскольку ваша конфигурация была неправильной раньше, она достигала раньше!Теперь вы удалите их из своего контроллера и используйте обычный подход, как указано выше.

...