2015-10-10 2 views
0

Я изучаю весеннюю безопасность (конфигурацию на основе java), и я не могу заставить logout работать правильно. Когда я удаляю выход, я вижу, что URL-адрес изменяется на http://localhost:8080/logout и получает «HTTP 404 -/logout». Функция входа в систему работает нормально (даже с пользовательской формой входа), но выход из системы - проблема, я подозреваю, что перенаправленный URL-адрес «localhost: 8080/logout» должен быть «localhost: 8080/springtest/logout»404 logout with SpringMVC и SpringSecurity

Я следую сочетание книги, а также эти примеры: http://docs.spring.io/spring-security/site/docs/3.2.x/guides/hellomvc.html

Я использую:

<dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>4.1.4.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-config</artifactId> 
     <version>4.0.2.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-core</artifactId> 
     <version>4.0.2.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-web</artifactId> 
     <version>4.0.2.RELEASE</version> 
     <scope>compile</scope> 
    </dependency> 

Это MVC инициализатор:

public class MvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class[] { RootApplicationContextConfig.class }; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class[] { WebApplicationContextConfig.class }; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[] { "/" }; 
    } 

    @Override 
    protected Filter[] getServletFilters() { 
     return new Filter[] { new HiddenHttpMethodFilter() }; 
    } 
} 

И это инициализатор безопасности:

public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer { 

} 

Это веб-конфигурация:

@Configuration 
@EnableWebMvc 
@EnableTransactionManagement 
@ComponentScan(basePackages = { "org.munilvc.springtest" }) 
public class WebApplicationContextConfig extends WebMvcConfigurerAdapter { 

    @Bean(name = "viewResolver") 
    public InternalResourceViewResolver getViewResolver() { 
     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setPrefix("/WEB-INF/views/"); 
     viewResolver.setSuffix(".jsp"); 
     return viewResolver; 
    } 

    @Override 
    public void addViewControllers(ViewControllerRegistry registry) { 
     registry.addViewController("/login").setViewName("login"); 
     registry.setOrder(Ordered.HIGHEST_PRECEDENCE); 
    } 

    // Serve static content like <mvc:resources/> tags 
    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/resources/magic/").setCachePeriod(31556926); 
    } 

} 

Это конфигурации безопасности:

@Configuration 
@EnableWebMvcSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth.inMemoryAuthentication().withUser("user").password("password").roles("USER"); 
    } 
} 

также домашний контроллер, я не уверен, это лучший способ сделать это, но я хочу, чтобы localhost: 8080/springtest перенаправлялся на дом, а Spring Security перехватывала это с помощью страницы входа. Это работает для меня сейчас, но мне интересно, правильно ли это сделать?

@Controller 
public class HomeController { 

    @RequestMapping("/") 
    public String showLoginForm(Model model) { 
    return "home"; 
    } 

} 

Наконец, это выход из системы в моей домашней странице:

 <p class="navbar-text navbar-right"> 
      Signed in as <a href="#" class="navbar-link">${pageContext.request.remoteUser}</a> 

     <form class="navbar-form pull-right" action="/logout" 
      method="post"> 
      <input type="hidden" name="${_csrf.parameterName}" 
       value="${_csrf.token}" /> <input type="submit" value="Log out" /> 
     </form> 

мне нужно сделать явное отображение запроса на выход из системы делать? Я проверяю образец app hellomvc-jc из весенних документов, но я не вижу явного сопоставления запросов, поэтому я считаю, что SpringSecurity 4 уже позаботится об этом, не так ли?

спасибо! Я очень ценю ваше время, и я надеюсь, что это поможет кому-то другому.

ответ

1

Использование action="logout" вместо action="/logout"

+0

Спасибо Джеймс Jithin, это сработало! Я был уверен, что попробовал это, но учитывая количество конфигураций/комбинаций, которые я пытался, я совсем не уверен. Мой вопрос: почему я вижу, что документы все еще используют «/ logout» вместо «logout»? Я подозреваю, что это связано с распознавателем вида или с некоторым отображением запроса? – munilvc

Смежные вопросы