Spring security - Request method 'POST' not supported

96
09 августа 2019, 16:40

Ошибка вылетает при попытке залогинится

 @Configuration
    @EnableWebSecurity
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
        @Autowired
        @Qualifier("customUserDetailsService")
        UserDetailsService userDetailsService;
        @Autowired
        PersistentTokenRepository tokenRepository;
        @Autowired
        public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userDetailsService);
            auth.authenticationProvider(authenticationProvider());
        }
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests().antMatchers("/admin*/**")
                    .access("hasRole('ADMIN')")
                    .and().formLogin().loginPage("/admin/login")
                    .loginProcessingUrl("/admin/login").usernameParameter("ssoId").passwordParameter("password").and()
                    .rememberMe().rememberMeParameter("remember-me").tokenRepository(tokenRepository)
                    .tokenValiditySeconds(604800).and().csrf().and().exceptionHandling().accessDeniedPage("/Access_Denied");
        }
        @Override
        public void configure(WebSecurity web) throws Exception {
            web.ignoring().antMatchers("/admin/login", "/admin/logout");
        }
        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
        @Bean
        public DaoAuthenticationProvider authenticationProvider() {
            DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
            authenticationProvider.setUserDetailsService(userDetailsService);
            authenticationProvider.setPasswordEncoder(passwordEncoder());
            return authenticationProvider;
        }
        @Bean
        public PersistentTokenBasedRememberMeServices getPersistentTokenBasedRememberMeServices() {
            PersistentTokenBasedRememberMeServices tokenBasedservice = new PersistentTokenBasedRememberMeServices(
                    "remember-me", userDetailsService, tokenRepository);
            return tokenBasedservice;
        }
        @Bean
        public AuthenticationTrustResolver getAuthenticationTrustResolver() {
            return new AuthenticationTrustResolverImpl();
        }
    }

и вот моя форма:

    <form action="/admin/login" method="post" class="form-horizontal">
                        <c:if test="${param.error != null}">
                            <div class="alert alert-danger">
                                <p>Invalid username and password.</p>
                            </div>
                        </c:if>
                        <c:if test="${param.logout != null}">
                            <div class="alert alert-success">
                                <p>You have been logged out successfully.</p>
                            </div>
                        </c:if>
                        <div class="input-group input-sm">
                            <label class="input-group-addon" for="username"><i class="fa fa-user"></i></label>
                            <input type="text" class="form-control" id="username" name="ssoId" placeholder="Enter Username" required>
                        </div>
                        <div class="input-group input-sm">
                            <label class="input-group-addon" for="password"><i class="fa fa-lock"></i></label>
                            <input type="password" class="form-control" id="password" name="password" placeholder="Enter Password" required>
                        </div>
                        <div class="input-group input-sm">
                            <div class="checkbox">
                                <label><input type="checkbox" id="rememberme" name="remember-me"> Remember Me</label>
                            </div>
                        </div>
                        <input type="hidden" name="${_csrf.parameterName}"  value="${_csrf.token}" />
                        <div class="form-actions">
                            <input type="submit"
                                   class="btn btn-block btn-primary btn-default" value="Log in">
                        </div>
  </form>

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

@RequestMapping(value = "/admin/login", method = {RequestMethod.GET})
public ModelAndView loginPage() {
    return new ModelAndView("security/login");
}

если в контроллере добавить

 @RequestMapping(value = "/admin/login", method = {RequestMethod.POST})
    public ModelAndView loginPagePost() {
        return new ModelAndView("security/login");
    }

то ошибки нет, но и залогинивания тоже нет

если закомментировать метод configure(WebSecurity web) и убрать права для админа, то все отрабатывает. по этому мне кажется что проблема в методе configure(WebSecurity web)

Answer 1

Данные формы отправляются POST запросом, поэтому в контроллере надо поправить:

@RequestMapping(value = "/admin/login", method = {RequestMethod.POST})

Ну или создать другой метод, для обработки именно POST запроса.

READ ALSO
Как сделать окно сохранения данных с русскими кнопками в java?

Как сделать окно сохранения данных с русскими кнопками в java?

У меня проект на java, я сделал опцию сохранения данных через JFileChooserНачальство мне высказало замечание, дескать, проект под русскоязычного...

152
Доступ к чтению файлов из внутреннего хранилища

Доступ к чтению файлов из внутреннего хранилища

Имеется следующий код метода:

125
Как получить номер входящего звонка?

Как получить номер входящего звонка?

Надо получить номер входящего звонка, и при получении номер перейти на следующий activity

134
HashMap to ByteArray. из Java в Python

HashMap to ByteArray. из Java в Python

У меня есть HashMap конвертированный в ByteArray на JavaКак мне ByteArray на питоне конвертировать в map на python и обратно?

118