2013-10-14 6 views
0

내 프로젝트가 JSF2.0, Seam 2.3 및 Spring 3.0을 사용 중임이음새에서 중복 로그인 프로세스를 제어하는 ​​방법

Seam Security가 로그인 프로세스를 개발 중입니다. (11111 >>>>>>>>>> :

시간 1 : 사용자 ID와 PC1 >>>>>> 로그인 시스템 @ 사용자 A

내 문제는 다음과 같은 중복 된 사용자의 로그인을 제어 할 것입니다 상태 : OK)

타임 2 : 사용자 ID와 사용자 B의 @의 PC2 >>>>>> 로그인 시스템 : 11111 >>>>>>>>>> (상태 : OK)이 때

, 난 자동으로 무효화하고 로그 아웃하려는 경우 User A 시스템에서

어떻게하면 되겠습니까? 그리고 어떤 제안이라도 환영합니다.

+0

'User A'또는 'User B'를 찾는 방법은 사용자의 세션을 무효화하기 전에 'Original userID'를 소유 한 정식 사용자입니까? – SRy

+0

내 awnser가 작동하지 않습니까? – Trind

+0

@ 트린드 늦은 답변 트린드 죄송합니다. 귀하의 솔루션과 작업에 많은 감사를드립니다. 하지만 우리는 다른 솔루션을 제어해야하므로 내 사용자 정의 방법으로이 문제를 해결했습니다. 내 대답을 친절하게 보아주세요. – AKZap

답변

1

javax.servlet.http.HttpSessionListener를 만들고 웹 XML에 추가하십시오.

모든 세션을 목록에 저장하십시오.

public class SessionListener implements HttpSessionListener, java.io.Serializable{ 
    private static final Logger log = Logger.getLogger(SessionListener.class); 
    public void sessionCreated(HttpSessionEvent event) { 
     listsession.add(event.getSession()); 
    } 

    public void sessionDestroyed(HttpSessionEvent event) { 
     listsession.remove(event.getSession()); 
    } 
} 

새 세션이 등록 될 때 목록에 동일한 사용자가있는 기존 세션이 있으면 편집하십시오. 그것에 invalidateSession을 사용하십시오. 나는이 다음과 같은 생각으로이 문제를 해결 한 세션

for(HttpSession session:listsession){ 
     if (session!=null) 
     { 
      Identity identity = null; 
      Credentials credentials = null; 
      Object attribute = session.getAttribute("org.jboss.seam.security.identity"); 
      if (attribute instanceof Identity) 
      { 
       identity = (Identity) attribute; 
      } 
      Object cred = session.getAttribute("org.jboss.seam.security.credentials"); 
      if (attribute instanceof Credentials) 
      { 
       credentials = (Credentials) cred; 
      } 

     } 
    } 
0

에서 심 구성 요소를 얻기 위해이 같은 것을 사용할 수 있습니다

주먹이 경우 사용자 로그인 세션 범위에 LoginUserMapLoginUserKeyMap을 outject.

LoginUserKeyMap은 시스템 지식 키로 userId를 저장합니다.

예 : 키 USER1, 값 : user120131010154566]

LoginUserMap 사용자 정보리스트에 기록 저장하는 것이다.

예 : 키 user120131010154566, 값 : 오브젝트]

/** 
* Bijection Login User Map. 
*/ 
@In(required = false, scope = ScopeType.APPLICATION, value = "loginUserMap") 
@Out(required = false, scope = ScopeType.APPLICATION, value = "loginUserMap") 
private Map<String, UserInfoBean> loginUserMap; 

/** 
* Bijection Login User Key Map. 
*/ 
@In(required = false, scope = ScopeType.APPLICATION, value = "loginUserKeyMap") 
@Out(required = false, scope = ScopeType.APPLICATION, value = "loginUserKeyMap") 
private Map<String, String> loginUserKeyMap; 

public void doLogin() { 

    // Generate User ID Key for duplicate user control. 
    String key = CommonUtil.convertDateToString(new Date(), KEY_PATTERN); 
    String userId = getCredentials().getUsername(); 
    String userIdKey = userId + key; 

    if (getLoginUserMap() == null || getLoginUserKeyMap() == null) { 

     // Initialize the Login User Map. 
     setLoginUserMap(new HashMap()); 

     // Initialize the Login User Key Map. 
     setLoginUserKeyMap(new HashMap()); 
    } 

    // Check login User id is already login or not. 
    if (getLoginUserKeyMap().containsKey(userId)) { 

     log.info("Duplicate Login"); 

     // Get Current logged in User's Key. 
     String CurrentUserKey = getLoginUserKeyMap().get(userId); 

     // Get Current logged in User Information. 
     UserInfoBean currentUserInfoBean = getLoginUserMap().get(CurrentUserKey); 

     if (currentUserInfoBean != null) { 

      // Set Duplicate flag true to Current logged User. 
      currentUserInfoBean.setDuplicate(true); 

      // Overwrite Current logged User Information. 
      getLoginUserMap().put(CurrentUserKey, currentUserInfoBean); 
     } 

    } 

    // Set New Login User Information. 
    getUserInfoBean().setUserId(userId); 
    getUserInfoBean().setUserIdKey(userIdKey); 
    getUserInfoBean().setDuplicate(false); 
    getUserInfoBean().setServiceStop(false); 

    // Set New Login User Information and Key to Application Scope. 
    getLoginUserKeyMap().put(userId, userIdKey); 
    getLoginUserMap().put(userIdKey, getUserInfoBean()); 

} 

다음은 checkStatus() 방법

public void checkStatus() throws DuplicateLoginException, UserServiceStopException { 

    if (getUserInfoBean() != null && getLoginUserMap() != null) { 

     UserInfoBean currentUser = getLoginUserMap().get(getUserInfoBean().getUserIdKey()); 

     if (currentUser != null) { 
      if (currentUser.isServiceStop()) { 
       log.error("throw new UserServiceStopException()"); 
       throw new UserServiceStopException(); 

      } else if (currentUser.isDuplicate()) { 
       log.error("throw new DuplicateLoginException()"); 
       throw new DuplicateLoginException(); 
      } 
     } 
    } 
} 

를 생성하고 모든 페이지 checkStatus() 그 메소드를 호출한다.

<page view-id="/view/*"> 
    <action execute="#{UserStatusChecker.checkStatus()}" /> 

이제 문제는 극복되었습니다 !!!!!