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à.
为了 "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à.