Вопрос:

Как настроить Spring Security для одностраничного приложения?

java spring spring-mvc spring-security

3965 просмотра

1 ответ

93 Репутация автора

Я столкнулся с проблемой настройки Spring Security для одностраничного приложения.

Итак, конфиг defualt выглядит так

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    @Qualifier("customUserDetailsService")
    UserDetailsService userDetailsService;

    @Autowired
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/", "/list").permitAll()
                .antMatchers("/admin/**").access("hasRole('ADMIN')")
                .and().formLogin().loginPage("/login").permitAll()
                .usernameParameter("ssoId").passwordParameter("password")
                .and().csrf()
                .and().exceptionHandling().accessDeniedPage("/Access_Denied");
    }

    @Bean(name="authenticationManager")
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }


}

Из документации по методам для Login (). LoginPage ("/ login") говорится, что он используется для перенаправления на страницу входа. Для одной страницы эта конфигурация не актуальна. Как мне настроить Spring для одностраничного приложения? Я имею в виду, как настроить вход в систему, выход из системы в контроллере и в файле конфигурации.

Автор: user2483213 Источник Размещён: 02.10.2015 08:07

Ответы (1)


9 плюса

6011 Репутация автора

Весенний Лимон может быть полным примером для этого, но позвольте мне подвести итог ниже.

По умолчанию, когда пользователь успешно входит в систему, Spring Security перенаправляет его на домашнюю страницу. При неудачном входе в систему или после успешного выхода пользователь перенаправляется обратно на страницу входа. Кроме того, при попытке доступа к URL-адресам, для которых у пользователя нет достаточных прав, он перенаправляется на страницу входа.

Как вы говорите, такое поведение не подойдет для одностраничных приложений. Вместо этого ваш API должен отправить ответ 200 вместе с пользовательскими данными или ответ 4xx. Это можно сделать, предоставив свои собственные обработчики, например:

@Override
protected void configure(HttpSecurity http) throws Exception {
http
    .formLogin()
        ...
        .successHandler(your authentication success handler object)
        .failureHandler(your authentication failure handler object)
        .and()
    .logout()
        ...
        .logoutSuccessHandler(your logout success handler object)
        .and()
    .exceptionHandling()
        .authenticationEntryPoint(new Http403ForbiddenEntryPoint())
    ...
}

В Интернете вы найдете много примеров того, как кодировать эти классы обработчиков. Например, в проекте « весна-лимон » они кодируются, как показано ниже.

Обработчик успеха аутентификации

@Component
public class AuthenticationSuccessHandler
    extends SimpleUrlAuthenticationSuccessHandler {

    @Autowired    
    private ObjectMapper objectMapper;

    @Autowired    
    private LemonService<?,?> lemonService;

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request,
            HttpServletResponse response,
            Authentication authentication)
    throws IOException, ServletException {

        response.setStatus(HttpServletResponse.SC_OK);
        response.setContentType(MediaType.APPLICATION_JSON_VALUE);

        AbstractUser<?,?> currentUser = lemonService.userForClient();

        response.getOutputStream().print(
                objectMapper.writeValueAsString(currentUser));

        clearAuthenticationAttributes(request);
    }
}

Таким образом, он возвращает ответ 200 с текущим пользователем JSONified в данных ответа.

Обработчик ошибок аутентификации

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

Обработчик успеха выхода

public class LemonLogoutSuccessHandler
    implements LogoutSuccessHandler {

    @Override
    public void onLogoutSuccess(HttpServletRequest request,
        HttpServletResponse response, Authentication authentication)
        throws IOException, ServletException {

          response.setStatus(HttpServletResponse.SC_OK);
    }
}

Для подробного примера может быть полезна ссылка на класс LemonWebSecurityConfig Spring Lemon и другие классы в его пакетах безопасности различных модулей.

Автор: Sanjay Размещён: 03.10.2015 01:31
Вопросы из категории :
32x32