export default { name: "app", created() { if (localStorage.eletoken) { const decode = jwt_decode(localStorage.eletoken) this.$store.dispatch("setIsAutnenticated", !this.isEmpty(decode)) this.$store.dispatch("setUser", decode) } }, methods: { isEmpty(value) { return ( value === undefined || value === null || (typeof value === "object" && Object.keys(value).length === 0) || (typeof value === "string" && value.trim().length === 0) ) } } } </script>
时间: 2024-04-25 07:27:33 浏览: 16
这段代码是一个Vue.js组件的定义,主要向localStorage中存储的eletoken进行解码,判断是否为空,并将解码后的结果存储到Vuex store中。具体分析如下:
1. 组件名称为"app"。
2. 在组件创建时(即created钩子函数中),判断localStorage中是否存储了名为"eletoken"的数据,如果存在,则使用jwt_decode库对其进行解码。
3. 解码后的结果存储到名为"decode"的常量中。
4. 调用Vuex store中的"setIsAutnenticated"和"setUser"方法,分别将解码结果中是否为空的布尔值和解码后的数据对象存储到store中。
5. 定义了一个名为"isEmpty"的方法,用于判断传入的值是否为空。如果为空,则返回true,否则返回false。
总的来说,这段代码主要是用于用户认证和授权的处理,通过判断localStorage中是否存在eletoken,以及解码后的结果是否为空,来判断当前用户是否已经登录,并将登录信息存储到Vuex store中。
相关问题
fastapi写登录注册页面前后端代码
FastAPI是一个快速构建API的Python框架,其主要特点是高性能、易于使用和快速编写。在FastAPI中,可以使用Python的异步功能来提高性能,同时可以使用Pydantic来实现数据验证和文档生成。下面是FastAPI编写登录注册页面前后端代码的简要介绍。
后端代码:
首先需要安装FastAPI和uvicorn,可以使用pip进行安装:
```
pip install fastapi uvicorn
```
然后创建一个main.py文件,编写以下代码:
```python
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from passlib.context import CryptContext
from datetime import datetime, timedelta
from jose import JWTError, jwt
app = FastAPI()
# 设置跨域资源共享(CORS)中间件,允许前端跨域访问
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 设置加密算法
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
# 设置JWT相关参数
SECRET_KEY = "secret"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
# 定义用户模型类
class User():
def __init__(self, username, hashed_password):
self.username = username
self.hashed_password = hashed_password
# 假设存在一个用户列表users
users = [
User(username="user1", hashed_password=pwd_context.hash("password1")),
User(username="user2", hashed_password=pwd_context.hash("password2")),
]
# 获取用户信息函数
def get_user(username: str):
for user in users:
if user.username == username:
return user
return None
# 验证密码函数
def verify_password(plain_password, hashed_password):
return pwd_context.verify(plain_password, hashed_password)
# 创建access_token函数
def create_access_token(data: dict, expires_delta: timedelta = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
expire = datetime.utcnow() + timedelta(minutes=15)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
# 定义OAuth2密码模式对象
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/login")
# 定义登录路由
@app.post("/login")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
user = get_user(form_data.username)
if not user:
raise HTTPException(status_code=400, detail="用户名或密码错误")
if not verify_password(form_data.password, user.hashed_password):
raise HTTPException(status_code=400, detail="用户名或密码错误")
access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
access_token = create_access_token(
data={"sub": user.username}, expires_delta=access_token_expires
)
return {"access_token": access_token, "token_type": "bearer"}
# 定义获取用户信息路由
@app.get("/users/me")
async def read_users_me(token: str = Depends(oauth2_scheme)):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get("sub")
if username is None:
raise HTTPException(status_code=401, detail="无效凭证")
except JWTError:
raise HTTPException(status_code=401, detail="无效凭证")
user = get_user(username)
if user is None:
raise HTTPException(status_code=404, detail="用户不存在")
return {"username": user.username}
```
前端代码:
前端代码可以使用Vue.js来实现,需要使用axios库来发送HTTP请求。首先需要安装Vue.js和axios库,可以使用npm进行安装:
```
npm install vue axios
```
然后创建一个App.vue文件,编写以下代码:
```html
<template>
<div>
<div v-if="!isLoggedIn">
<h3>登录</h3>
<form @submit.prevent="login">
<label>
用户名:
<input type="text" v-model="username">
</label>
<br>
<label>
密码:
<input type="password" v-model="password">
</label>
<br>
<button type="submit">登录</button>
</form>
<p v-if="loginError">{{ loginError }}</p>
</div>
<div v-else>
<h3>欢迎 {{ username }}</h3>
<button @click="logout">退出登录</button>
</div>
</div>
</template>
<script>
import axios from 'axios'
export default {
data () {
return {
isLoggedIn: false,
username: '',
password: '',
token: '',
loginError: ''
}
},
methods: {
async login () {
try {
const response = await axios.post('http://localhost:8000/login', {
username: this.username,
password: this.password
})
this.token = response.data.access_token
localStorage.setItem('token', this.token)
this.isLoggedIn = true
} catch (error) {
this.loginError = error.response.data.detail
}
},
logout () {
localStorage.removeItem('token')
this.isLoggedIn = false
this.username = ''
this.password = ''
this.token = ''
this.loginError = ''
},
async getUserInfo () {
try {
const response = await axios.get('http://localhost:8000/users/me', {
headers: { Authorization: `Bearer ${this.token}` }
})
this.username = response.data.username
this.isLoggedIn = true
} catch (error) {
localStorage.removeItem('token')
this.isLoggedIn = false
}
}
},
created () {
const token = localStorage.getItem('token')
if (token) {
this.token = token
this.getUserInfo()
}
}
}
</script>
```
以上就是使用FastAPI和Vue.js编写登录注册页面前后端代码的简要介绍,当然实际项目中还需要考虑更多的安全问题和业务逻辑。
SpringBoot+Vue使用JWT做登录验证,请给我写个详细完整的例子,包括前端和后端,包括一些配置和工具类,简单一点,不需要Security
好的,下面是一个简单的Spring Boot + Vue + JWT的登录验证示例。
1. 后端实现
1.1 引入依赖
在pom.xml中添加以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
```
1.2 编写控制器
创建一个简单的控制器,提供登录和获取用户信息的接口。
```java
@RestController
@RequestMapping("/api/auth")
public class AuthController {
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private JwtUtils jwtUtils;
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
try {
authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()));
} catch (BadCredentialsException e) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
UserDetails userDetails = userDetailsService.loadUserByUsername(loginRequest.getUsername());
String jwt = jwtUtils.generateToken(userDetails);
return ResponseEntity.ok(new JwtResponse(jwt));
}
@GetMapping("/user")
public ResponseEntity<?> getUser(@AuthenticationPrincipal UserDetails userDetails) {
return ResponseEntity.ok(userDetails);
}
}
```
1.3 编写JWT工具类
创建一个JwtUtils类,用于生成和解析JWT。
```java
@Component
public class JwtUtils {
private static final String SECRET_KEY = "secret";
public String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
return Jwts.builder()
.setClaims(claims)
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 86400000L))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public String getUsernameFromToken(String token) {
return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();
}
public boolean validateToken(String token, UserDetails userDetails) {
String username = getUsernameFromToken(token);
return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
}
private boolean isTokenExpired(String token) {
Date expiration = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getExpiration();
return expiration.before(new Date());
}
}
```
2. 前端实现
2.1 安装依赖
在项目根目录下运行以下命令安装需要的依赖:
```bash
npm install axios vue-axios jwt-decode --save
```
2.2 创建登录页面
在Vue项目中创建一个登录页面,用于输入用户名和密码,并向后端发送登录请求。
```vue
<template>
<div>
<input type="text" v-model="username" placeholder="Username">
<input type="password" v-model="password" placeholder="Password">
<button @click="login">Login</button>
</div>
</template>
<script>
import axios from 'axios';
import jwt_decode from 'jwt-decode';
export default {
name: 'Login',
data() {
return {
username: '',
password: ''
}
},
methods: {
login() {
axios.post('/api/auth/login', {
username: this.username,
password: this.password
}).then(response => {
const token = response.data.token;
const user = jwt_decode(token);
localStorage.setItem('token', token);
localStorage.setItem('user', JSON.stringify(user));
this.$router.push('/');
}).catch(error => {
console.log(error);
});
}
}
}
</script>
```
2.3 创建路由守卫
创建一个路由守卫,用于检查用户是否已登录。
```js
import axios from 'axios';
import jwt_decode from 'jwt-decode';
const authGuard = (to, from, next) => {
const token = localStorage.getItem('token');
if (!token) {
next('/login');
return;
}
const user = JSON.parse(localStorage.getItem('user'));
const decoded = jwt_decode(token);
if (decoded.sub !== user.username || decoded.exp < Date.now() / 1000) {
next('/login');
return;
}
axios.get('/api/auth/user').then(response => {
const data = response.data;
if (data.username !== user.username) {
next('/login');
return;
}
next();
}).catch(error => {
console.log(error);
next('/login');
});
};
export default authGuard;
```
2.4 创建需要登录才能访问的页面
创建需要登录才能访问的页面,并在路由中添加路由守卫。
```vue
<template>
<div>
<h1>Hello, {{ user.username }}!</h1>
<p>Your roles are:</p>
<ul>
<li v-for="role in user.roles">{{ role }}</li>
</ul>
</div>
</template>
<script>
export default {
name: 'Home',
computed: {
user() {
return JSON.parse(localStorage.getItem('user'));
}
}
}
</script>
<style scoped>
h1 {
font-size: 3em;
margin-bottom: 0.5em;
}
ul {
list-style: none;
padding-left: 0;
}
li {
margin-bottom: 0.5em;
}
</style>
```
```js
import Vue from 'vue';
import Router from 'vue-router';
import Home from './views/Home.vue';
import Login from './views/Login.vue';
import authGuard from './auth-guard';
Vue.use(Router);
export default new Router({
routes: [
{
path: '/',
name: 'home',
component: Home,
beforeEnter: authGuard
},
{
path: '/login',
name: 'login',
component: Login
}
]
});
```
至此,一个简单的Spring Boot + Vue + JWT的登录验证示例已经完成。当用户输入正确的用户名和密码后,后端会返回一个JWT Token,前端将该Token保存在localStorage中,后续的请求都需要在请求头中带上该Token,后端会根据Token验证用户是否已登录。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)