在Spring安全访问被拒绝处理程序中确定所需权限的正确方法

时间:2013-08-29 17:26:46

标签: java spring spring-security

我有一个应用程序,用户可以拥有多个角色/权限。每当用户基于@Secured(“role”)注释碰到拒绝访问的URL时,我需要知道访问被拒绝处理程序(或实际访问资源所需的角色)中拒绝访问的原因所以我可以将用户重定向到适当的页面。

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

我可以创建一个自定义角色选民,它可以抛出我可以在web.xml中创建自定义错误页面的自定义异常,但不知何故,这对于这种情况感觉不正确。

这里最好的方法是什么?

1 个答案:

答案 0 :(得分: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;
            ...
        }

完全符合我的要求。但是,如果这不是正确的方法,我希望听到它。