java如何使用Spring Security正确获取与用户关联的授权列表?
我是Spring Security的新手,在尝试检索与特定用户相关的**授权的列表时遇到以下问题
因此,我有一种方法可以检索连接的用户(这很好):
protected CustomUserDetail getUtenteConnesso() {
return (CustomUserDetail) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}
然后我试着做:
ArrayList<GrantedAuthority> autorizzazioni = (ArrayList<GrantedAuthority>) getUtenteConnesso().getAuthorities();
要检索与此用户关联的GrantedAuthority列表,但执行此方法时会引发异常
我认为问题在于getAuthorities()方法的签名定义到**org中。springframework。安全果心用户详细信息。用户类别为:
public Collection<GrantedAuthority> getAuthorities() {
return authorities;
}
因此,该方法返回一个通用的集合接口
我试图将此集合转换为阵列列表,但似乎无法工作
怎么了?我错过了什么?我如何解决这个问题
# 1 楼答案
接口返回集合,因此不能使用ArrayList强制转换。您必须使用集合:
如果您想要一个arrayList,例如:
如果您对Spring的内部行为感兴趣,我将在下面详细介绍。 接口指定集合(请参见https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/core/Authentication.java第68行):
默认抽象实现在内部使用ArrayList,但仍返回集合(请参见https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/authentication/AbstractAuthenticationToken.java行67-70):
验证接口javadoc中详细说明了原因:“实现应确保对返回的集合数组的修改不会影响验证对象的状态,或者使用不可修改的实例。”
这就是为什么你不能投。一篇评论建议创建一个新的ArrayList并在其中添加所有权限,如果您真的想要一个列表的话