반응형
라우터를 사용한 VueJS 역할 기반 인증
나의 사용 사례는 이와 같은 것이다.
- 누군가가 시스템에 로그인할 때 나는 로그인 동작에서 사용자 역할을 식별하고 그 값을 상태로 저장한다.
- 학생, 관리자, 데이터 입력 등 3가지 사용자 역할이 있음
- 이 세 가지 역할에도 3개의 경로가 있다. (/학생, 관리자,/dataEntry)
- 그래서 사용자 역할에 따라 사용자들을 시스템으로 이동시키고자 한다.논리적으로 이런 거.
if(userType == 'student'){
router.push('/student')
},
if(userType == 'admin'){
router.push('/admin')
}
이걸 어떻게 해?나는 VueJS를 처음 접하는 사람이고 만약 조건이 된다면 이것들을 어디에 두어야 할지 모르겠다.
여기 내 코드 Store.js.
import Vue from 'vue';
import Vuex from 'Vuex';
import axios from 'axios';
import router from './main.js';
Vue.use(Vuex);
export const store = new Vuex.Store({
state:{
idToken:null,
userId:null,
userType:null,
userName:null
},
mutations:{
authUser(state,userData){
state.idToken = userData.token,
state.userId = userData.id,
state.userName = userData.userName,
state.userType = userData.type
},
clearAuthData(state){
state.idToken = null,
state.userId = null,
state.userName = null,
state.userType = null
}
},
actions:{
signup({commit},authData){
axios.post('http://localhost/laravel_back/public/api/register', authData)
.then(res => {
commit('authUser',{
token:res.data.idToken,
userId:res.data.localId
})
//dispatch('storeUser',authData)
})
.catch(error => console.log("ERROR COMES FROM ACTION SIGN UP",error))
},
login({commit},authData){
axios.post('http://localhost/laravel_back/public/api/login',authData
)
.then(res => {
console.log("Back-end Response",res);
commit('authUser',{
token:res.data[0].token,
userName:res.data[1][0].fname,
id:res.data[2].id,
type:res.data[3][0].role_id
})})
.catch(error => console.log(error))
//router.push('/student')
},
logout({commit}, {router}){
commit('clearAuthData')
router.replace('/')
},
},
getters:{
userId(state){
return state.userId
},
userType(state){
return state.userType
},
userName(state){
return state.userName
},
returnToken: state => {
return state.idToken
}
}
});
<template>
<div class="fluid-container" id="headerr">
<div class="container">
<div class="row">
<div class="col">
<h1>Exams-portal</h1>
</div>
<div class="col form-group" v-if="!auth">
<div class="row">
<div class="col">
<input type="email" name="email" value="" v-model="email" class="form-control float-right">
</div>
<div class="col" >
<input type="password" name="password" value="" v-model="password" class="form-control float-right">
</div>
<div class="col">
<button type="button" class="btn btn-primary " name="button" @click="onLogin">Login</button>
</div>
</div>
<div class="row">
<div class="col">
<router-link :to="{ path:'findYourAccount' }">Forgot password?</router-link>
</div>
</div>
</div>
<div class="" v-if="auth" class="col-sm-6 form-group" >
<div class="row">
<div class="col">
Logged as {{userName}}
</div>
<div class="col">
<button type="button" class="btn btn-primary float-right" name="button" @click="onLogout">Logout</button>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { mapActions } from 'vuex';
export default{
data () {
return {
email: '',
password: ''
}
},
computed:{
auth(){
return this.$store.getters.isAuthenticated
},
userName(){
return this.$store.getters.userName
}
},
methods:{
...mapActions(["logout"]),
onLogin () {
const formData = {
email: this.email,
password: this.password,
returnSecureToken:true
}
this.$store.dispatch('login',{
email: this.email,
password: this.password,
//router: this.$router
})
},
onLogout(){
this.logout({ router: this.$router });
}
}
}
</script>
<style scoped>
#headerr{
color:white;
background-color: #003459;
padding: 10px;
}
</style>
로그인 동작에서 이 일을 처리해야 한다고 말할게.
로그인 동작에서 사용자 역할을 식별한 다음, 역할을 상태로 저장한 후 사용자 역할에 따라 사용자 페이지로 리디렉션하여 동일한 방법/콜백으로 이 작업을 수행하십시오.
다른 접근방식은 로그인 Vue 구성 요소에서 계산된 값으로 사용자 역할을 가지고 사용자 역할 변경을 처리하는 것일 수 있다.
computed: {
userRole: function () {
let role = this.$store.state.userRole
if(role === 'student'){
router.push('/student')
} else if(role === 'admin'){
router.push('/admin')
}
return role
}
}
하지만 첫 번째 접근법이 더 낫다고 생각한다.
라우터를 통과할 필요는 없다(this.$router
)을(를) 스토어 액션에 적용.로그인 저장소 작업에서 약속 반환:
Store.js:
login({commit},authData){
return new Promise(resolve => {
axios.post('http://localhost/laravel_back/public/api/login',authData)
.then(res => {
console.log("Back-end Response",res);
commit('authUser',{
token:res.data[0].token,
userName:res.data[1][0].fname,
id:res.data[2].id,
type:res.data[3][0].role_id
})
//get the role
let role = res.data[3][0].role_id
resolve(role);
}).catch(error => console.log(error))
})
}
구성 요소:
onLogin () {
this.$store.dispatch('login', {
email: this.email,
password: this.password
}).then(role => {
this.$router.push('/'+role)
});
}
참조URL: https://stackoverflow.com/questions/49377078/vuejs-role-based-authentication-with-router
반응형
'Programing' 카테고리의 다른 글
사이프러스 파일 업로드 오류(사이프러스 파일 업로드 오류) (0) | 2022.05.09 |
---|---|
을 하는가?을 하는가?을 하는가?자바에서 평균은?자바에서 평균은?자바에서 평균은? (0) | 2022.05.09 |
NativeScript Vue - 사용자의 로그인 상태에 따른 조건부 내성 (0) | 2022.05.09 |
지금까지 경험한 것 중 최악의 실제 매크로/사전 프로세서 남용은 무엇인가? (0) | 2022.05.09 |
Javadoc 주석의 다중 회선 코드 예제 (0) | 2022.05.09 |