UserDetails
,重写getAuthorities
方法。public class LoginUser implements UserDetails {/*** 角色集合*/private Set roles;@JSONField(serialize = false)private List authorities;@Overridepublic Collection extends GrantedAuthority> getAuthorities() {if (Objects.nonNull(this.authorities)) {return this.authorities;}authorities = this.roles.stream().map(role -> new SimpleGrantedAuthority("ROLE_" + role)).collect(Collectors.toList());return authorities;}...
}
@EnableGlobalMethodSecurity
。@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {...
}
PreAuthorize
,本文使用@hasRole
在方法访问前进行角色校验。@GetMapping("my_info")
@PreAuthorize("hasRole('admin')")
public Result getMyInfo() {User user = userService.getMyInfo();return Result.success(user);
}
SecurityExpressionRoot
的hasAnyAuthorityName
方法中。getAuthoritySet
方法获取当前身份验证信息的角色列表,主要代码如下。if (this.roles == null) {Collection extends GrantedAuthority> userAuthorities = this.authentication.getAuthorities();...// 遍历userAuthorities,通过 GrantedAuthority 的 getAuthority 获取角色字符串,并添加到 set 集合中this.roles = AuthorityUtils.authorityListToSet(userAuthorities);
}
return this.roles;
@hasRole
中的角色(本文中只有 admin),如果当前登录信息的角色列表roleSet
包含该角色,则通过校验。注意:校验时,会自动给 hasRole 中的角色添加默认前缀 ROLE_,所以在重写 getAuthorities 时需要添加上对应前缀
上一篇:国际调解院今日落户香港
下一篇:缓存穿透、缓存击穿、缓存雪崩