Spring security Acegi安全性:如何向匿名用户的身份验证添加另一个授权

Spring security Acegi安全性:如何向匿名用户的身份验证添加另一个授权,spring-security,roles,anonymous,Spring Security,Roles,Anonymous,我给用户提供了一个带有访问密钥的特殊URL。与简单的匿名用户相比,通过这个特殊的url访问公共页面的用户应该能够看到一些额外的数据 我想根据请求中提供的参数为匿名用户赋予一些额外的角色,以便在模板中执行类似操作: <@sec.authorize ifAnyGranted="ROLE_ADMIN, ROLE_USER, ROLE_INVITED_VISITOR"> ...some additional stuff for invited user to see </@sec.au

我给用户提供了一个带有访问密钥的特殊URL。与简单的匿名用户相比,通过这个特殊的url访问公共页面的用户应该能够看到一些额外的数据

我想根据请求中提供的参数为匿名用户赋予一些额外的角色,以便在模板中执行类似操作:

<@sec.authorize ifAnyGranted="ROLE_ADMIN, ROLE_USER, ROLE_INVITED_VISITOR">
...some additional stuff for invited user to see
</@sec.authorize>

为什么不创建一个委托给原始类的包装类,而是添加两个额外的授权:

公共类AuthenticationWrapper实现身份验证
{
私人认证原件;
私人授权机构[]外部角色;
公共AuthenticationWrapper(身份验证原始,授权机构[]外部角色)
{
this.original=原件;
this.extraRoles=extraRoles;
}
公共授权机构[]获取授权机构()
{
GrantedAuthority[]originalRoles=original.getAuthories();
GrantedAuthority[]角色=新的GrantedAuthority[originalRoles.length+extraRoles.length];
System.arraycopy(originalRoles,0,roles,0,originalRoles.length);
System.arraycopy(extraRoles,0,roles,originalRoles.length,extraRoles.length);
返回角色;
}
公共字符串getName(){return original.getName();}
公共对象getCredentials(){返回原始.getCredentials();}
公共对象getDetails(){return original.getDetails();}
公共对象getPrincipal(){return original.getPrincipal();}
公共布尔值isAuthenticated(){返回原始值。isAuthenticated();}
public void setAuthenticated(布尔值isAuthenticated)引发IllegalArgumentException
{
原件。setAuthenticated(已验证);
}  
}
然后在过滤器中执行此操作:

Authentication auth=SecurityContextHolder.getContext().getAuthentication();
GrantedAuthority extraRoles=新的GrantedAuthority[2];
extraRoles[0]=新授权的AuthorityImpl(“角色X”);
extraRoles[1]=新授予的AuthorityImpl(“角色Y”);
AuthenticationWrapper=新的AuthenticationWrapper(身份验证,外部角色);
SecurityContextHolder.getContext().setAuthentication(包装器);

身份验证现在由您的版本替换为附加角色。注意:您可能必须处理身份验证尚未通过身份验证的情况,因此其getAuthories()返回null。(包装器实现当前假定它将始终从包装的身份验证中获得非空数组)

nice one!我自己通过创建一个新的匿名身份验证令牌和其他角色来解决这个问题,但这要优雅得多。谢谢