mall商城的授权和认证通过SpringSecurity和jwt来实现,具体可以参考这篇文章
https://mp.weixin.qq.com/s/HFAfcSGANrdVJeTmT-7X_A
这里我们看下mall商城后台的操作是怎么控制到每个方法的权限上面的,
mall商城的所有操作权限都是存储到ums_permission 表中,
然后在每个操作方法上面添加注解来进行判断
@PreAuthorize("hasAuthority('pms:brand:update')")
@ApiOperation(value = "更新品牌")
@RequestMapping(value = "/update/{id}", method = RequestMethod.POST)
@ResponseBody
@PreAuthorize("hasAuthority('pms:brand:update')")
public CommonResult update(@PathVariable("id") Long id,
@Validated @RequestBody PmsBrandParam pmsBrandParam,
BindingResult result) {
CommonResult commonResult;
int count = brandService.updateBrand(id, pmsBrandParam);
if (count == 1) {
commonResult = CommonResult.success(count);
} else {
commonResult = CommonResult.failed();
}
return commonResult;
}
通过hasAuthority来判断是否有操作权限,那问题来了,我们怎么那方面前面的权限标记和数据库中的权限做比较来判断那,
首先用户登录的时候,会获取到当前用户的所有权限,并添加到权限集合
SecurityConfig 中的userDetailsService会获取到当前用户的所有权限集合
@Bean
public UserDetailsService userDetailsService() {
//获取登录用户信息
return username -> {
UmsAdmin admin = adminService.getAdminByUsername(username);
if (admin != null) {
List<UmsPermission> permissionList = adminService.getPermissionList(admin.getId());
return new AdminUserDetails(admin,permissionList);
}
throw new UsernameNotFoundException("用户名或密码错误");
};
}
然后通过SimpleGrantedAuthority,把数据库中读取出来的权限添加到认证集合中,
AdminUserDetails实现UserDetails接口,getAuthorities 可以获取当前所拥有的权限
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<? extends GrantedAuthority> list=permissionList.stream()
.filter(permission -> permission.getValue()!=null)
.map(permission ->new SimpleGrantedAuthority(permission.getValue()))
.collect(Collectors.toList());
//返回当前用户的权限
return list;
}
如果controller中的方法注解里面的权限在权限集合中,表明当前用户有权限,否则则表示没有,这些SpringSecurity中的
hasAuthority默认帮我们实现了判断,其实就是字符串的精确匹配。
最后 SpringSecurity博大精深,我们还要好好了解学习。