KaiwuDB 社区官方号
二、鉴权模块构建
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);
}三、总结