2016-06-28 7 views
0

Ich habe eine Java Spring Bean namens SessionBean, die von mehreren Benutzern geteilt wird. Wenn ein neuer Benutzer auf meine Anwendung zugreift, wird eine Instanz von SessionBean erstellt. Diese Bean soll die ID- und Privilegieninformationen eines Benutzers enthalten, die bestimmen, was sie in meiner App sehen können. Wenn ein zweiter Benutzer jedoch gleichzeitig mit dem ersten Benutzer auf die Anwendung zugreift, wird die erstellte Bean durch die Anmeldeinformationen des zweiten Benutzers überschrieben, und beide Benutzer verwenden diese überschriebenen Anmeldeinformationen. Wie mache ich es so, dass jeder User SessionBean unabhängig von anderen Nutzern ist?Spring - SessionBean Instanz wird von mehreren Benutzern in Java geteilt

MainController.java

package com.trac.controller; 

import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServletRequest; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.servlet.ModelAndView; 

import com.trac.verification.*; 
import com.trac.bean.SessionBean; 

@Controller 
public class MainController { 

private CompanyOrgVerification org = new CompanyOrgVerification(); 

@Autowired 
private SessionBean session; 
@Autowired 
private RacfGroupData racfGroup; 

//returns the agent search page 
@RequestMapping(URIConstants.WELCOME_PAGE) 
public ModelAndView welcome(HttpServletRequest request){ 

    this.session = new SessionBean(); 

    String userId = request.getHeader("x-user"); 
    System.out.println(userId.trim()); 
    session.setUserId(userId.trim()); 

    if(racfGroup.getRacfGroups(session.getUserId())){ 
     session.setPermission("INFOA", "U"); //Granting the default permissions to anyone with access to the application. 
     return new ModelAndView("index"); 
    }else{ 
     ModelAndView error = new ModelAndView(); 
     error.setViewName("error"); 
     return error; 

    } 
} 


//returns the agent profile page 
@RequestMapping(value = URIConstants.PROFILE_PAGE) 
public ModelAndView profile(HttpServletRequest request){ 
    Cookie[] cookies = request.getCookies(); 
    String profileEntityNo = ""; 
    for(int i=0; i<cookies.length; i++){ 

     String cookieName = cookies[i].getName().toUpperCase(); 

     switch(cookieName){ 
      case "ENTITYNO": profileEntityNo = cookies[i].getValue().toString().trim(); 
       break; 
      case "STATE": cookies[i].getValue().toString().trim(); 
       break; 
      case "NAME": cookies[i].getValue().replace("%20", " ").replace("%2C", ",").trim(); 
       break; 
      case "DISTRICT": cookies[i].getValue().toString().trim(); 
       break; 
     } 
    } 
    if(session.hasAccessToApp()){ //check if user is authorized to access page 
     int structureNo = 3; //company org structure number 
     String structureCd = "ORG"; 
     org.setSessionBean(session); 
     org.setProfilePrivileges(profileEntityNo, structureCd, structureNo); 
     this.setSessionBean(org.getSessionBean()); 

     ModelAndView profile = new ModelAndView(); 
     profile.setViewName("profile"); 
     profile.addObject("userId", session.getUserId()); 
     profile.addObject("privileges", session.getProfilePrivileges()); 
     profile.addObject("accessType", session.getAccessType()); 

     return profile; 
    }else{ 
     return new ModelAndView("error"); 
    } 
} 

public SessionBean getSessionBean(){ 
    return session; 
} 
public void setSessionBean(SessionBean session){ 
    this.session = session; 
} 
public RacfGroupData getRacfGroup(){ 
    return racfGroup; 
} 
public void setRacfGroup(RacfGroupData racfGroup){ 
    this.racfGroup = racfGroup; 
} 

} 

SessionBean.java

package com.trac.bean; 

import org.springframework.context.annotation.Scope; 
import org.springframework.stereotype.Component; 
import org.springframework.context.annotation.ScopedProxyMode; 


@Component 
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class SessionBean { 

private String userId; 
private String permission = ""; 
private final int grant_InfoA = 0; 
private final int grant_Trac = 1; 
private final int grant_Term = 2; 
private final int grant_Conf = 3; 
private final int grant_Mark = 4; 
private boolean[] profilePrivileges = new boolean [ 5 ]; //holds the user privileges for a profile 
private String[] accessType = new String[5]; 

public void setPermission(String permissionValue, String type){ 
    try{ 
     permission = permissionValue; 
     setPrivileges(type); 
    }catch(Exception e){ 
     System.out.println("Exception caught in SessionBean - setPermission. "+e.toString()); 
    } 
} 

public void setPrivileges(String type){ 
try{ 
     System.out.println("***Permission String: " + this.permission + "***"); 
    //Default Permission 
     if(permission.equals("INFOA")){ 
      profilePrivileges[grant_InfoA] = true; 
      accessType[grant_InfoA] = type; 
      System.out.println("***Granted access to the application***"); 
     } 
    //Subsidy Tab Permission 
     else if(permission.equals("TRAC")){ 
      profilePrivileges[grant_Trac] = true; 
      accessType[grant_Trac] = type; 
      System.out.println("***Granted access to Trac subsidy***"); 
     } 
    //Termination Tab Permission 
     else if(permission.equals("TERM")){ 
      profilePrivileges[grant_Term] = true; 
      accessType[grant_Term] = type; 
      System.out.println("***Granted access to termination info***"); 
     } 
    //Conference Tab Permission 
     else if(permission.equals("CONF")){ 
      profilePrivileges[grant_Conf] = true; 
      accessType[grant_Conf] = type; 
      System.out.println("***Granted access to conference info***"); 
     } 
    //Service/Transfer & Term Tabs Permission 
     else if(permission.equals("MARK")){ 
      profilePrivileges[grant_Mark] = true; 
      accessType[grant_Mark] = type; 
      System.out.println("***Granted access to Service/Transfer and Term tabs***"); 
     } 
     else{ 
     System.out.println("No privileges set. Permission string is: " 
      + permission); 
     } 
    }catch (Exception e){ 
     System.out.println("^^^^ Exception caught in SessionBean." 
      + "setPrivileges ^^^^\n" + e.toString()); 
    } 
} 

public String getUserId() { 
    return userId; 
} 
public void setUserId(String userId) { 
    this.userId = userId.toUpperCase(); 
} 
public boolean hasAccessToApp(){ 
    if(profilePrivileges[grant_InfoA] == true){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

public boolean[] getProfilePrivileges(){ 
    return profilePrivileges; 
} 

public String[] getAccessType(){ 
    return accessType; 
} 

} 
+2

Was denkst du 'this.session = new SessionBean();' tut? –

+0

Ich hatte ein Problem mit dem Privilegien-Array, das mit mehreren Benutzern individuellen Privilegien gefüllt wurde. Sagen wir, dass sich Benutzer A anmeldet und TRAC aber nicht, TERM oder CONF sehen darf. Wenn sich Benutzer B angemeldet hat, der TERM, aber nicht TRAC sehen kann, ist das Session Bean-Rechte-Array sowohl für TRAC als auch für TERM wahr, sodass beide Benutzer Daten sehen können, die sie nicht sollten. Durch die Verwendung von so.session = new SessionBean() habe ich eine neue Sitzung erstellt, wenn jemand auf die App zugreift und die Freigabe von Berechtigungen verhindert. – Karson074

+0

Vergiss deinen Anwendungsfall für eine Sekunde. Wenn Sie das Objekt selbst erstellen, wie wird Spring beteiligt sein? –

Antwort

0

Ok, das ist wirklich nicht die Lösung, die ich suchte, aber es bekam den Job zu erledigen. Was ich getan habe, war in der profile() - Funktion der MainController-Klasse Ich zog die userId aus der Kopfzeile, wie ich in der Funktion Willkommen() und in der Sitzung zurückgesetzt. Ich habe dann eine neue Funktion in der SessionBean erstellt, die die Privilegien und accessType-Arrays zurückgesetzt und in der profile() - Funktion des MainControllers aufgerufen hat. Dies erlaubte mir, die richtigen Privilegien für einen Benutzer ohne Kreuzkontamination von anderen Benutzerprivilegien zu ziehen.

Wenn jemand eine bessere Lösung hat, bin ich mehr als glücklich, sie zu hören.

Verwandte Themen