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