@PreAuthorize注释无法识别角色集合

时间:2019-05-16 10:16:50

标签: java spring-security jwt authorization

今天,我发现JWT授权和@PreAuthorize批注存在问题。即,使用@PreAuthorize用法查找正确的角色存在问题。

我以前的方法,来自SecurityUtil类的getAuthorities():

 public class SecurityUtil {

  private static String AUTHORITIES_KEY = "AUTHORITIES";

  public static UserPrincipal getPrinciple() {
    return (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
  }

  public static Set<GrantedAuthority> getAuthorities(Claims claims) {
    return Arrays.stream(claims.get(AUTHORITIES_KEY).toString().split(", "))
        .map(SimpleGrantedAuthority::new)
        .collect(Collectors.toSet());
  }
}

随附一个附加集合,我们可以在“权限->角色”部分的第二个屏幕截图中看到该集合。此解决方案无法通过控制器中的@PreAuthorize批注识别角色。而且,周围有括号。

New version

Old version

第一个屏幕截图显示了当前需要有效优化的解决方案:

第二种灵魂:

public static Set<SimpleGrantedAuthority> getAuthorities(Claims claims) {
    return ((ArrayList<HashMap<String, String>>) claims.get(AUTHORITIES_KEY)).stream()
    .map(HashMap::values)
    .map(Object::toString)
    .map(s -> s.replace("[", "")
    .replace("]", ""))
    .map(SimpleGrantedAuthority::new)
    .collect(Collectors.toSet());
}

到目前为止对我来说还算不错,但是我有两个问题,即: 是否有机会美化代码以改善其优化 以及如何摆脱

行中出现的IntellJ提示
((ArrayList<HashMap<String, String>>) claims.get(AUTHORITIES_KEY))

其调用方式如下:

Unchecked cast 'java.lang.Object' to 'java.util.ArrayList<java.util.HashMap<java.lang.String, java.lang.String>>

感谢您的帮助。

0 个答案:

没有答案