我有一个用户可以拥有多个角色/权限的应用程序。每当用户遇到基于 @Secured("role") 注释拒绝访问的 url 时,我需要知道为什么在拒绝访问处理程序中拒绝访问(或者实际上是访问资源所需的角色)所以我可以将用户重定向到适当的页面。
传递给拒绝访问处理程序的参数不包含此类信息。
我可以创建一个自定义角色投票器,它会抛出自定义异常,我可以在 web.xml 中为其创建自定义错误页面,但不知何故,这感觉不是解决这种情况的正确方法。
这里最好的方法是什么?
我有一个用户可以拥有多个角色/权限的应用程序。每当用户遇到基于 @Secured("role") 注释拒绝访问的 url 时,我需要知道为什么在拒绝访问处理程序中拒绝访问(或者实际上是访问资源所需的角色)所以我可以将用户重定向到适当的页面。
传递给拒绝访问处理程序的参数不包含此类信息。
我可以创建一个自定义角色投票器,它会抛出自定义异常,我可以在 web.xml 中为其创建自定义错误页面,但不知何故,这感觉不是解决这种情况的正确方法。
这里最好的方法是什么?
我最终创建了一个自定义访问决策管理器,类似于 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;
...
}
完全按照我想要的方式工作。但是,如果这不是正确的方法,我想听听。