Java 如何在web应用程序中构建良好的安全体系结构?
我想在应用程序中实现动态安全性(SpringBoot、SpringMVC、SpringSecurity、thymeleaf) 我想在我的web应用页面中添加,用户/管理员可以在其中添加一些新权限(仅名称)。 在另一个页面中,他将能够添加例如菜单中的新位置(或新字段或新选项卡)。 当他添加这个新项目时,他应该有选择权选择用户应该有哪些权限来查看这个新的菜单位置(对于字段,将有一个查看权限和一个编辑权限) 你有办法做这样的事吗? 我在春季安全会议上考虑过ALC,但我现在不知道这是个好选择 也许有一种方法可以使用Java 如何在web应用程序中构建良好的安全体系结构?,java,spring,spring-security,Java,Spring,Spring Security,我想在应用程序中实现动态安全性(SpringBoot、SpringMVC、SpringSecurity、thymeleaf) 我想在我的web应用页面中添加,用户/管理员可以在其中添加一些新权限(仅名称)。 在另一个页面中,他将能够添加例如菜单中的新位置(或新字段或新选项卡)。 当他添加这个新项目时,他应该有选择权选择用户应该有哪些权限来查看这个新的菜单位置(对于字段,将有一个查看权限和一个编辑权限) 你有办法做这样的事吗? 我在春季安全会议上考虑过ALC,但我现在不知道这是个好选择 也许有一种
@PreAuthorize(“hasRole()”)
?
或者添加类似“组件”表的内容,当我将放置用户添加的所有ITME时。在这个表中会有“编辑权限”和“查看权限”这样的列,我会在其中放置权限id,并在我获取菜单项、字段的所有方法中检查这个表
也许这是一个很好的解决方案,bee将拥有自己的实施权限Evaluator?我认为您需要在数据库中创建具有权限的角色枚举
| ID |角色|工作区|读|写|删除|
|1 | Admin | Dashbord | TRUE | TRUE | TRUE |
| 2 |管理|员工|真实|真实|真实|
| 3 |管理|项目|正确|正确|正确|
| 4 |管理|任务|正确|正确|正确|
| 5 |管理|团队|正确|正确|正确|
| 6 | Pm | Dashbord |真|假|假|
| 7 | Pm |员工|真|假|假|
| 8 | Pm | Project | TRUE | TRUE | TRUE |
| 9 | Pm | Task | TRUE | TRUE | TRUE |
| 10 | Pm |团队|真|假|假|
| 11 |组长|达什博德|真|假|假|
| 12 |团队领导|员工|真实|真实|真实|
| 13 |团队领导|项目|真|假|假|
| 14 |团队领导|任务|真|假|假|
| 15 |团队领导|团队|正确|正确|正确|
| 16 | User | Dashbord | FALSE | FALSE | FALSE
| 17 |用户|员工|真|假|假|
| 18 |用户|项目|真|假|假|
| 19 |用户|任务|真|真|假|
| 20 |用户|团队|真|假|假|
@Basic
@Enumerated(EnumType.STRING)
私有角色userRole代码>
创建自定义批注界面按角色权限检查当前用户
@保留(RetentionPolicy.RUNTIME)
公共@接口许可检查
{
@Aspect@Component公共类PermissionAspect{
@Autowired
private PermissionRepository permissionRepository;
@Around("execution(@com.security.annotation.springbootsecuritypermission
.aspect.PermissionCheck
**(..)&&&@注释(权限检查)
公共对象剂量测量(ProceedingJoinPoint pjp,PermissionCheck>PermissionCheck)抛出可丢弃{
如果(permissionCheck.workspace().length>0
&&SecurityUtil.getUser()!=null){
List permissionList=permissionRepository.findByRolesAndWorkspaceIn(
SecurityUtil.getUser().getRoles(),permissionCheck.workspace()
Function permissionFunction=新函数(){
@凌驾
公共布尔应用(PermissionEntity PermissionEntity){
if(permissionCheck.read()&&permissionEntity.getRead()){
返回true;
}
if(permissionCheck.write()&&permissionEntity.getWrite()){
返回true;
}
if(permissionCheck.delete()&&permissionEntity.getDelete()){
返回true;
}
返回false;
}
};
最终布尔值[]hasPermission={false};
permissionList.forEach(permissionEntity->{
hasPermission[0]=permissionFunction.apply(permissionEntity);
如果(拥有权限[0]){
返回;
}
});
如果(!hasPermission[0]){
抛出新的AccessDeniedException(“没有权限”);
}
}
返回pjp.procedure();
} }
可以对方法使用自定义注释
@GetMapping(“仪表板”)@PermissionCheck(工作区)=
{Workspace.DASHBOARD},read=true)公共字符串DASHBOARD(){
返回“仪表板”;}
如果您不太了解我,可以打开此链接。我认为您需要在数据库中创建具有权限的角色枚举
角色枚举
权限表
| ID |角色|工作区|读|写|删除|
|1 | Admin | Dashbord | TRUE | TRUE | TRUE |
| 2 |管理|员工|真实|真实|真实|
| 3 |管理|项目|正确|正确|正确|
| 4 |管理|任务|正确|正确|正确|
| 5 |管理|团队|正确|正确|正确|
| 6 | Pm | Dashbord |真|假|假|
String[] workspace() default {};
boolean read() default false;
boolean write() default false;
boolean delete() default false; }
@Autowired
private PermissionRepository permissionRepository;
@Around("execution(@com.security.annotation.springbootsecuritypermission
Function<PermissionEntity,Boolean> permissionFunction = new Function<PermissionEntity, Boolean>() {
@Override
public Boolean apply(PermissionEntity permissionEntity) {
if(permissionCheck.read() && permissionEntity.getRead()) {
return true;
}
if(permissionCheck.write() && permissionEntity.getWrite()) {
return true;
}
if(permissionCheck.delete() && permissionEntity.getDelete()) {
return true;
}
return false;
}
};
final boolean[] hasPermission = {false};
permissionList.forEach(permissionEntity -> {
hasPermission[0] = permissionFunction.apply(permissionEntity);
if(hasPermission[0]){
return;
}
});
if(!hasPermission[0]){
throw new AccessDeniedException("Do not has permission");
}
}
return pjp.proceed();
} }