Angular 4 + Siteminder HTTP标头问题

时间:2017-09-27 18:01:48

标签: angular single-sign-on siteminder

我一直在努力将Siteminder身份验证与我的nodejs / angular 4 Web应用程序“集成”几周。

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

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和检索数据的服务在不同的机器上,这只是一个前端/客户端应用程序。)

但是,现在用户需要角色,例如编辑/视图,我需要找到一种方法将这些角色从Siteminder标头传递到角度前端以处理权限。 我玩过没有运气的拦截器,似乎只能处理角度应用程序内创建的请求。我也尝试过在Siteminder / node / angular主题上提出的相关问题的一些建议,但仍然没有运气。

我对节点/角度非常新,感谢您的耐心和帮助。

1 个答案:

答案 0 :(得分:1)

我最终找到了答案,在下面发布详情,以防有人感兴趣。决定使用Angular通用快递引擎,遵循this example.

基本上它的作用是它允许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,并可以在任何地方使用标题,以便进行微调。

Etvoilà。