当前位置: 首页 > 后端技术 > Node.js

实战react技术栈+express前后端博客项目(六)——使用session实现免登录+管理后台权限验证

时间:2023-04-03 19:07:05 Node.js

项目地址:https://github.com/Nealyang/R...本来想等项目做完连载一系列的博客,随着开发的进行,确实遇到了很多坑,也请教了很多人。然后我想,为什么不在记录陷阱的同时分享收获。分享固然好,但如果能集思广益岂不更美。我们的口号是:坚决不做不完。本博客将为连载代码博客同步更新博客。以后随着项目的发展,可能会遇到之前写的不合适的地方,回去修改。如有不妥之处~欢迎兄弟们指教。谢谢!在上一篇session后端部分,我们已经实现了前后端的登录功能。您可能已经发现了问题。刷新页面时,如果之前登录过,则需要重新登录。显然,这不是我们想要的。所以这里我们使用session机制来解决这类问题。如果你没有session和coolie,可以参考我的博客。apiServer.jsapp.use(cookieParser('express_react_cookie'));app.use(session({secret:'express_react_cookie',resave:true,saveUninitialized:true,cookie:{maxAge:60*1000*30}//过期时间}));因为是登录信息,所以这里我们使用session。首先需要在apiServer.js中引入cookie-parser和express-session中间件。在cooolieParser中设置一个key,必须和session保持一致。然后设置苦力的过期时间。这里我们设置为30分钟。然后用户登录成功后,我们需要设置sessionrouter.post('/login',(req,res)=>{let{username,password}=req.body;if(!username){responseClient(res,400,2,'用户名不能为空');return;}if(!password){responseClient(res,400,2,'密码不能为空');return;}User.findOne({username,password:md5(password+MD5_SUFFIX)}).then(userInfo=>{if(userInfo){//登录成功letdata={};data.username=userInfo.username;data.userType=userInfo.type;data.userId=userInfo._id;//登录成功后设置sessionreq.session.userInfo=data;responseClient(res,200,0,'登录成功',data);return;}responseClient(res,400,1,'用户名密码错误');}).catch(err=>{responseClient(res);})});其中req.session.userInfo=data为设置session的userInfo。那么服务器端还需要再写一个接口。当用户打开网站时,会发起一个请求来验证用户是否登录。//用户认证router.get('/userInfo',function(req,res){if(req.session.userInfo){responseClient(res,200,0,'',req.session.userInfo)}else{responseClient(res,200,1,'请重新登录',req.session.userInfo)}});很简单,就是把请求中req.session.userInfo的信息返回过去。这样,当用户访问网站时,先发送这个请求,判断用户是否已经登录,如果已经登录,就拿到userInfo,直接往reducer里放一个action,修改statetree。前部前部比较传统。在最外层的容器中,直接发送请求即可classAppIndexextendsComponent{constructor(props){super(props);this.openNotification=this.openNotification.bind(this);this.shouldComponentUpdate=PureRenderMixiin.shouldComponentUpdate.bind(this);}openNotification(type,message){letthat=this;notification[type]({message:message,onClose:()=>{that.props.clear_msg();}});that.props.clear_msg();};render(){让{isFetching}=this.props;return(

{isFetching&&}{this.props.notification&&this.props.notification.content?(this.props.notification.type===1?this.openNotification('success',this.props.notification.content):this.openNotification('error',this.props.notification.content)):null}
)}componentDidMount(){this.props.user_auth();}}那么相应的saga处理也比较常规,这里就不说权限认证了,因为是博客系统,所以所谓的权限就是判断登录用户是否是管理员。我们在设计用户表的时候,增加了一个标识项。当然,我们可以随意使用其他字符来标识管理员和普通用户。render(){const{url}=this.props.match;if(this.props.userInfo.userType){return(
{this.props.userInfo.userType==='admin'?
<开关><路由路径={`${url}/managerTags`}component={AdminManagerTags}/><路由路径={`${url}/newArticle`}component={AdminNewArticle}/><路由路径={`${url}/detail`}component={Detail}/>
:}
)}else{return}}在admin.js中判断state中是否有选项userInfo。如果userInfo有值,说明已经登录,如果没有值,则跳转到NotFound页面。为什么userInfo为空时先显示notFound界面,而不是直接重定向?这里有个大坑。详见我在segmentFault上的提问:reactreduxauthentication,上面取state的问题是admin的权限认证。如上,admin登录获取的管理后,可以进入管理界面。admin登录管理后台后,会直接跳转到博客首页。综上所述,我们已经把免用户登录和权限管理的问题一一梳理清楚了。主要是通过session和statetree的判断。下一篇开始后端部分的开发~##项目实现步骤系列博客实战React技术栈+快递前端博客项目(0)——预热一波实战React技术栈+快递前端博客项目(一)--整体项目结构搭建,state状态树设计实战react技术栈+快递前端博客项目(二)--前端react-xxx,路由配置实战react技术栈+express前端博客项目(三)——后端路由、代理、静态资源托管等配置说明实战react技术栈+express前后端博客项目(四)——博客首页代码编写与redux-saga组织实战react技术栈+express前后端博客项目(五)--实现前后端登录功能实战react技术栈+express前后端博客项目(6)——使用session实现免费登录+管理后台权限验证实战react技术栈+express前端博客项目(7)——前端管理界面用户查看功能+后端对应界面开发实战react技术栈+express前后端博客项目(八)——前端管理接口标签管理功能+后端对应接口开发实战react技术栈+express前后端博客项目(9)--前端管理界面评论管理功能+后端对应界面开发实战react技术栈+快递前端博客项目(10)--前端管理界面发布功能实战react技术栈+express前端博客项目(十一)——文章部分增删改查对应的post端接口实战react技术栈+express前后端博客项目(十二)——前端-发帖部分的前端改进(增删改查、分页等)实战React技术栈+快递前后端博客项目(13)--发帖部分的前端改进(增删改查)实战react技术栈+express前后端博客项目(十四)——内容详情页展示及阅读数实战react技术栈+express前端和后端博客项目(15)--博客添加评论功能及相应后端实现实战react技术栈+快递前后端博客项目(16)--实战react技术栈的pm2说明+express前后端博客项目(17)--收工##交流如果有什么不是很清楚的地方,或者需要和我交流的,欢迎提issue。或者加群联系我~扫码关注我的个人微信公众号,直接回复,必有回复。分享更多原创文章。点击交流学习加我微信和qq群。一起学习,一起进步---欢迎兄弟们加入:Node.js技术交流群:209530601React技术栈:398240621前端技术聊:604953717(新)---