簡體   English   中英

如何使用Spring Security正確獲取與用戶關聯的GrantedAuthority列表?

[英]How can I correctly obtain the list of GrantedAuthority associated to an user using Spring Security?

我在Spring Security中是一個新手,嘗試檢索與特定用戶相關的** GrantedAuthority列表時遇到以下問題。

所以我有這種方法可以檢索連接的用戶(可以正常工作):

protected CustomUserDetail getUtenteConnesso() {
    return (CustomUserDetail) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}

然后我正在嘗試做:

ArrayList<GrantedAuthority> autorizzazioni = (ArrayList<GrantedAuthority>) getUtenteConnesso().getAuthorities();

檢索與此用戶關聯的GrantedAuthority列表,但是當我執行此方法時,將引發異常。

我認為問題在於, getAuthorities()方法的簽名定義到org.springframework.security.core.userdetails.User類中:

public Collection<GrantedAuthority> getAuthorities() {
    return authorities;
}

因此,該方法返回通用的Collection接口。

我試圖將這個Collection強制轉換為ArrayList,但似乎無法正常工作。

怎么了? 我想念什么? 我該如何解決這個問題?

接口返回一個集合,因此無法使用ArrayList進行強制轉換。 您必須使用Collection:

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,但是無論如何都會返回一個Collection(參見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並在其中添加所有Authorities的注釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM