2011-01-08 6 views
3

in meinem Abfangjäger, wenn der Benutzer nicht genug Recht hat, gäbe es eine Meldung warnen sein:Struts 2, wie in einem Interceptor gespeicherte Nachrichten angezeigt werden, die zu einer anderen Aktion umleiten würden?

public String intercept(ActionInvocation invocation) throws Exception { 

    ActionContext actionContext = invocation.getInvocationContext(); 
    Map<String, Object> sessionMap = actionContext.getSession(); 
    User loginUser = (User) sessionMap.get("user"); 

    Object action = invocation.getAction(); 

    if (loginUser != null && loginUser.getRole().getId() != Constant.AUTHORITY_ADMIN) { 

     ((ValidationAware) action).addFieldError("user.authority", 
       ((DefaultAction) action).getText("user.action.authority.not.enough")); 

     return DefaultAction.HOME_PAGE; 
    } 

    return invocation.invoke(); 
} 

dann wäre es auf „Home_Page“ Aktion, wenn der Erfolg, Anzeigeinformationen in den jsp umleiten. So, wie man die Warnenachricht anzeigt?

i zwei Abfangjäger verwendet haben in strust.xml configed, für die Admin-Recht Requirment:

  <interceptor-stack name="authorityStack"> 
      <interceptor-ref name="authority" /> 
      <interceptor-ref name="defaultStack" /> 
      <interceptor-ref name="store"> 
       <param name="operationMode">STORE</param> 
      </interceptor-ref> 
     </interceptor-stack> 

Standard ist:

<interceptor-stack name="default"> 
      <interceptor-ref name="login" /> 
      <interceptor-ref name="defaultStack" /> 
      <interceptor-ref name="store"> 
       <param name="operationMode">AUTOMATIC</param> 
      </interceptor-ref> 
     </interceptor-stack> 
+0

Suchen Sie nur nach einem Mechanismus zum Anzeigen einer Nachricht an einen Benutzer, wenn sie versuchen, eine Aktion aufzurufen, auf die sie keinen Zugriff haben? –

+0

Ja, ich möchte dem Benutzer mitteilen, dass er kein Zugriffsrecht hat. – mui13

Antwort

3

Hier ist, wie ich Zugriffskontrolle in Struts2 behandeln. Es ist wirklich einfach und ziemlich wiederverwendbar:

Zuerst erstellen Sie eine Schnittstelle namens SecurityCheckAware.

public interface SecurityCheckAware { 
    void checkRight(); 
} 

Erstellen Sie dann ein Abfangjäger genannt SecurityCheckInterceptor.

public class SecurityCheckInterceptor extends AbstractInterceptor { 
    @Override 
    public String intercept(final ActionInvocation invocation) throws Exception { 
     if (invocation.getAction() instanceof SecurityCheckAware) { 
      SecurityCheckAware action = (SecurityCheckAware) invocation.getAction(); 
      action.checkRight(); 
     } 

     return invocation.invoke(); 
    } 
} 

Dann die Abfangjäger in Ihrem Stapel definieren.

Jede Aktion, für die Sie Sicherheitsüberprüfungen durchführen möchten, sollte SecurityCheckAware implementieren. Beispiel:

@Override 
public void checkRight() { 
    User loginUser = (User) session.get("user"); 
    if (loginUser != null && loginUser.getRole().getId() != Constant.AUTHORITY_ADMIN) { 
     throw new AccessViolation("You do not have permission to access this page."); 
    } 
} 

Erstellen Sie als nächste eine benutzerdefinierte Ausnahme, die RuntimeException (oder eine Unterklasse davon) erweitert. Ich nenne es AccessViolation.

Schließlich Karte AccessViolation auf eine Fehlerseite in Ihrem struts.xml, wie zum Beispiel:

<global-results> 
    <result name="accessDenied">/WEB-INF/jsp/accessDenied.jsp</result> 
</global-results> 

<global-exception-mappings> 
    <exception-mapping exception="com.example.AccessViolation" result="accessDenied"/> 
</global-exception-mappings> 

Hinweis: Sie können von vorne gehen, um die SecurityCheckAware und SecurityCheckInterceptor und verwenden nur die bestehende Preparable und PrepareInterceptor, aber ich wie in der Lage, meine Sicherheitsüberprüfungen in ihrer eigenen Methode einzukapseln.

Dies ist nicht auf Umleitung oder Aktion/Feld Fehler angewiesen (wie in Ihrer Frage), aber es sollte alles liefern, was Sie suchen.