статические пути угловых маршрутов обращаются к URL напрямую без разрешения - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь исправить ошибку в веб-приложении с использованием Java 8, Spring Boot, Spring MVC и внешнего интерфейса с угловым cli. Когда пользователь входит в приложение и создает меню с учетом разрешения профиля пользователя с помощью Java, но приложение использует угловой маршрутизатор со статическими путями, поэтому, если пользователь переписывает URL-адрес, он может получить доступ ко всему, даже без разрешений.

const routes: Routes = [
  {
      path: '',
      component: WebservicesComponent,
      children: [
        { path: 'perfis', loadChildren: './wsperfis/wsperfis.module#WsperfisModule', },
        { path: 'acessos', loadChildren: './wsacessos/wsacessos.module#WsacessosModule', },
        { path: 'novoAcesso', loadChildren: './novo-acesso/novo-acesso.module#NovoAcessoModule', },
        { path: 'servicos', loadChildren: './wsservicos/wsservicos.module#WsservicosModule' },
        { path: 'novoperfil', loadChildren: './wsnovoperfil/wsnovoperfil.module#WsnovoperfilModule' }
      ]
  }
];


@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class WebservicesRoutingModule {
}

@CrossOrigin
    @RequestMapping("/menu")
    public List<Object> menu(@RequestParam(value = "idPerfil") int idPerfil) {

        List<Menu> menus = menuService.getMenus(idPerfil);

        List<Object> menu = new ArrayList<Object>();

        Map<String, Object> mapMenu = new HashMap<String, Object>();
        Map<String, String> mapSubMenu = new HashMap<String, String>();
        List<Object> listMapSubMenu = new ArrayList<Object>();

        for (Menu menuItem : menus) {

            if (!mapMenu.containsValue(menuItem.getPaiPrompt())) {

                mapMenu = new HashMap<String, Object>();
                listMapSubMenu = new ArrayList<Object>();

                mapMenu.put(LABEL, menuItem.getPaiPrompt());
                mapMenu.put(URL, menuItem.getPaiUrl());
                mapMenu.put(ICON, menuItem.getPaiIcon());

                for (Menu submenu : menus) {

                    if (menuItem.getPaiPrompt().equals(submenu.getPaiPrompt())) {
                        mapSubMenu = new HashMap<String, String>();
                        mapSubMenu.put(LABEL, submenu.getFilhoPrompt());
                        mapSubMenu.put(URL, submenu.getFilhoUrl());
                        mapSubMenu.put(ICON, submenu.getFilhoIcon());
                        listMapSubMenu.add(mapSubMenu);
                    }

                }
                mapMenu.put(ITEMS, listMapSubMenu);
                menu.add(mapMenu);
            }

        }

        return menu;
    }

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Я мог бы сделать это, используя валидацию canActiveChild в файле Guard, но теперь у меня возникла проблема при первом вызове. Служба, в которой вызов остается, остается в состоянии ожидания в первый раз, когда я его вызываю, но в следующих вызовах он работает нормально. Введите код:

constructor(private router: Router, private _cookieService: CookieService, private comumService: ComumService) {}

canActivate() {
    if (this._cookieService.get('AuthorizationToken')) {
        return true;
    }
    this.router.navigate(['login']);
    return false;
}

canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    console.log('state.url: ' + state.url);
    // tslint:disable-next-line:triple-equals
    if (state.url == '/dashboard' || this.validaAcesso(state.url)) {
        return true;
    } else {
        console.log('Entrou aqui!!!');
        window.alert('You don\'t have permission to view this page');
        this.router.navigate(['dashboard']);
        return false;
    }
}

validaAcesso(url: string) {
    this._cookieService.getAll();
    this.comumService.validaAcesso(url).subscribe((data: Boolean) => {
        console.log(data.valueOf());
        if (data.valueOf()) {
            console.log('validaAcesso return true');
            this.result = true;
        } else {
            console.log('validaAcesso return false');
            this.result = false;
        }
    });
    return this.result;
}

}

0 голосов
/ 29 октября 2019

Вы должны добавить проверку на ваш фронт и бэкэнд, например, когда путь изменяется во внешнем интерфейсе и компонент монтируется, он проверяет, чтобы сессия отправляла свой идентификатор пути, бэкэнд сравнивает это с назначенным меню, и все это перед выполнением любого другого вызова API. .

Другим более сложным (и безопасным) решением является добавление проверки на сам API, путем проверки меню или профилей пользователей, таким образом, даже если пользователь не получает доступ к странице (он отображается в js), он выигралне получить доступ к неавторизованному API.

...