Django + rest_framework + VUE + ldap 实现基本登陆验证

需要安装组件

  1. ldap
  2. django_auth_ldap

后端代码

setting.py 设置

  • 引入包
import json
from django.shortcuts import render_to_response,render,redirect
from django.template import RequestContext
from django.http import HttpResponse,HttpResponseRedirect
from django.contrib import auth
from rest_framework.response import Response
from rest_framework import status
from rest_framework.decorators import api_view
from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout
from django.contrib.auth.models import User

import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType, PosixGroupType, LDAPGroupQuery

AUTHENTICATION_BACKENDS = (
    ‘django.contrib.auth.backends.ModelBackend‘,
    ‘django_auth_ldap.backend.LDAPBackend‘,
)

AUTH_LDAP_SERVER_URI = "ldap://192.168.0.19:389"  # 服务器地址
AUTH_LDAP_BIND_DN = "DN"
AUTH_LDAP_BIND_PASSWORD = "password"

AUTH_LDAP_USER_ATTR_MAP = {  # key为数据库字段名,value为ldap中字段名,此字典解决django model与ldap字段名可能出现的不一致问题
    "username": "sAMAccountName",
    "name": "cn",
    "email": "mail",
    "first_name": "displayName"
}

base_dn=‘OU=XX,DC=xx,DC=com‘ #这个dn要根据现实场景填写
#设置用户的搜索
AUTH_LDAP_USER_SEARCH = LDAPSearch(base_dn, ldap.SCOPE_SUBTREE,
                                   "(&(objectcategory=person)(sAMAccountName=%(user)s))",
                                   attrlist=[‘cn‘, ‘givenName‘, ‘mail‘,‘sAMAccountName‘, ‘displayName‘])

AUTH_LDAP_ALWAYS_UPDATE_USER = True

在view.py中实现代码

login 我使用的

@api_view([‘POST‘])
def loginauth(request):
    user_loggedin = ‘Guest‘
    displayName = "Guest"
    errors_list = []
    context = {‘username‘: user_loggedin, ‘displayName‘: displayName, ‘state‘: False}
    if request.method == ‘POST‘:
        data = request.data
        username = data.get(‘username‘)
        password = data.get(‘password‘)
        usergo = authenticate(username=username, password=password)
        print(‘authuser‘, usergo)
        if usergo is not None:
            auth_login(request, usergo)
            uu = request.user
            user_loggedin = usergo.username
            displayName = usergo.first_name
            context = {‘username‘: user_loggedin, ‘displayName‘: displayName, ‘state‘: True}
            return Response(context, status=status.HTTP_200_OK)
        return Response(context, status=status.HTTP_200_OK)
@api_view([‘GET‘])
def logoutauth(request):
    auth_logout(request)
    return Response(None,status=status.HTTP_200_OK)

如果是前后端分离的可以做一个接口

@api_view([‘GET‘])
def checklogin(request):

    user_loggedin = ‘Guest‘
    displayName = "Guest"
    context = {‘username‘: user_loggedin, ‘displayName‘: displayName, ‘state‘: False}
    uu = request.user
    if uu:
        usergo = User.objects.filter(username=uu).first()
        if usergo is not None:
            user_loggedin = usergo.username
            displayName = usergo.first_name
            context = {‘username‘: user_loggedin, ‘displayName‘: displayName, ‘state‘: True}
        return Response(context,status=status.HTTP_200_OK)
    return Response(context, status=status.HTTP_200_OK)

url.py设置

urlpatterns = [
    url(r‘^login‘, loginauth,name="login"),
    url(r‘^logout‘, logoutauth,name="logout"),
    url(r‘^checklogin‘, checklogin,name="checklogin"),
    ]

前端代码

vue main.js中添加

import Vue from ‘vue‘;
import App from ‘./App‘;
import router from ‘./router‘;
import axios from ‘axios‘;
import ElementUI from ‘element-ui‘;
import "babel-polyfill";

axios.defaults.withCredentials=true;
Vue.use(ElementUI, { size: ‘mini‘ });
Vue.prototype.$axios = axios;
axios.defaults.baseURL =‘http://0.0.0.0:8080‘;

//使用钩子函数对路由进行权限跳转
router.beforeEach((to, from, next) => {
    axios.get(‘/checklogin/‘).then((res) => {
        const  role =res.data.state;
        if(!role && to.path !== ‘/login‘ && to.meta.requireAuth)
        {
            next(‘/login‘);
        }else if(role && to.path == "/login")
        {
            next({path:‘/index‘,data:role});
        }else
        {
            next();
        }

    }).catch((err) => {
        console.log(err);
    });

})

new Vue({
    router,
    render: h => h(App)
}).$mount(‘#app‘);

登陆 login.vue

<template>
    <div class="login-wrap">
        <div class="ms-title">Top Speed Data</div>
        <div class="ms-login">
            <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="0px" class="demo-ruleForm">
                <el-form-item prop="username">
                    <el-input v-model="ruleForm.username" placeholder="用户名"></el-input>
                </el-form-item>
                <el-form-item prop="password">
                    <el-input type="password" placeholder="密码" v-model="ruleForm.password" @keyup.enter.native="submitForm(‘ruleForm‘)"></el-input>
                </el-form-item>
                <div class="login-btn">
                    <el-button type="primary" @click="submitForm(‘ruleForm‘)">登录</el-button>
                </div>
                <p v-show="state" style="font-size:12px;line-height:30px;color:#ff1800;">用户名或密码错误</p>
            </el-form>
        </div>
    </div>
</template>

<script>
    export default {
        data: function(){
            return {
                ruleForm: {
                    username: ‘‘,
                    password: ‘‘
                },
                rules: {
                    username: [
                        { required: true, message: ‘请输入用户名‘, trigger: ‘blur‘ }
                    ],
                    password: [
                        { required: true, message: ‘请输入密码‘, trigger: ‘blur‘ }
                    ]
                },
                state:false
            }
        },
        methods: {
            submitForm(formName) {
                var _this =this;
                _this.state = false;
                this.$refs[formName].validate((valid) => {
                    if (valid) {
                        this.$axios.post(‘/login/‘,_this.ruleForm).then((res) => {
                            if(res.data.state)
                            {
                                this.$router.push(‘/indwx‘);
                            }else
                            {
                                _this.state = true;
                            }
                        }).catch((err) => {
                            _this.state = true;
                            console.log(err);
                        });
                    } else {
                        console.log(‘error submit!!‘);
                        return false;
                    }
                });
            }
        }
    }
</script>

<style scoped>
    .login-wrap{
        position: relative;
        width:100%;
        height:100%;
    }
    .ms-title{
        position: absolute;
        top:50%;
        width:100%;
        margin-top: -230px;
        text-align: center;
        font-size:30px;
        color: #fff;

    }
    .ms-login{
        position: absolute;
        left:50%;
        top:50%;
        width:300px;
        height:160px;
        margin:-150px 0 0 -190px;
        padding:40px;
        border-radius: 5px;
        background: #fff;
    }
    .login-btn{
        text-align: center;
    }
    .login-btn button{
        width:100%;
        height:36px;
    }
</style>

退出登陆

methods:{
            // 用户名下拉菜单选择事件
            handleCommand(command) {
                if(command == ‘loginout‘){
                    this.$axios.get(‘/logoutauth/‘).then((res) => {
                        this.$router.push(‘/login‘);
                    }).catch((err) => {
                        console.log(err);
                    });

                }
            }
         }

原文地址:https://www.cnblogs.com/crazy-chinese/p/9936817.html

时间: 2024-11-03 01:16:22

Django + rest_framework + VUE + ldap 实现基本登陆验证的相关文章

django rest_framework vue 实现用户登录

django rest_framework vue 实现用户登录 后端代码就不介绍了,可以参考  django rest_framework 实现用户登录认证 这里介绍一下前端代码,和前后端的联调过程 在components下新建login.vue 文件 <template> <div class="login"> <el-form label-width="80px"> <el-form-item label="

django简单用户登陆验证

一.django简单用户登陆验证   前端页面:     <div class="container  col-lg-6  col-lg-offset-4">         <br><br><br><br><br>       <form class="form-signin col-sm-4 col-lg-offset-2" action="{% url 'login' %}

Django中间件进行用户登陆验证

通常情况下我们在django中设置登陆验证,使用装饰器来检验是否登陆过.这种情况,我们所有的视图函数都需要加上,太low. 下面我们使用中间件来进行登陆验证~~~ 我们先做出登陆页面: 1.models.py #先在models中设置用户名密码字段 from django.db import models class UserInfo(models.Model): # nid = models.AutoField(primary_key=True) # nid = models.BigAutoF

Vue 页面权限控制和登陆验证

更多文章 页面权限控制 页面权限控制是什么意思呢? 就是一个网站有不同的角色,比如管理员和普通用户,要求不同的角色能访问的页面是不一样的.如果一个页面,有角色越权访问,这时就得做出限制了. Vue 动态添加路由及生成菜单这是我写过的一篇文章, 通过动态添加路由和菜单来做控制,不能访问的页面不添加到路由表里,这是其中一种办法. 另一种办法就是所有的页面都在路由表里,只是在访问的时候要判断一下角色权限.如果有权限就让访问,没有权限就拒绝,跳转到 404 页面. 思路: 在每一个路由的 meta 属性

Django rest_framework 实用技巧

前言: 最近工作中需要用到Django rest_framework框架做API, 边学边写,记录了一些实际工作中需要用到的功能,不是很全也不系统,以后需要什么功能可以在这查询. 后续还会更新其它的用法 1 #################################################################### 2 ########安装和简单使用 3 ###### 准备工作 4 pip install rest_framework # 安装 5 6 INSTALL

Django中间件 及 form 实现用户登陆

Django中间件 及 form 实现用户登陆 Form 验证 密码调用md5 加密存储 form.add_error("字段名", "错误信息") 自定义错误信息 装饰器实现 用户认证 中间件实现 用户认证 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到性能. django默认的中间件在settings.py中 当用户发起请求

Python之Django rest_Framework(2)

实例化: v1 = ["view.xxx.path.Role","view.xxx.path.Group",] 可以循环,循环出来的每一个不能实例化 如果把v1循环弄成每一个对象列表,通过rsplit切割,在通过importlib.import_module拿到每一个路径,在通过getattr把它的类名拿过来,这个类加括号就是实例化想 for item in v1: m = importlib.import_module('view.xxx.path') cls =

python之Django rest_framework总结

一.rest api    a.api就是接口         如: - http://www.oldboyedu.com/get_user/                - http://www.oldboyedu.com/get_users/    b.api的两个用途         1.为别人提供服务         2.前后端分离 二.restful     a.--字面意思:表征状态转移     b.面向资源编程,对互联网上的任意东西都视为资源          如:- http:

Django之admin管理数据库,cookie验证及分页设置

一.admin管理数据库 1)models.py创建class类表 class Book(models.Model): name=models.CharField(max_length=20) price=models.IntegerField() pub_date=models.DateField() publish=models.ForeignKey("Publish") authors=models.ManyToManyField("Author") # 会自