Как сделать дополнительную проверку в форме входа в Spring Security? - PullRequest
3 голосов
/ 11 августа 2011

Интересно, как сделать дополнительную проверку в форме входа в систему, прежде чем она будет обработана Spring Security. Я думаю о каком-то LoginController, компоненте LoginForm, но я не знаю, как его объединить, как настроить его на работу. Мои "видения" ниже. Я искал несколько примеров, как это сделать в Spring Security, но не могу найти. Кто-нибудь помогает с этим?

LoginForm bean:

public class LoginForm {
    private String j_username;
    private String j_password;
    @NotEmpty
    private Boolean acceptTerms;

    public String getJ_password() {
        return j_password;
    }

    public String getJ_username() {
        return j_username;
    }

    public void setJ_password(String j_password) {
        this.j_password = j_password;
    }

    public void setJ_username(String j_username) {
        this.j_username = j_username;
    }

    public Boolean getAcceptTerms() {
        return acceptTerms;
    }

    public void setAcceptTerms(Boolean accept) {
        this.acceptTerms = acceptTerms;
    }
}

Форма:

<c:url value="/login" var="secureUrl"/>
<form:form id="jf" commandName="loginForm" action="${secureUrl}" method="post">
   <form:input path="j_username"/>
   <form:input path="j_password"/>
   <form:checkbox path="acceptTerms"/>
</form>

LoginController:

@Controller
class LoginController {
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String logging(@ModelAttribute @Valid LoginForm loginForm) {
                ...
    }
}

Ответы [ 3 ]

3 голосов
/ 07 сентября 2015
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView signInPage(
                    @RequestParam(value = "error", required = false) String error,
                    @RequestParam(value = "logout", required = false) String logout) 
{
    ModelAndView mav = new ModelAndView();
    //Initially when you hit on login url then error and logout both null
    if (error != null) {
        mav.addObject("error", "Invalid username and password!");
    }

    if (logout != null) {
        mav.addObject("msg", "You've been logged out successfully.");
    }
    mav.setViewName("login/login.jsp");
}

Теперь, если в случае, если вход в систему стал неудачным, он снова попадет на этот URL с ошибкой, добавленной в его URL, как в файле безопасности Spring, вы устанавливаете URL ошибки.Файл безопасности Spring:

<security:form-login
    authentication-failure-url="/login?error=1"
/>

Тогда ваш URL становится url/login?error=1.Затем автоматически будет вызван метод signInPage с некоторым значением ошибки.Теперь ошибка не равна нулю, и вы можете установить любую строку, соответствующую URL, и мы можем показать на jsp, используя следующие теги:

<c:if test="${not empty error}">
    <div class="error">${error}</div>
</c:if>
2 голосов
/ 11 августа 2011

Вы можете создать подкласс UsernamePasswordAuthenticationFilter:

http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/authentication/UsernamePasswordAuthenticationFilter.html

Вы можете переопределить метод tryAuthentication (), вызвать его вызовом super.attemptAuthentication () и, если он возвращает ненулевой объект аутентификации, выполнить дополнительную работу (чтобы проверить, установил ли пользователь флажок).

http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/authentication/UsernamePasswordAuthenticationFilter.html#attemptAuthentication(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

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

http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#ns-custom-filters

1 голос
/ 18 июля 2012

Просто добавьте больше информации поверх комментария @sdouglass.

В фильтре у вас не будет доступа к форме для привязки.

Мне удалось получить его с проверкой по умолчанию, выполнив следующее.

https://gist.github.com/3137040

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...