二、鉴权模块构建
http.authorizeRequests().withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>(){ @Override public < 0 extends FilterSecurityInterceptor > 0 postProcess(0 o){ o.setAccessDecisionManager(new AffirmativeBased(Arrays.asList(new WebExpressionVotor(),userAccessDecisionVoter)));//决策管理器 o.setSecurityMetadataSource(userFilterInvocationSecurityMetadataSource);//安全元数据 return o; } }};
在这里我们使用 AffirmativeBased 投票器进行投票,是因为进行自定义过滤的过程中,我们并没有包含 Spring 默认的属性,因此 WebExpressionVoter 会自动弃权,剩余步骤自然由我们自己的投票器 UserAccessDecisionVoter 进行投票和鉴权。
@Component public class UserAccessDecisionVoter implements AccessDecisionVoter<FilterInvocation> { @Override public boolean supports(ConfigAttribute attribute) { return true; } @Override public boolean supports(Class<?> clazz) { return true; } @Autowired AnalysisUserRoleUtil analysisUserRoleUtil; @Autowired JwtConfig jwtConfig; /** * @param authentication 用户信息 * @param filterInvocation 请求信息 * @param attributes 安全配置属性,这里指的是角色 * @return 1:同意、-1:反对,返回1时表示有访问权限,-1表示没有访问权限 */ @Override public int vote(Authentication authentication, FilterInvocation filterInvocation, Collection<ConfigAttribute> attributes) { assert authentication != null; assert filterInvocation != null; // 没有URL, 拒绝访问 String requestURL = getRequestURL(attributes); if (null == requestURL) { return AccessDecisionVoter.ACCESS_DENIED; } // 匿名用户, 拒绝访问 String userName = authentication.getPrincipal().toString(); if (userName.equals("anonymousUser")) { return AccessDecisionVoter.ACCESS_DENIED; } // 获取用户信息 SystemUser systemUser = systemUserService.queryUserByName(userName); // 任何人不能删除自己 if (this.isDeletingSelf(requestURL, systemUser)) { return AccessDecisionVoter.ACCESS_DENIED; } // 依据不同的权限判断是否需要同意操作 if (analysisUserRoleUtil.isSuperAdmin(systemUser)) { return this.superAdminPrivilegeCheck(requestURL, systemUser); } if (analysisUserRoleUtil.isInSuperAdminGroup(systemUser)) { return this.superAdminGroupMemberPrivilegeCheck(requestURL, systemUser); } if (analysisUserRoleUtil.isGroupAdmin(systemUser)) { return this.groupAdminPrivilegeCheck(requestURL, systemUser); } return this.regularUserPrivilegeCheck(requestURL, systemUser); }
三、总结