Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在web应用程序中构建良好的安全体系结构?_Java_Spring_Spring Security - Fatal编程技术网

Java 如何在web应用程序中构建良好的安全体系结构?

Java 如何在web应用程序中构建良好的安全体系结构?,java,spring,spring-security,Java,Spring,Spring Security,我想在应用程序中实现动态安全性(SpringBoot、SpringMVC、SpringSecurity、thymeleaf) 我想在我的web应用页面中添加,用户/管理员可以在其中添加一些新权限(仅名称)。 在另一个页面中,他将能够添加例如菜单中的新位置(或新字段或新选项卡)。 当他添加这个新项目时,他应该有选择权选择用户应该有哪些权限来查看这个新的菜单位置(对于字段,将有一个查看权限和一个编辑权限) 你有办法做这样的事吗? 我在春季安全会议上考虑过ALC,但我现在不知道这是个好选择 也许有一种

我想在应用程序中实现动态安全性(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 |用户|团队|真|假|假|

  • 数据库中的用户表必须添加userRole
  • @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();
    } }