有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    接口返回集合,因此不能使用ArrayList强制转换。您必须使用集合:

    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    Collection<GrantedAuthority> authorities = authentication.getAuthorities();
    

    如果您想要一个arrayList,例如:

    List<GrantedAuthority> listAuthorities = new ArrayList<GrantedAuthority>();
    listAuthorities.addAll(authorities);
    

    如果您对Spring的内部行为感兴趣,我将在下面详细介绍。 接口指定集合(请参见https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/core/Authentication.java第68行):

    Collection<? extends GrantedAuthority> getAuthorities();
    

    默认抽象实现在内部使用ArrayList,但仍返回集合(请参见https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/authentication/AbstractAuthenticationToken.java行67-70):

        private final Collection<GrantedAuthority> authorities;
        ...
        ArrayList<GrantedAuthority> temp = new ArrayList<GrantedAuthority>(
                authorities.size());
        temp.addAll(authorities);
        this.authorities = Collections.unmodifiableList(temp);
    

    验证接口javadoc中详细说明了原因:“实现应确保对返回的集合数组的修改不会影响验证对象的状态,或者使用不可修改的实例。”

    这就是为什么你不能投。一篇评论建议创建一个新的ArrayList并在其中添加所有权限,如果您真的想要一个列表的话