我一直在努力将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主题上提出的相关问题的一些建议,但仍然没有运气。
我对节点/角度非常新,感谢您的耐心和帮助。
答案 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à。