Вот как я управляю контролем доступа в 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
, но мне нравится иметь возможность инкапсулировать мои проверки безопасности их собственным методом.
Это не зависит от перенаправления или ошибок действия / поля (как в вашем вопросе), но должно доставить все, что вы ищете.