前端鉴权时,如何防止他人伪造用户权限标识?
我现在在做项目权限控制,用JWT存了用户角色信息。前端通过请求头携带权限标识,但发现直接存字符串太容易被篡改了。试过用加密和签名,但别人拿到token后还是能解密出权限字段随意修改。
比如用户本应该是普通用户,但修改token里的role为admin后,前端页面直接显示管理员菜单了。现在用了这样写请求:
axios.get('/api/data', {
headers: {
'Authorization': `Bearer ${localStorage.token}`,
'Role': JSON.parse(atob(token.split('.')[1])).role // 直接解析token里的角色
}
})
这样真的安全吗?有没有更好的前端鉴权方式能防止权限伪造?
推荐的做法是把权限校验放到后端去做。前端只负责传递token,后端在每次请求时验证token的有效性,并从token里提取用户角色信息,再判断是否有访问权限。你现在的代码里直接把role解析出来用,这个逻辑得挪到后端去。
比如后端可以用中间件来处理:
前端只需要传token就好:
至于菜单显示,可以在页面加载时根据后端返回的用户信息动态生成,而不是单纯依赖前端的判断。这样即使有人改了前端代码,也拿不到实际的权限。总之记住一点:前端的安全永远只能是辅助性的,真正的鉴权必须靠后端。