使用URL参数+Controls层实现网站用户权限管理

 
昨天去杭州的信诺科技 面试,被问到一个关于用户权限管理的问题,当时做了一个些简单的回答以后,自己又好好的想了想自己曾使用过的一种网站用户权限管理方法,就是本人原创的使用URL参数+Controls层实现网站用户权限的方式,我本人感觉很不错,所以向大家介绍一下,也可以讨论一下,下面我先列举一些常用的用户权限管理实现的方法,然后再介绍我自己原创的使用URL参数+Controls层实现网站用户权限的方法。

1、使用ASP.Net自带的权限管理

在web.config文件中修改以下的内容:

<authentication mode="Forms">
<forms name=".ASPXUSERDEMO" loginUrl="login.aspx" protection="All" timeout="60" />
</authentication>
<authorization>
<deny users="?" />
</authorization>

2.在login.aspx中如果用户名和密码正确则给予验证:

FormsAuthentication.SetAuthCookie(TextBox_name.Text,false); //在本页
FormsAuthentication.RedirectFromLoginPage(TextBox1.Text,false); //转到操作页

3.退出验证:

FormsAuthentication.SignOut();

4.获得当前用户的名字:

User.Identity.Name;

评点:该方法非常简单、便捷和易于管理,你只要将需要验证页面放在该文件夹就可以了,但是该方法只能在做简单的用户管理时使用,因为它只有匿名用户和非匿名用户的划分,不能对多级用户进行划分。


2、使用XML配置网站用户权限

该方法是昨天那位面试官提的一种方法,就是在每个目录下面建立一个XML权限配置文件,当用户需要访问这个目录的文件时,通过读取该XML文件信息来判断该用户是否有权限访问。

评点:本人认为该方法显然不易于维护和管理,在文件夹比较多且权限组较多时,很容易造成混乱,而且在用户访问该文件下任何一个文件时都需要读取XML文件来判断,那么就需要在每个文件中都加入权限判断操作的代码。


3、使用数据库字段标记方式

这也许是我们最常用到的方式,许多的大型系统都采用的这样的做法,一般就建立一张权限表,比如:

权限组名称

权限

超级管理员1,1,1,1,1,1
管理员1,0,0,1,1,1
用户0,0,0,0,1,1


该表需要记录多个权限组,比如超级管理员、管理员、用户等,每个权限组设置不同的权限,然后再将某用户隶属于该权限组,甚至也可以在用户表中对某用户的权限进行单独设置,用户权限从用户组权限继承以外,然后还需包括自己的私有权限。


评点:该方法的可扩展性很强,基本上可以完成所有权限管理需要的操作,但是它也有不好的地方,那就是在用户进行某项操作之前,你都需要在程序中加入权限判断的操作,才能返回“允许”或“拒绝”操作的指令,这样显然不易于管理,而且权限的层次结构在程序中不清晰,维护也不方便。


4、使用URL参数+Controls层实现网站用户权限

本方法其实是第3种方法的改进,将ASP.Net中Controls层结构与程序中的用户权限层结构相结合,利用URL 参数标记字段,当然也可以使用ViewState来标记,具体实现方法如下:

网站中只有一个.aspx页,在页中加入一个PlaceHolder控件,然后在Page_Load中加入:

if (Action == null)
{
    PlaceHolder1.Controls.Add(Page.LoadControl("./Controls/Default.ascx"));
}
else if (Action == "Manage")
    PlaceHolder1.Controls.Add(Page.LoadControl("./Controls/Manage.ascx"));
}
else if (Action == "Help")
{
    PlaceHolder1.Controls.Add(Page.LoadControl("./Controls/Help.ascx"));
}
... ...

用URL参数标记当前的用户操作位置,然后显示相应的内容,比如Manage.ascx中的内容只能管理员以上的用户才能访问,则在Manage.ascx的Page_Load中加一个权限判断当前用户是否拥有访问权限,在M anage.ascx中有“用户管理”、“地区管理”、“文章管理”等多个栏目,而只有超级管理员能进行“地区管理”。URL标记如下:

用户管理:Default.Aspx?Action=Manage&Sort=User

文章管理:Default.Aspx?Action=Manage&Sort=Article

地区管理:Default.Aspx?Action=Manage&Sort=Area

需要在Manage.ascx中添加一个PlaceHolder控件,判断Sort参数显示相应的Control内容,如下:
 
if (Sort=="User")
{
    PlaceHolder1.Controls.Add(Page.LoadControl("./Controls/User.ascx"));
}
else if (Sort== "Article")
    PlaceHolder1.Controls.Add(Page.LoadControl("./Controls/Article.ascx"));
}
else if (Sort== "Area")
{
    PlaceHolder1.Controls.Add(Page.LoadControl("./Controls/Area.ascx"));
}

你只需要在“地区管理”的文件中加入一个权限判断当前用户是否为超级管理员。在“用户管理”以及“文章管理”的文件中就不需要判断用户权限。

评点:在Default层中允许所有用户访问,同时包括Help.ascx等,在Manage层只允许管理员以上的用户访问,而在Area层则只允许超级管理员访问,使用该方法的优点就是无需在每一个页面添加权限判断的操作,而是在一个Controls层添加一个权限判断的操作,而且权限与程序的结构层次清晰,易于维护与管理,它不基于应用程序的目录级,而是基于ASP.net的Controls层方式,比如需要进入Area层,就必须先进入Manage层,而User层就无须在进行权限的判断。


如果你有更好的方法,欢迎和我讨论,我的QQ:527474    Email:ruixing123@hotmail.com

posted on 2005-11-01 14:04 非非.Net 阅读(267) 评论(6)   编辑  收藏 收藏至365Key 所属分类: Dotnet技术

Feedback

#  re: [原创]使用URL参数+Controls层实现网站用户权限管理 2005-11-01 15:09 Sadly_Lee
看了你的第四种方法,有点新意,但是如果用户权限分得很细,启不是要建很多文件
  

#  re: [原创]使用URL参数+Controls层实现网站用户权限管理 2005-11-01 16:21 徐灿钊Asp.net专栏
DNN有类似的实现方法。
  

#  re: [原创]使用URL参数+Controls层实现网站用户权限管理 2005-11-01 16:21 YINOR
同意楼上的说法,还有由于以更改URL的参数来改变权限,那这样不是很不安全
  

#  re: [原创]使用URL参数+Controls层实现网站用户权限管理 2005-11-01 16:28 Michael.zh
好长,下次在首页放个简介链进来就好了
  

#  re: [原创]使用URL参数+Controls层实现网站用户权限管理 2005-11-01 16:56 pass
如果后台分布在很多站点怎么办
  

#  re: [原创]使用URL参数+Controls层实现网站用户权限管理 2005-11-02 01:47 ssp
方法1:“但是该方法只能在做简单的用户管理时使用,因为它只有匿名用户和非匿名用户的划分,不能对多级用户进行划分。”

不是吧,asp.net自带的权限管理支持用户角色(Roles)的,怎么会“只有匿名用户和非匿名用户的划分,不能对多级用户进行划分”呢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现用户登陆注册需要以下步骤: 1. 安装 Django 和 MySQL 数据库,并创建一个 Django 项目。 2. 配置 MySQL 数据库信息,在 Django 项目的 settings.py 文件中设置 DATABASES。 3. 创建一个 Django 应用,在应用中定义用户模型,并在 settings.py 文件中设置 AUTH_USER_MODEL。 4. 在应用中创建视图函数和 URL,用于处理用户注册和登陆请求。 5. 使用 Vue 和 HTML 实现用户注册和登陆页面,并通过 Ajax 请求与 Django 后端交互。 下面是具体的实现步骤: 1. 安装 Django 和 MySQL 数据库,并创建一个 Django 项目。 假设你已经安装好了 Django 和 MySQL 数据库,并创建了一个名为 myproject 的 Django 项目。 2. 配置 MySQL 数据库信息,在 Django 项目的 settings.py 文件中设置 DATABASES。 打开 myproject/settings.py 文件,找到 DATABASES 配置项,将其配置为: ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydatabase', 'USER': 'mydatabaseuser', 'PASSWORD': 'mypassword', 'HOST': 'localhost', 'PORT': '3306', } } ``` 其中,'NAME'、'USER'、'PASSWORD'、'HOST'、'PORT' 分别为你的 MySQL 数据库的名称、用户名、密码、主机地址和端口号。 3. 创建一个 Django 应用,在应用中定义用户模型,并在 settings.py 文件中设置 AUTH_USER_MODEL。 打开终端,进入到 myproject 目录下,执行以下命令创建一个名为 accounts 的 Django 应用: ```bash python manage.py startapp accounts ``` 打开 accounts/models.py 文件,定义用户模型: ```python from django.contrib.auth.models import AbstractUser class User(AbstractUser): pass ``` 这里使用 Django 内置的 AbstractUser 模型,继承它并添加一些额外的字段和方法。 打开 myproject/settings.py 文件,将 AUTH_USER_MODEL 设置为 accounts.User: ```python AUTH_USER_MODEL = 'accounts.User' ``` 这样就成功定义了一个用户模型,并且将其作为认证系统的用户模型。 4. 在应用中创建视图函数和 URL,用于处理用户注册和登陆请求。 打开 accounts/views.py 文件,定义用户注册和登陆的视图函数: ```python from django.shortcuts import render from django.contrib.auth import authenticate, login from django.contrib.auth.decorators import login_required from django.http import JsonResponse from .forms import RegistrationForm, LoginForm def registration(request): if request.method == 'POST': form = RegistrationForm(request.POST) if form.is_valid(): form.save() return JsonResponse({'success': True}) else: return JsonResponse({'success': False, 'errors': form.errors}) else: form = RegistrationForm() return render(request, 'registration.html', {'form': form}) def user_login(request): if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): username = form.cleaned_data['username'] password = form.cleaned_data['password'] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return JsonResponse({'success': True}) else: return JsonResponse({'success': False, 'errors': {'__all__': ['Invalid login credentials']}}) else: return JsonResponse({'success': False, 'errors': form.errors}) else: form = LoginForm() return render(request, 'login.html', {'form': form}) @login_required def home(request): return render(request, 'home.html') ``` 这里使用了 Django 内置的认证系统,authenticate 和 login 函数分别用于验证用户和登录用户。 接下来,打开 accounts/forms.py 文件,定义用户注册和登陆表单: ```python from django import forms from django.contrib.auth.forms import UserCreationForm, AuthenticationForm from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from .models import User class RegistrationForm(UserCreationForm): email = forms.EmailField(required=True) class Meta: model = User fields = ('username', 'email', 'password1', 'password2') def clean_email(self): email = self.cleaned_data.get('email') if User.objects.filter(email=email).exists(): raise ValidationError(_('Email already exists')) return email class LoginForm(AuthenticationForm): class Meta: model = User fields = ('username', 'password') ``` 这里使用了 Django 内置的表单类 UserCreationForm 和 AuthenticationForm,分别用于用户注册和用户登陆。 最后,打开 accounts/urls.py 文件,定义 URL 路由: ```python from django.urls import path from . import views app_name = 'accounts' urlpatterns = [ path('register/', views.registration, name='registration'), path('login/', views.user_login, name='login'), path('home/', views.home, name='home'), ] ``` 这里定义了三个 URL 路由,分别用于用户注册、用户登陆和用户主页。 5. 使用 Vue 和 HTML 实现用户注册和登陆页面,并通过 Ajax 请求与 Django 后端交互。 打开 templates/registration.html 文件,定义用户注册页面: ```html {% extends 'base.html' %} {% block content %} <h2>Register</h2> <form id="registration-form"> {% csrf_token %} <div class="form-group"> <label>Username:</label> {{ form.username }} </div> <div class="form-group"> <label>Email:</label> {{ form.email }} </div> <div class="form-group"> <label>Password:</label> {{ form.password1 }} </div> <div class="form-group"> <label>Confirm password:</label> {{ form.password2 }} </div> <button type="submit" class="btn btn-primary">Register</button> </form> <div id="registration-errors" class="text-danger"></div> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> <script> const registrationForm = document.querySelector('#registration-form'); const registrationErrors = document.querySelector('#registration-errors'); registrationForm.addEventListener('submit', (event) => { event.preventDefault(); const formData = new FormData(registrationForm); axios.post('{% url "accounts:registration" %}', formData) .then(response => { if (response.data.success) { window.location.href = '{% url "accounts:home" %}'; } else { registrationErrors.innerHTML = Object.values(response.data.errors).join('<br>'); } }) .catch(error => { console.error(error); }); }); </script> {% endblock %} ``` 这里使用了 Bootstrap 和 Axios,分别用于样式和 Ajax 请求。当用户提交注册表单时,通过 Axios 发送 POST 请求到后端,如果注册成功,则跳转到用户主页,否则在页面上显示错误信息。 打开 templates/login.html 文件,定义用户登陆页面: ```html {% extends 'base.html' %} {% block content %} <h2>Login</h2> <form id="login-form"> {% csrf_token %} <div class="form-group"> <label>Username:</label> {{ form.username }} </div> <div class="form-group"> <label>Password:</label> {{ form.password }} </div> <button type="submit" class="btn btn-primary">Login</button> </form> <div id="login-errors" class="text-danger"></div> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> <script> const loginForm = document.querySelector('#login-form'); const loginErrors = document.querySelector('#login-errors'); loginForm.addEventListener('submit', (event) => { event.preventDefault(); const formData = new FormData(loginForm); axios.post('{% url "accounts:login" %}', formData) .then(response => { if (response.data.success) { window.location.href = '{% url "accounts:home" %}'; } else { loginErrors.innerHTML = Object.values(response.data.errors).join('<br>'); } }) .catch(error => { console.error(error); }); }); </script> {% endblock %} ``` 这里与注册页面类似,通过 Axios 发送 POST 请求到后端,如果登陆成功,则跳转到用户主页,否则在页面上显示错误信息。 打开 templates/home.html 文件,定义用户主页: ```html {% extends 'base.html' %} {% block content %} <h2>Welcome, {{ request.user.username }}!</h2> <p>You are logged in.</p> {% endblock %} ``` 这里只是简单地显示一些欢迎信息。 最后,打开 templates/base.html 文件,定义网站的基础模板: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{% block title %}My Website{% endblock %}</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css"> </head> <body> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <a class="navbar-brand" href="#">My Website</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav"> {% if request.user.is_authenticated %} <li class="nav-item active"> <a class="nav-link" href="{% url "accounts:home" %}">Home <span class="sr-only">(current)</span></a> </li> <li class="nav-item"> <a class="nav-link" href="{% url "logout" %}">Logout</a> </li> {% else %} <li class="nav-item"> <a class="nav-link" href="{% url "accounts:registration" %}">Register</a> </li> <li class="nav-item"> <a class="nav-link" href="{% url "accounts:login" %}">Login</a> </li> {% endif %} </ul> </div> </nav> <div class="container mt-4"> {% block content %}{% endblock %} </div> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script> </body> </html> ``` 这里使用了 Bootstrap 的导航条和响应式布局,根据用户是否已经登录来显示不同的导航链接。 至此,一个简单的 Django+MySQL+Vue+HTML 实现用户登陆注册的 web 应用就完成了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值