gpt4 book ai didi

spring-security - Acegi 安全 : How do i add another GrantedAuthority to Authentication to anonymous user

转载 作者:行者123 更新时间:2023-12-05 00:09:32 27 4
gpt4 key购买 nike

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

我想根据请求中提供的参数给匿名用户一些额外的角色,这样我就可以在我的模板中做这样的事情:

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

目前我正在实现 Spring 的 OncePerRequestfilter :

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
if (null != request.getParameter("accessKey")) {
if(isValid(request.getParameter("accessKey"))) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
//how do i add additional roles to authenticated (potentially anonymous) user?
}
}
}

最佳答案

为什么不直接创建一个委托(delegate)给原始的包装类,而是添加几个额外的 GrantedAuthorities:

public class AuthenticationWrapper implements Authentication
{
private Authentication original;
private GrantedAuthority[] extraRoles;

public AuthenticationWrapper( Authentication original, GrantedAuthority[] extraRoles )
{
this.original = original;
this.extraRoles = extraRoles;
}

public GrantedAuthority[] getAuthorities()
{
GrantedAuthority[] originalRoles = original.getAuthorities();
GrantedAuthority[] roles = new GrantedAuthority[originalRoles.length + extraRoles.length];
System.arraycopy( originalRoles, 0, roles, 0, originalRoles.length );
System.arraycopy( extraRoles, 0, roles, originalRoles.length, extraRoles.length );
return roles;
}

public String getName() { return original.getName(); }
public Object getCredentials() { return original.getCredentials(); }
public Object getDetails() { return original.getDetails(); }
public Object getPrincipal() { return original.getPrincipal(); }
public boolean isAuthenticated() { return original.isAuthenticated(); }
public void setAuthenticated( boolean isAuthenticated ) throws IllegalArgumentException
{
original.setAuthenticated( isAuthenticated );
}
}

然后在您的过滤器中执行此操作:

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
GrantedAuthority extraRoles = new GrantedAuthority[2];
extraRoles[0] = new GrantedAuthorityImpl( "Role X" );
extraRoles[1] = new GrantedAuthorityImpl( "Role Y" );
AuthenticationWrapper wrapper = new AuthenticationWrapper( auth, extraRoles );
SecurityContextHolder.getContext().setAuthentication( wrapper );

身份验证现在被您的具有额外角色的版本替换。 NB 您可能必须处理 Authentication 尚未通过身份验证的情况,因此其 getAuthorities() 返回 null。 (包装器实现当前假设它总是从其包装的身份验证中获取一个非空数组)

关于spring-security - Acegi 安全 : How do i add another GrantedAuthority to Authentication to anonymous user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/283870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com