1.10.2. 登录认证拦截LoginInterceptor

对登录认证进行拦截

典型应用场景如下:

  • 记录登录审计日志

  • IP、浏览器控制

    /**
     * 登录之前的操作<br>
     * 
     * 此时<code>AppContext.getCurrentUser()</code>是<code>null</code>的
     * 
     * @param request
     * @param response
     * @return <code>Error</code>标示本次登录终止,返回到登录页;<code>OK</code>正常往下进行
     */
    public LoginResult preHandle(HttpServletRequest request, HttpServletResponse response);

    /**
     * 在登录验证成功后的操作<br>
     * 此时<code>AppContext.getCurrentUser()</code>有值
     * @param request
     * @param response
     * @return <code>Error</code>标示本次登录终止,返回到登录页;<code>OK</code>正常往下进行
     */
    public LoginResult afterComplete(HttpServletRequest request, HttpServletResponse response);

    /**
     * 在登录验证失败后的操作
     * 
     * @param request
     * @param response
     * @return <code>Error</code>不管怎么样都会跳转到登录页面,最好别返回<code>LoginResult.OK</code>他也没有用
     */
    public LoginResult afterFailure(HttpServletRequest request, HttpServletResponse response);

系统缺省通过几个拦截器实现一些功能控制

验证器 说明
com.seeyon.ctp.login.interceptor.VerifyCodeLoginInterceptor 验证码拦截器,在preHandle对用户输入的验证码进行校验
com.seeyon.ctp.login.interceptor.LockLoginInterceptor 锁定用户拦截器
com.seeyon.ctp.login.interceptor.IpcontrolLoginInterceptor IP控制拦截器
com.seeyon.ctp.login.interceptor.MutilBrowserLoginInterceptor 限制管理员只能使用PC,通过IE登录

可以通过以下步骤实现登录拦截:

  1. 继承com.seeyon.ctp.login.AbstractLoginInterceptor,实现自己的登录拦截器类

    package com.seeyon.apps.login;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.seeyon.ctp.common.constants.LoginConstants;
    import com.seeyon.ctp.login.AbstractLoginInterceptor;
    import com.seeyon.ctp.login.LoginAuthenticationException;
    
    public class CustomMutilBrowserLoginInterceptor extends com.seeyon.ctp.login.AbstractLoginInterceptor {
        public CustomMutilBrowserLoginInterceptor() {
        }
        //管理员只能通过IE、PC访问
        public LoginResult afterComplete(HttpServletRequest request,HttpServletResponse response) {
            User currentUser = CurrentUser.get();
            if(currentUser.isAdmin()) {
                Boolean A8Allow4Admin = (Boolean)(BrowserFlag.A8Allow4Admin.getFlag(request));
                
                //管理员只能从IE上登录
                if (Boolean.FALSE.equals(A8Allow4Admin)) {
                    return LoginResult.ERROR_IPCONTROLIPAD;
                }
                
                //管理员不能从M1上登录
                if(currentUser.isFromM1() || Constants.login_useragent_from.mobile.name().equals(currentUser.getUserAgentFrom())){
                    return LoginResult.ERROR_ForbiddenAdminLogin;
                }
            }
    
            return LoginResult.OK;
        }
    }
  2. 注册Spring bean

    在插件的springxml文件中,增加

        <bean class="com.seeyon.apps.login.CustomMutilBrowserLoginInterceptor"/>