Angular 4 + Siteminder HTTP headers 问题

Angular 4 + Siteminder HTTP headers issue

为了 "integrate" 使用我的 nodejs/angular 4 Web 应用程序进行 Siteminder 身份验证,我已经努力了几个星期。

在服务器端(节点)我有:

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'));
  }          
}

Angular 路由器处理其余部分。

这适用于初始访问控制(api 和检索数据的服务在不同的机器上,这只是一个 front-end/client 应用程序)。

但是,现在用户想要角色,例如 edit/view,我需要找到一种方法将这些角色从 Siteminder headers 传递到 angular front-end 来处理权限. 我玩过拦截器但没有运气,似乎只适用于从 angular 应用程序内创建的请求。我也尝试了一些在 Siteminder / node /angular 主题上提出的相关问题上找到的建议,但仍然没有成功。

我是 node/angular 的新手,感谢您的耐心等待和帮助。

我最终自己找到了答案,在下面发布了详细信息,以防有人感兴趣。决定使用Angular万能快递引擎,关注this example.

本质上,它所做的是它允许在服务器端 Angular 到 运行,在那里它可以访问请求 headers,然后它们可以被注入以供客户端使用.

在我的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 并可以在任何地方使用 headers 以进行微调访问。

Et voilà.