我正在尝试使用密钥斗篷实现基于角色的客户端应用程序(VueJS多页应用程序)控制的相当简单的用例。
如图所示,我在单个领域中具有三个不同的角色和三个不同的客户端。
图片中的箭头表示哪个角色可以访问哪个客户端。
所以我的主要目标是
Viewer
的用户只能登录到Viewer Application
。如果同一用户尝试访问Operator Application
或Admin application
,则密钥隐藏仅应拒绝该用户访问。Admin
和Operator
角色的用户应遵循相同的规则。拥有Admin
角色的用户应该能够通过keycloak 登录。为了实现这个用例,我尝试了以下方法,
Authorization
。在策略中,我删除了授予所有用户访问客户端权限的默认策略。并创建User
策略和Client
策略以限制对客户端应用程序的访问Group
的授权策略。在这种情况下,我创建了一个具有客户端角色的组,然后将用户分配给这些组。并通过Authorization
组策略启用了它们。但是,不幸的是,这些都不起作用。表示我具有Viewer
角色的用户可以登录到我的管理应用程序。真奇怪。
答案 0 :(得分:2)
我使用KeyCloak扩展SPI处理了几乎相同的问题。部署之后,您将在身份验证流中使用名为“验证用户角色”的其他可配置“执行”。
此执行必须放在“用户名密码表单”(或其他用于验证用户身份的表单)之后,否则身份验证将失败。
源代码在这里: https://github.com/ValentinChirikov/kc_user_role_validate_extension
答案 1 :(得分:0)
最后在应用程序级别处理了此操作,因为它无法从密钥斗篷端开始工作。
登录后,检查keycloak
对象,检查该对象,我们可以发现在上述问题中提到的配置过程中设置的一些有用的属性。总体代码如下所示,
let appName = 'your_app';
keycloak.init({ onLoad: 'login-required' }).success(function () {
// Confirm the role & authentication of the user
if (keycloak.authenticated && keycloak.tokenParsed.resource_access &&
keycloak.tokenParsed.resource_access.hasOwnProperty(appName)) {
setAuthToken(keycloak.token);
// Global event bus
Vue.prototype.$eventBus = new Vue();
// Injecting to global vue istance
Vue.prototype.$auth = keycloak;
Object.freeze(Vue.prototype.$auth);
// Your app
new Vue({ // eslint-disable-line no-new
el: '#app',
store,
render: h => h(YourApp)
});
} else {
// Logout user
keycloak.logout();
}
}).error(function () {
keycloak.logout();
});
通过这种方式,我设法将未经授权的用户路由到应用程序之外。
解决方案不是所问问题中所需要的,但它可以工作。尽管我认为这应该在密钥公开级别本身进行处理。
答案 2 :(得分:0)
您无需扩展即可执行此操作。
Access By Role
并选择 generic
作为类型。CONDITIONAL
。Condition - User Role
,使其REQUIRED
并配置它:
Deny Access
并将其设为 REQUIRED
。如果条件“admin-role-missing”为真,这将拒绝访问。
您还可以从文档中了解更多信息:explicitly-deny-allow-access-in-conditional-flows
此外,不要忘记前往您的客户并选择身份验证覆盖中的流程。