Я использую Spring Security 4.0.2.RELEASE с Spring 4.2.0.RELEASE.Выход с Spring Security с конфигурацией Java
Мне не удается создать ссылку для выхода из системы (я знаю, что должно быть значением атрибута href).
Рассмотрим:
Настройка DelegatingFilterProxy в Java с WebApplicationInitializer:
public class SecurityWebInitializer
extends AbstractSecurityWebApplicationInitializer {
}
Простой класс конфигурации, чтобы включить веб-безопасности для Spring MVC
@Configuration
@EnableWebSecurity
public class SecurityConfig
extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin().and()
.authorizeRequests()
.antMatchers("/spitter/").authenticated()
.antMatchers(HttpMethod.GET, "/spitter/register").authenticated().and()
.logout().deleteCookies("remove")
.invalidateHttpSession(true).logoutUrl("/logout")
.logoutSuccessUrl("/");
}
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication().withUser("user").password("password")
.roles("USER").and().withUser("admin").password("password")
.roles("USER", "ADMIN");
}
}
Контроллер:
@Controller
@RequestMapping(value = "/spitter")
public class SpittrController {
private SpittleRepository spittleRepository;
@Autowired
public SpittrController(SpittleRepository spittleRepository) {
this.spittleRepository = spittleRepository;
}
@RequestMapping(value = "/register", method = RequestMethod.GET)
public String showRegistrationForm() {
return "registerForm";
}
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String processingRegistration(@Valid Spitter spitter, Errors errors) {
if (errors.hasErrors()) {
return "registerForm";
}
spittleRepository.save(spitter);
return "redirect:/spitter/" + spitter.getUserName();
}
@RequestMapping(value = "/{username}", method = RequestMethod.GET)
public String showSpitterProfile(@PathVariable("username") String username,
Model model) {
Spitter spitter = spittleRepository.findByUsername(username);
if(spitter != null){
model.addAttribute(spitter);
}
return "profile";
}
}
registerForm.jsp:
<form method="post">
<table>
<tr>
<td>First Name:</td>
<td><input type="text" name="firstName" /></td>
</tr>
<tr>
<td>Last Name:</td>
<td><input type="text" name="lastName" /></td>
</tr>
<tr>
<td>User Name:</td>
<td><input type="text" name="userName" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td><input type="submit" value="Register" /></td>
</tr>
</table>
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}">
</form>
После подачи registerForm.jsp, то profile.jsp показано пользователю:
profile.jsp:
<body>
<h1>Hello world!</h1>
<p>The time on the server is ${serverTime}.</p>
<h1>Your Profile</h1>
<h1><a href="/logout">Logout</a></h1>
<table>
<tr>
<td>First Name:</td>
<td><c:out value="${spitter.firstName}" /></td>
</tr>
<tr>
<td>Last Name:</td>
<td><c:out value="${spitter.lastName}" /></td>
</tr>
<tr>
<td>User Name:</td>
<td><c:out value="${spitter.userName}" /></td>
</tr>
</table>
</body>
Когда я ударил
Я перенаправлен на страницу входа. После авторизации и отправки формы, то profile.jsp показано, в котором я включил Выход ссылку. При щелчке на нем HTTP 404.
Я прошел через Spring Security docs, но они приняли thymeleaf во внимание. Моя простая страница JSP.
Кроме того, я также рассмотрел принимая это во внимание,
По запросу POST по умолчанию требуется для выхода из системы URL.Чтобы выполнить выход из системы по запросу GET вам нужно:
HTTP .logout() .logoutRequestMatcher (новый AntPathRequestMatcher ("/ выхода из системы"));
1: http://docs.spring.io/spring-security/site/docs/3.2.x/guides/hellomvc.html
Любые предложения?
'/ logout' как URL или действия в форме будет работать, только если ваше приложение развертывается как корень. Вам нужно включить 'context-root'. Используйте тег URL для этого ' ' должен делать трюк. –
@Denium: Вы имеете в виду web/spitter/logout. –
Если '/ web/spitter' является корнем контекста вашего приложения, да, иначе нет ... Как указано, используйте тег URL, который делает это для вас. (Как и в ответе, который в основном правильный, но включает неправильный URL). –