我有一个应用程序,用户可以拥有多个角色/权限。每当用户基于@Secured(“role”)注释碰到拒绝访问的URL时,我需要知道访问被拒绝处理程序(或实际访问资源所需的角色)中拒绝访问的原因所以我可以将用户重定向到适当的页面。
传递给访问被拒绝处理程序的参数不包含此类信息。
我可以创建一个自定义角色选民,它可以抛出我可以在web.xml中创建自定义错误页面的自定义异常,但不知何故,这对于这种情况感觉不正确。
这里最好的方法是什么?
答案 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;
...
}
完全符合我的要求。但是,如果这不是正确的方法,我希望听到它。