2014-09-02 2 views
1

У меня есть раздел сайта (все под /secure URL), который я пытаюсь обеспечить с помощью Spring Security 3.2.5. Я использую следующую конфигурацию XML:Spring Security с конфигурацией XML не аутентифицирует пользователя

<http use-expressions="true"> 
    <intercept-url pattern="/secure/login" access="permitAll" /> 
    <intercept-url pattern="/secure/**" access="isAuthenticated()" /> 
    <form-login default-target-url="/secure/home" always-use-default-target="true" login-page="/secure/login" /> 
</http> 

<authentication-manager> 
    <authentication-provider> 
     <user-service> 
      <user name="user" password="password" authorities="ROLE_SECURE" /> 
     </user-service> 
    </authentication-provider> 
</authentication-manager> 

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

@Controller 
@RequestMapping(value = "/secure") 
public class LoginController { 
    @RequestMapping(value = "/login", method = RequestMethod.GET) 
    public String getLogin() { 
     return "secure/login"; 
    } 

    @RequestMapping(value = "/home", method = RequestMethod.GET) 
    public String getHome() { 
     return "secure/home"; 
    } 
} 

и этот код внутри страницы входа:

<form method="POST" action="<c:url value="/secure/login" />"> 
    username: <input type="text" name="username" /><br/> 
    password: <input type="password" name="password" /><br/> 
    <input type="submit" value="Login" /> 
</form> 

у меня есть контекст безопасности, загруженный в web.xml с помощью ContextLoaderListener и springSecurityFilterChain делегирования прокси-фильтр тоже setup.

Когда я пытаюсь получить доступ к адресу /secure, я получаю перенаправление на /secure/login, мой контроллер вызывается в методе getLogin, и я вижу свою страницу входа. Все в порядке.

Теперь моя проблема: что я представить в форме входа отправляется непосредственно в LoginController и я получаю исключение о том, что POST не поддерживается метод, который имеет смысл, потому что нет ни одного обработчика POST в контроллере ,

Если добавить метод, как это в контроллере:

@RequestMapping(value = "/login", method = RequestMethod.POST) 
public String postLogin() { 
    return "redirect:/secure/home"; 
} 

Я больше не получаю ошибку, но мой postLogin метод вызывается которым отправляет меня /secure/home неаутентифицированное, который затем перенаправляет меня /secure/login и я в исходную точку.

Я не знаю, что я делаю неправильно. Все примеры, которые я вижу в Интернете, - это Java, которые я предпочитаю не использовать, и все рабочие процессы происходят в контексте приложения, не под каким-то дополнительным URL-адресом (в моем случае /secure).

Что мне не хватает?

ответ

1

Форма Документы (http://docs.spring.io/spring-security/site/docs/3.0.x/reference/appendix-namespace.html):

по умолчанию целевой URL-:

Карта на имущество defaultTargetUrl в UsernamePasswordAuthenticationFilter. Если не установлено, значением по умолчанию является «/» (корень приложения). Пользователь будет отправлен на этот URL после входа в систему, если им не будет предложено войти в систему при попытке получить доступ к защищенному ресурсу, когда они будут отправлены на первоначально запрошенный URL.

Вы должны отправить форму j_spring_security_check

<form name='loginForm' 
      action="<c:url value='j_spring_security_check' />" method='POST'> 

Это будет обрабатываться Spring Security и проверит пользователя и пропуск в зависимости от вашей конфигурации. См. Этот пример http://www.mkyong.com/spring-security/spring-security-form-login-example/

Редактировать: j_security_check также должен поддерживаться.

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