4

我有一个用户可以拥有多个角色/权限的应用程序。每当用户遇到基于 @Secured("role") 注释拒绝访问的 url 时,我需要知道为什么在拒绝访问处理程序中拒绝访问(或者实际上是访问资源所需的角色)所以我可以将用户重定向到适当的页面。

传递给拒绝访问处理程序的参数不包含此类信息。

我可以创建一个自定义角色投票器,它会抛出自定义异常,我可以在 web.xml 中为其创建自定义错误页面,但不知何故,这感觉不是解决这种情况的正确方法。

这里最好的方法是什么?

4

1 回答 1

0

我最终创建了一个自定义访问决策管理器,类似于 AffirmativeBased 访问决策管理器:

public class ConfigAttributesIncludedInExceptionAffirmativeBasedAccessDecisionManager extends AbstractAccessDecisionManager

其中的代码与 AffirmativeBased 代码(无论如何都是小类)相同,我没有抛出 AccessDeniedException,而是抛出了自定义 AccessDeniedException。

throw new AccessDeniedExceptionWithConfigAttributes(messages.getMessage("AbstractAccessDecisionManager.accessDenied", "Access is denied"), configAttributes);

自定义访问被拒绝异常只是扩展了 AccessDeniedException 类并具有一个名为 configAttributes 的属性。

public class AccessDeniedExceptionWithConfigAttributes extends AccessDeniedException
{
private static final long   serialVersionUID    = 8733424338864969263L;

private Collection<ConfigAttribute> configAttributes;

public AccessDeniedExceptionWithConfigAttributes (String msg)
{
    super(msg);
}

public AccessDeniedExceptionWithConfigAttributes (String msg, Throwable t)
{
    super(msg, t);
}

public AccessDeniedExceptionWithConfigAttributes (String msg, Collection<ConfigAttribute> configAttributes)
{
    super(msg);
    this.setConfigAttributes(configAttributes);
}

public Collection<ConfigAttribute> getConfigAttributes()
{
    return configAttributes;
}

public void setConfigAttributes(Collection<ConfigAttribute> configAttributes)
{
    this.configAttributes = configAttributes;
}

}

从那里我可以简单地检查我的 AccessDeniedHandler 类是否 AccessDeniedException 是我的自定义异常类的一个实例,如果是,应用我需要的任何逻辑。

if(ade instanceof AccessDeniedExceptionWithConfigAttributes )
        {
            AccessDeniedExceptionWithConfigAttributes adeca = (AccessDeniedExceptionWithConfigAttributes ) ade;
            ...
        }

完全按照我想要的方式工作。但是,如果这不是正确的方法,我想听听。

于 2013-09-04T13:26:06.157 回答