2011-01-08 4 views
3

в моем перехватчика, если пользователь не имеет достаточно права, было бы сообщение предупреждают:Struts 2 как отображать сообщения, сохраненные в перехватчике, которые перенаправляют на другое действие?

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(); 
} 

тогда, было бы перенаправить на «HOME_PAGE» действие, если успех, отображение информации в СПЯ. Итак, как отобразить предупреждение?

я использовал два перехватчики configed в strust.xml, для администратора правой: требование

  <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> 

умолчанию:

<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

Вы просто ищете механизм для отображения сообщения пользователю, если они пытаются вызвать действие, к которому у них нет доступа? –

+0

Да, я хочу сказать пользователю, что он не имеет права доступа. – mui13

ответ

3

Вот как я ручка управления доступом в Struts2. Это действительно легко и вполне можно использовать:

Сначала создайте интерфейс под названием SecurityCheckAware.

public interface SecurityCheckAware { 
    void checkRight(); 
} 

Затем создайте перехватчик под названием 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(); 
    } 
} 

Затем определите перехватчик в вашем стеке.

Любое действие, которое вы хотите выполнить проверки безопасности, должно выполнить SecurityCheckAware. Например:

@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."); 
    } 
} 

Затем создайте собственное исключение, которое расширяет исключение RuntimeException (или некоторый его подкласс). Я называю это AccessViolation.

Наконец, карта AccessViolation на страницу ошибки в вашем struts.xml, такие как:

<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> 

Примечание: Вы можете Переднюю пойти SecurityCheckAware и SecurityCheckInterceptor и просто использовать существующие Preparable и PrepareInterceptor, но я например, возможность инкапсулировать мои проверки безопасности в их собственный метод.

Это не относится к ошибкам перенаправления или действия/поля (как в вашем вопросе), но оно должно доставить все, что вы ищете.