今天,我发现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批注识别角色。而且,周围有括号。
第一个屏幕截图显示了当前需要有效优化的解决方案:
第二种灵魂:
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>>
感谢您的帮助。