Проблема с HTTP-заголовками Angular 4 + Siteminder

В течение пары недель я изо всех сил пытался «интегрировать» аутентификацию Siteminder с моим веб-приложением nodejs/angular 4.

На стороне сервера (узла) у меня есть:

app.get('*', function(req, res) {
  //read Siteminder headers
  if (authenticated) {
    res.sendFile(path.join(__dirname, 'dist/index.html'));
  }else{
    res.sendFile(path.join(__dirname, 'dist/accessDenied.html'));
  }          
}

Угловой маршрутизатор обрабатывает все остальное.

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

Однако теперь пользователям нужны роли, такие как редактирование/просмотр, и мне нужно найти способ передать эти роли из заголовков Siteminder во внешний интерфейс angular для обработки разрешений. Я безуспешно играл с перехватчиками, похоже, работает только с запросами, созданными из приложения angular. Я также пробовал некоторые предложения, найденные по связанным вопросам, которые были заданы в теме Siteminder/node/angular, но все равно не повезло.

Я очень новичок в node/angular, спасибо за ваше терпение и помощь.


person sugar2code    schedule 27.09.2017    source источник


Ответы (1)


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

По сути, это позволяет Angular работать на стороне сервера, где он может получить доступ к заголовкам запросов, а затем их можно внедрить для использования на стороне клиента.

В моем main.server.ts:

app.engine('html',  (_, options, callback) => {
    let engine = ngExpressEngine({
        bootstrap: ServerAppModule,
        providers: [ { provide: 'headers', useFactory: () => options.req.headers } ]
    });

    engine(_, options, callback)
});

app.set('view engine', 'html');
app.set('views', 'dist');

app.use('/', express.static('dist', {index: false}));

ROUTES.forEach(route => {
  app.get(route, (req, res) => {

    console.log('Yaaay Siteminder headers:');
    console.dir(req.headers);

    res.render('index', {
      req: req,
      res: res
    });
  });
});

А затем в моем app.component.ts:

export class AppComponent implements OnInit {

     constructor(private cache: TransferState, private injector: Injector, @Inject(PLATFORM_ID) private platformId: Object) {}

    ngOnInit() {
        if (isPlatformServer(this.platformId)) 
       {                
          this.cache.set('user_role', this.injector.get('headers').sm_role);                
        }
    }  

}

После чего я могу просто внедрить private cache: TransferState в любой из своих компонентов и использовать заголовки в любом месте для точной настройки доступа.

И вуаля.

person sugar2code    schedule 04.10.2017