gpt4 book ai didi

java - 如何在Web应用中构建良好的安全架构?

转载 作者:行者123 更新时间:2023-12-02 01:59:40 30 4
gpt4 key购买 nike

我想在应用程序中进行动态安全(spring boot、spring mvc、spring security、thymeleaf)。

我想在我的网络应用程序页面中添加用户/管理员可以添加一些新权限(仅限名称)。在另一个页面中,他将能够添加例如菜单中的新位置(或新字段或新选项卡)。当他添加这个新项目时,他应该可以选择用户应该拥有哪些权限来查看这个新的菜单位置(对于字段,将有一个查看权限,一个编辑权限)。

您有解决方案吗?我曾考虑在 Spring Security 中使用 ALC,但现在不知道这是一个不错的选择。

也许有一种方法可以使用@PreAuthorize("hasRole()") ?或者当我放置用户添加的所有项目时添加类似“组件”表的内容。在此表中,将有“编辑权限”和“查看权限”等列,我将在其中放置权限 ID,并在获取菜单项、字段的所有方法中检查此表..

也许蜜蜂自己实现 PermissionEvaluator 会是一个好的解决方案?

最佳答案

我认为您需要在数据库中创建带有权限表的角色枚举

  1. 角色枚举

    public enum Roles {
    Admin,
    Pm,
    TeamLead,
    User,
    ...
    }
  2. 权限表

| ID | ROLE | WORKSPACE | READ | WRITE | DELETE |
| 1 | Admin | Dashbord | TRUE | TRUE | TRUE |
| 2 | Admin | Employee | TRUE | TRUE | TRUE |
| 3 | Admin | Project | TRUE | TRUE | TRUE |
| 4 | Admin | Task | TRUE | TRUE | TRUE |
| 5 | Admin | Team | TRUE | TRUE | TRUE |
| 6 | Pm | Dashbord | TRUE | FALSE | FALSE |
| 7 | Pm | Employee | TRUE | FALSE | FALSE |
| 8 | Pm | Project | TRUE | TRUE | TRUE |
| 9 | Pm | Task | TRUE | TRUE | TRUE |
| 10 | Pm | Team | TRUE | FALSE | FALSE |
| 11 | TeamLead | Dashbord | TRUE | FALSE | FALSE |
| 12 | TeamLead | Employee | TRUE | TRUE | TRUE |
| 13 | TeamLead | Project | TRUE | FALSE | FALSE |
| 14 | TeamLead | Task | TRUE | FALSE | FALSE |
| 15 | TeamLead | Team | TRUE | TRUE | TRUE |
| 16 | User | Dashbord | FALSE | FALSE | FALSE |
| 17 | User | Employee | TRUE | FALSE | FALSE |
| 18 | User | Project | TRUE | FALSE | FALSE |
| 19 | User | Task | TRUE | TRUE | FALSE |
| 20 | User | Team | TRUE | FALSE | FALSE |

  • 数据库中的用户表必须添加userRole
  • @Basic
    @Enumerated(EnumType.STRING)
    private Roles userRole;

  • 创建自定义注释接口(interface)按角色权限检查当前用户

    @Retention(RetentionPolicy.RUNTIME) public @interface PermissionCheck {

    String[] workspace() default {};

    boolean read() default false;

    boolean write() default false;

    boolean delete() default false; }
  • @Aspect @Component public class PermissionAspect {

    @Autowired
    private PermissionRepository permissionRepository;

    @Around("execution(@com.security.annotation.springbootsecuritypermission

    .aspect.PermissionCheck * *(..)) && @annotation(permissionCheck)") public Object doSomething(ProceedingJoinPoint pjp, PermissionCheck >permissionCheck) throws Throwable { if(permissionCheck.workspace().length>0 && SecurityUtil.getUser()!=null){ List permissionList = permissionRepository.findByRolesAndWorkspaceIn( SecurityUtil.getUser().getRoles(),permissionCheck.workspace());

           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();
    } }
  • 您可以在方法上使用自定义注释

    @GetMapping("dashboard") @PermissionCheck(workspace = {Workspace.DASHBOARD},read = true) public String dashboard() {
    return "dashboard"; }

  • 如果不太明白我可以打开这个链接https://github.com/Dilsh0d/spring-boot-security-permission

    关于java - 如何在Web应用中构建良好的安全架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51786827/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com