1. 登錄集成
通過登錄接口可以定制自己的登錄認證,或者對登錄進行攔截,在登錄前、登錄成功、登錄失敗的各個環節記錄日志。
1.1. 自定義登錄認證LoginAuthentication
登錄驗證器
典型應用場景如下:
- AD/LDAP統一認證
- 兩步認證,使用手機短信、手機令牌或其他硬件進行雙因素認證
- CA認證實現
/**
* 認證,策略是:
*
* <ol>
* <li>系統框架把登錄界面發過來的<code>HttpServletRequest</code>完整的傳遞給認證實現類</li>
* <li>認證實現類完成自己的邏輯</li>
* <li>返回值約定
* <ol type="i">
* <li>當驗證通過,需要給框架返回[用戶名, 密碼],框架將直接跳轉到首頁</li>
* <li>當不驗證通過,但要終止本次登錄請求,直接throw new LoginAuthenticationException(),用戶將跳轉到登錄頁</li>
* <li>當不驗證通過,返回null,框架將調用下一個認證類認證</li>
* </ol>
* </li>
* </ol>
*
* @return 認證通過: 返回[用戶名, 密碼]; 驗證不通過返回null,框架將調用下一個認證類認證
* @throws LoginAuthenticationException 用戶將跳轉到登錄頁
*/
String[] authenticate(HttpServletRequest request, HttpServletResponse response)
throws LoginAuthenticationException;
系統缺省提供幾個驗證器,按順序如下
驗證器 | 說明 |
---|---|
com.seeyon.ctp.portal.sso.login.SSOTicketLoginAuthentication | 單點登錄認證 |
com.seeyon.v3x.plugin.ca.CALoginAuthentication | 使用CA認證 |
com.seeyon.ctp.login.IdentificationDogLoginAuthentication | 使用身份驗證狗認證 |
com.seeyon.apps.ldap.login.LDAPLoginAuthentication | 使用LDAP認證 |
com.seeyon.ctp.login.auth.DefaultLoginAuthentication | 使用協同用戶系統認證 |
各驗證器按順序依次調用認證方法,只要有一個通過則該次登錄認證通過。
要實現自己的登錄認證,必須:
1 繼承com.seeyon.ctp.login.AbstractLoginAuthentication,實現自己的登錄驗證類
package com.seeyon.apps.login;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.seeyon.ctp.common.constants.Constants;
import com.seeyon.ctp.common.constants.LoginConstants;
import com.seeyon.ctp.login.AbstractLoginAuthentication;
public class CustomLoginAuthentication extends AbstractLoginAuthentication {
@Override
public String[] authenticate(HttpServletRequest request,
HttpServletResponse response) throws LoginAuthenticationException {
String username = request.getParameter(LoginConstants.USERNAME);// 用戶名
String password = request.getParameter(LoginConstants.PASSWORD);// 密碼
if (username == null || password == null) {
return null;
}
//登錄方式,判斷是否移動應用登陸
String userAgentFrom = request.getParameter(Constants.LOGIN_USERAGENT_FROM);
boolean fromMobile = Constants.login_useragent_from.mobile.name().equals(userAgentFrom) || LoginUtil.isFromM1(userAgentFrom);
if (check(username, password)) {
return new String[] { username, password };
}
return null;
}
private boolean check(String username, String password) {
// 登錄認證邏輯,用戶名和密碼正確時返回true即可
return false;
}
}
注冊Spring bean
在插件的springxml文件中,增加
<bean class="com.seeyon.apps.login.CustomLoginAuthentication"/>
1.2. 登錄認證攔截LoginInterceptor
對登錄認證進行攔截
典型應用場景如下:
- 記錄登錄審計日志
- IP、瀏覽器控制
/**
* 登錄之前的操作
*
* 此時AppContext.getCurrentUser()是null的
*
* @param request
* @param response
* @return Error標示本次登錄終止,返回到登錄頁;OK正常往下進行
*/
public LoginResult preHandle(HttpServletRequest request, HttpServletResponse response);
/**
* 在登錄驗證成功后的操作
* 此時AppContext.getCurrentUser()有值
* @param request
* @param response
* @return Error標示本次登錄終止,返回到登錄頁;OK正常往下進行
*/
public LoginResult afterComplete(HttpServletRequest request, HttpServletResponse response);
/**
* 在登錄驗證失敗后的操作
*
* @param request
* @param response
* @return Error不管怎么樣都會跳轉到登錄頁面,最好別返回LoginResult.OK他也沒有用
*/
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"/>
1.3. 排序
在大多數場景下,同一套產品只會有一個主要的LoginAuthentication生效,而LoginInterceptor對順序不敏感,原則上不需要排序。
但如果要對LoginAuthentication和LoginInterceptor進行排序,可以在插件目錄定義一個login.xml,如(WEB-INF\cfgHome\plugin\myplugin\login.xml)
<?xml version="1.0" encoding="UTF-8"?>
<login>
<bean class="com.seeyon.apps.login.CustomLoginInterceptor" before="com.seeyon.ctp.login.interceptor.LockLoginInterceptor"/>
<bean class="com.seeyon.apps.login.CustomLoginAuthentication" after="com.seeyon.v3x.plugin.ca.CALoginAuthentication"/>
</login>
將CustomLoginInterceptor放到com.seeyon.ctp.login.interceptor.LockLoginInterceptor之前執行。
將CustomLoginAuthentication放到com.seeyon.v3x.plugin.ca.CALoginAuthentication之后執行。
一旦定義了login.xml,對應的bean就無需在spring xml中注冊。
1.4. 使用平臺認證登錄
最簡單的方式,是直接使用平臺的登錄
GET http://127.0.0.1/seeyon/main.do?login_username={loginName}&login_password={password}
然后獲取響應的Header中的LoginOK,如果有值說明登錄成功。
登錄成功后獲取Cookie,以后的請求都使用Cookie中的JSESSIONID發起即可。
但這樣的方式與PC公用并發,會導致PC的登錄被迫下線。
M1、M3和致信都是在后臺重寫了登錄的入口,但這個是內部的實現,有很多控制。
對于移動應用認證,我們建議的開發方式是只通過用戶密碼校驗的REST接口進行身份認證,使用REST接口開發
POST authentication?login_username={loginName}&login_password={password}
成功也會返回LoginOK,但不進行真實的登錄。
1.5. 登錄提示信息編碼
編碼 | 狀態 | 備注 | 提示信息 |
---|---|---|---|
1001 | exceed_max_member | 超出并發數限制 | 超出了最大登錄人數 |
1002 | exceed_max_member_in_account | 超出單位并發數限制 | 超出了您所在單位的最大登錄人數 |
1003 | loginUserState.adminKickoff | 被管理員強制下線 | 您被管理員強制下線 |
1004 | LoginOfflineOperation.networkOff | 網路故障 | 網絡故障,您被迫下線 |
1005 | loginUserState.changePassword | 其他端修改了密碼 | 密碼已被修改{0},請重新登錄。 |
1006 | loginUserState.kickOff | 被其他端下線 | 您的賬號已被下線! |
1007 | LoginOfflineOperation.loginAnotherone | 在另一個地點登錄 | 您的帳號在另一地點登錄,您被迫下線 |
1010 | loginUserState.unknown | 未知錯誤 | 被迫下線,原因:與服務器失去連接 |
1021 | 無效的用戶名或密碼 | ||
1022 | 無效的用戶名或密碼 該帳號僅剩下{0}次登錄嘗試機會 | ||
1023 | 賬號被鎖定,請稍后重試或聯系管理員 | ||
1024 | 該帳號已經被禁用.請聯系管理員. | ||
1031 | 您沒有在符合的IP范圍內登錄 | ||
1041 | 管理員不能在該瀏覽器上登錄 | ||
1042 | 管理員不能登錄 | ||
1045 | 短信登錄驗證碼不匹配或過期 | ||
1047 | 身份驗證狗不可用。 | ||
1051 | 證書已過期。 | ||
1052 | 證書已吊銷。 | ||
1053 | 證書被吊銷且已過期。 | ||
1054 | 證書服務器錯誤,請聯系管理員。 | ||
1055 | 證書與協同賬號沒有綁定,請聯系管理員。 | ||
1056 | 此IP登錄必須擁有賬號所對應的CA證書 | ||
1057 | 請安裝CA證書或插入CA硬件設備,請聯系管理員 | ||
1058 | 此帳號和CA帳號綁定不正確,請聯系管理員 | ||
1060 | 域用戶驗證失敗 | ||
1061 | 域用戶綁定信息不存在 |
公司主要經營內容:
帆軟報表,帆軟軟件,致遠OA,北京致遠軟件,致遠軟件,致遠OA軟件,OA軟件,致遠OA辦公軟件,致遠OA協同軟件,OA協同軟件,OA辦公軟件,致遠辦公軟件,致遠協同辦公軟件,致遠OA協同辦公軟件,OA綜合辦公軟件,致遠系統,OA系統,致遠OA系統,北京致遠OA系統,北京致遠OA軟件,致遠OA系統軟件,致遠協同辦公系統,致遠協同辦公OA系統,致遠系統OA,致遠軟件OA,OA軟件系統,OA致遠北京,致遠A8OA,OAA8軟件,致遠A8軟件,致遠A8系統Oa軟件,致遠OA系統版本軟件