Перехват входа в Spring 4 mvc

Я новичок в Spring MVC. Я работаю над веб-страницей, на которой пользователи смогут войти в систему после того, как они зарегистрировались и активировали себя. Я успешно реализовал часть входа в систему, она отлично работает. Я хотел бы проверить, активировал ли пользователь свою учетную запись по электронной почте до запуска процесса входа в систему. Является ли это возможным? Я пытался решить эту проблему с помощью перехватчика входа в систему, но кажется, что значение по умолчанию «/ j_spring_security_check» не может быть перехвачено. Кроме этой ссылки перехватчик работает со всеми url-ами. Можно ли перехватить эту ссылку по умолчанию?

Мой spring-security.xml

...
<http use-expressions="true">
    <intercept-url pattern="/admin**" access="hasRole('ADMIN')" />
    <access-denied-handler error-page="/403" />  
    <form-login login-page="/login" 
        authentication-failure-url="/login?error"
        username-parameter="username"
        password-parameter="password"/>
    <logout logout-success-url="/login?logout" />  
    <!--enable csrf protection-->
    <csrf />
</http>

<authentication-manager>  
    <authentication-provider user-service-ref="loginService" />  
</authentication-manager>  

ЛогинСервис

@Service("loginService")  
public class LoginServiceImpl implements UserDetailsService {  
//It is a regular UserDetailsService nothing extra stuff and works fine
...
}

Логин.jsp

....
<div id="login-box">
    <span  style="color: red">${message}</span>   
    <c:url value="/j_spring_security_check" var="loginUrl"/>
    <form name='f' action="${loginUrl}" method="post">
        <p>
            <label for="username">Email</label>
            <input type="text" id="username" name="username"/>  
        </p>
        <p>
            <label for="password">Password</label>
            <input type="password" id="password" name="password"/>  
        </p>
        <input type="hidden"                        
            name="${_csrf.parameterName}"
            value="${_csrf.token}"/>
        <button type="submit" class="btn">Log in</button>
    </form>
</div>
...

MVC-диспетчер-servlet.xml

...
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/j_spring_security_check"/>
        <bean id="logininterceptor" class="org.psi.controller.LoginInterCeptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>
...

ЛогинПерехватчик

public class LoginInterCeptor extends HandlerInterceptorAdapter {
@Override
    public boolean preHandle(HttpServletRequest request,
        HttpServletResponse response, Object handler) throws Exception {
        //Do some check
        System.out.println("some check");
        return true;
    }
}

Любое другое возможное решение приветствуется.


person laci0725    schedule 17.12.2014    source источник


Ответы (1)


Я бы сделал это, используя свойство locked или enabled объекта UserDetails и позволив Spring обработать все остальное, а не пытаться перехватить запрос. Когда пользователь подтвердит свой адрес электронной почты по ссылке, которую вы ему отправляете, установите флажок в базе данных, чтобы указать, что пользователь либо включен, либо не заблокирован.

В качестве альтернативы, если вы действительно хотите пойти по маршруту перехвата, я мог бы сделать так, чтобы форма входа указывала на что-то, кроме j_spring_security_check, перехватывала что бы это ни было, а затем (при желании) перенаправляла запрос на j_spring_security_check. Я не уверен, что вы действительно можете переопределить этот URL.

person Chris Thompson    schedule 17.12.2014
comment
Можно изменить ссылку j_spring_security_check. Я попробовал это, но когда происходит переадресация, я получаю следующее исключение: не найдено сопоставление для HTTP-запроса с URI [/PsiWeb/j_spring_security_check] в DispatcherServlet с именем «mvc-dispatcher». Я также пробовал заблокированные включенные флаги, но если один из они ложны Я получил сообщение о неверном имени пользователя или пароле на странице входа. Однако стоит прочитать после, может быть, я просто что-то упускаю. - person laci0725; 17.12.2014
comment
Я читал после заблокированных, включенных флагов. Это хорошее решение для моей проблемы. Я нашел эту страницу: mkyong.com/spring- security/ выполнил шаги, и все работает нормально. - person laci0725; 18.12.2014