我已经坚持了一段时间,我想从vue router.js文件中访问我的keycloak示例。
const preventRoutes = {
beforeEnter: (to, from, next) => {
console.log(App.$keycloak.authenticated); //here. (Undefined)
if (store.getters.getLoginState === "true") {
...
} else {
...
}
}
}
access vue 3 app instance api from non-vue fiile
我正在尝试这个解决方案。因为这是我能找到的唯一的VUE3,但我仍然认为他跳过了一些步骤。有人能简化一下吗?
建议解决方案
const preventRoutes = {
beforeRouteEnter(to, from, next) {
next(vm => {
// access to component instance via `vm`
// console.log(vm.$keycloak.authenticated);
if (this.vm.$keycloak.authenticated) {
next();
} else {
next("/");
}
})
}
}
main.js
const myApp = createApp(App)
let initOptions = {
url: KeycloakConfig["auth-server-url"], realm: KeycloakConfig.realm, clientId: KeycloakConfig.resource, clientSecret: KeycloakConfig.credentials.secret
}
const keycloak = Keycloak(initOptions)
myApp.config.globalProperties.$keycloak = keycloak;
myApp.use(VueAxios, axios)
myApp.use(store)
myApp.use(router)
myApp.mount("#app");
keycloak.init({
onLoad: "check-sso",
checkLoginIframe: false
}).then(async (auth) => {
if (!auth) {
} else if (auth) {
router.push("/dashboard");
}
}).catch((e) => {
console.log('Serwer lezy: ' + e)
})
4条答案
按热度按时间6jjcrrmo1#
我有另一个解决方案(也许它更多的是一个变通办法,但感觉有点正确)
您可以将路由器 Package 在自定义插件安装方法中,例如:
在你的main.js中,你可以像以前一样
use(...)
路由器:2uluyalo2#
router.js
的一个解决方案是导出一个函数,该函数捕获给定的app
参数,该参数可以用在路由的beforeEnter
钩子中:demo 1
...或在全局
beforeEach
挂接中:demo 2
那么您的
main.js
将像这样使用它:trnvg8h33#
beforeEnter
和beforeRouteEnter
没有对Vue示例的访问权限。您可以将逻辑更改为使用
beforeRouteLeave
,该beforeRouteLeave
具有对使用this
的示例的访问权限,也可以添加回调函数,如下所示:在您的特定情况下,我将更改逻辑以使用beforeRouteLeave,并防止在用户未通过身份验证的情况下调用
next()
函数。您可以在此处找到更多详细信息:https://router.vuejs.org/guide/advanced/navigation-guards.html#in-component-guards
rpppsulh4#
您可以将路由守卫附加到
main.js
文件中,根据您的代码,该文件将变为: