导航:首页 > 万维百科 > 网站登陆权限设计

网站登陆权限设计

发布时间:2020-11-08 19:24:35

1、权限设计问题

一、概要

通常,需要单独的权限系统是解决授权的管理和维护,再分配等难题,不针对开发而言。

系统架构目标:在易于理解和管理,开发的前提下,满足绝大部分粗粒度和细粒度权限控制的功能需要。

除了粗粒度权限,系统中必然还会包括无数对具体Instance的细粒度权限。这些问题,被留给对框架的扩展方法来解决,这样的考虑基于以下两点:

1、细粒度的权限判断必须要在资源上获取权限分配的支持的上下文信息才可能得以实现。

2、细粒度的权限常常具有相当大的业务逻辑相关性。对不同的业务逻辑,常常意味着完全不同的权限判定原则和策略。相比之下,粗粒度的权限更具通用性,将其实现为一个架构,更有重用价值;而将细粒度的权限判断实现为一个架构级别的东西就显得繁琐,增加架构的复杂性。而且不是那么的有必要,用定制的代码来实现就更简洁,更灵活。否则会变成各种逻辑代码的堆砌。

比如,proct post数量的控制,这种一般要知道用户个性化的信息,付钱数量到数据库中查找最高数量,还要知道此用户已经有多少产品等,规则不具备通用性和重用性,

所以细粒度控制不应该放在权限架构层来解决。实例级的细粒度权限的解决方案就是将它转化为粗粒度权限,这样我们权限客户端就变得很简单了。

名词解释

粗粒度权限:一般可以通过配置文件来授权,授权只有真假,没有多少之分,不需要上下文的支持。不消耗资源的。

逻辑表达式:判断“Who对What(Which)进行How的操作”的逻辑表达式是否为真。

别名:静态授权、类级授权

细粒度权限:不能通过配置文件等表达,需要特定上下文的支持.

逻辑表达式:判断“When(Where)的时候,Who对What(Which)进行How的操作”的逻辑表达式是否为真。

别名:动态授权、实例级授权

设计原则:框架只提供粗粒度的权限。细粒度的权限也需要集中管理和维护,细粒度的权限通过定制的扩展代码将细粒度转化为粗粒度授权。

二、权限系统的设计

权限往往是一个极其复杂的问题, 设计权限系统第一个要解决的问题就是什么样的行为是需要权限控制,什么样的是业务方法。他们之间本来是没有明确的区分,任何权限从某种角度上说可以是一种业务方法。为了以后管理和开发方面我们从概念上需要将权限和业务明确划分清楚,指导开发。

权限控制行为: 对What(Which)进行How的操作需要区分Who,具有Who身份差异性和可替换性。 我们将此类操作作为权限。

特点: 可以收回也可以分配的,具有一定的抽象级别。 消耗资源,行为结果具备一些持久性的影响。

业务逻辑行为: 对What(Which)进行How的操作的时候与Who的身份无关或者具有Who身份差异性但 是不具有可替换性。

特点: 不能抽象和共享,很难回收和分配。不消耗资源,不产生持久性。现实中也存在某一时期行为是业务逻辑,最后演变成权限控制,或者相反的过程。

1、粗粒度权限设计

采用自主型访问控制方法,操作给予访问控制列表。每一个用户通过角色获得一组权限集合,权限系统的功能是验证用户申请的权限(集合)是否在这个集合当中,即申请的权限(集合)是否投影在用户拥有的权限集合,换句话说:只要某用户直接或者间接的属于某个Role那么它就具备这个Role的所有权限许可。

一个自主型访问控制方法的权限系统包括以下几个部分:角色、权限、访问控制表、

(1)权限

描述一个权限可以通过以下几个要素说明:

类型(class):

名称(name):

动作(actions):

掩码(mask):

属性:

具体权限Example:

1、Test

类型(class):com.yangjs.secutiry. permissions. TestPermission

名称(name):如:test.* ,test.sub.* ,test.sub1.sub2

动作(actions): brower_detail ,post,repost,……

掩码(mask):0x1,0x2,0x4…..

属性: 无

.…………..

l 存取控制器(my--acl.xml)配置

存取控制项(ACE):角色到权限的映射集合,表示某个角色可以在某些资源上执行某些动作,它们之间通过role关联(继承),ACE之间产生包含关系。

存取控制列表(ACL):ACE的集合。

我们的存取控制器(ACL)是通过一个xml的配置文件说明,存取控制列表由多个存取控制项(ACE)来描述。使用方法(略)

2、细粒度权限设计

细粒度授权需要上下文的支持,而且每个权限控制的上下问题都不一样,这由相关的业务逻辑决定,而且此类授权一般变化较快,应此需要将强的可维护性和扩展性,支持变化,但又不能够太复杂,否则缺乏可执行性。虽然此类权限个性化较强,我们仍然可以总结出很多共性:

(1) 几乎所有的授权需要用户的角色和ID.

(2) 特定的上下文几乎都同用户资源使用情况相关.

我们将此类信息称为UserState 即:User角色以及资源使用情况和当前状态。大部分信息我们在用户登陆的时候已经。获得。授权贯穿Web层和Biz层,因此我们的登陆要独立于Web端。因此上下文我们可以用UserState结合其他来抽象。

关于上下文的维护问题,我们不可能将UserState此类参数在Web层和Biz层来回传递,更加不能在需要授权的地方都加上一个这样的方法参数,这样不太现实。其次如果在授权的地方再从数据库中取一次这样虽然能够解决部分问题(不能解决userId的传递),这样效率太低,不能接受。

解决方法就是将此类信息cache起来,用的时候再去取,由于此类信息具有非常高的并发性,对线程安全较高,因此我们决定将此类信息放入一个线程上下文的内存cache中。此外我们由于引入cache,就需要解决所有cache共有的维护性问题。

Cache的生命周期:用户的一次请求,属于线程级,用户请求线程结束,Cache结束。

Cache的更新:当上下文信息发生变化是需要及时更新Cache,这是一个不可避免的步骤。

Cache丢失:发生在如系统down机,线程崩溃,内存溢出等等,对用户来说就是当前请求突然中断。

当用户重新发送请求,我们的系统就需要重新验证用户,此时我们可以更新Cache解决丢失问题。

Cache的清理:这个实现就是当用户请求结束,返回应答的时候清理,可以通过Filter实现,比较简单。

以上是相关的原理部分,我们看看系统地实现:

实现:线程上下文的cache

实现类:com.yangjs.cache.ThreadContextCache:
public class ThreadContextCache {

public static Map asMap();

public static boolean containsKey(Object key);

public static boolean containsValue(Object key);

public static Object get(Object key);

public static void put(Object key, Object value);

public static Object remove(Object key);

public static void clean();

public static int size() ;

public static void destroy()

2、javaweb 项目的系统权限管理,怎么设计?

java web 项目的系统权限管理设计方法有两种:
方法一、SpringMVC整合Shiro (Shiro是强大的权限管理框架)
参考:http://www.360doc.com/content/14/0529/09/11298474_381916189.shtml

方法二、基于角色的访问权限控制
基于角色的访问权限控制
首先基于角色的访问权限控制,所有的用户访问都会经过过滤,然后分析访问权限加以认证!权限中的重点,表的设计。

普遍三张表,表名自定义。用户表(User),角色表(Role),资源表(Resource)
用户表没有特别,很简单。关键是角色表和资源表。

3、web后台权限设计有哪几种实现方式

要么你有超级管理员权限,要么你有FTP权限直接修改源文件!你可以到数据库看看都有哪些用户,你都登陆看看哪个是超级管理员

4、php、HTML、网页设计,如何设定权限?

比如你登录后存储用户名是用session, 而且键名是user

那么

在网页2头部加上如下代码:

<?php
 session_start();
 if ( $_SESSION['user'] != 'bc' ) {
  echo '<script>alert("无权限");</script>';
  die; 
}

其他的同理!

 

当然, 具体项目这样做的话, 肯定是不现实的, 那么多用户, 都用用户名来判断的话, 会整死人的!

所以, 我这个代码也只是跟着你的思路走而已!

 

建议: 数据库再增加一个字段, 用于记录该用户权限

         登录成功后, 同时取出该用户的权限字段值,并进行储存( 比如session )

       然后在每个页面用权限字段来进行判断!

5、c#用户权限设计

说的个不明不白,你要的是数据库设计 还是代码判断。

如果是登录权限。。。
数据库弄个权限id 代码根据id判断就行了

6、谁能提供一个关于用户角色权限设计完整的方案。谢谢

User:用户表,存放用户信息
Role:角色表,存放角色信息
UserInRole:用户角色映射表,存放用户和角色的对就关系,多对多,一个用户可以对应多个
角色,而不同的角色有一同的权限。
Permissions:权限表,不同的角色对应不同的权限。权限信息使用一个字段flag来表示,
好处是可以使用位运算来计算权限,缺点是用位标识的权限受理论值限制,如int理论上可以
标识31种不同的权限, 当然可以整加一个字段来弥补,ApplicationID标识不同的模块
Application:模块信息。
[Flags]
public enum Flag:long
{
View=1,
Edit=2,
Delete=4
}
特性[Flag]告诉编译器,当编译器看到Flag枚举时,它会充许你用|(or)操作符组合枚举值,
就像二的整数幂一样,
例如 Flag Administer=Flag.View|Flag.Edit|Flag.Delete;表示三种权限的组合。
基础知识:
位运算
枚举Flag
当编译器看到Flag枚举时,它会充许你用|(or)操作符组合枚举值,
就像二的整数幂一样,
例如 Flag Administer=Flag.View|Flag.Edit|Flag.Delete;
常用操作,检查是否存在
Flag administer=Flag.View|Flag.Edit|Flag.Delete;
public bool Check(Flag administer,Flag mask)
{
bool bReturn = false;
if ((administer & mask) == mask)
bReturn = true;
return bReturn;
}
调用 Check(administer,Flag.Edit)将返回true.
public Flag SetBit(Flag administer,Flag mask)
{
return administer |= mask;

}
administer |= mask;操作相当于 administer = administer |mask;
从枚举中减去一种状态
administer &=mask;
如 :
Flag administer=Flag.View|Flag.Edit|Flag.Delete;
如需要禁止删除权限.
administer &=Flag.Delete;
另外,标记为flag的枚举类型,可以不设置值
public enum Flag:long
{
View,
Edit,
Delete
}
如需要设置,按以下规律, View=1,Edit=2,Delete=4,Reply=8按2次方累加,为什么会这样?因为他使用二进制操作,
当你使用 View=1,Edit=2,Delete=3,Reply=4这样的值, Flag.Delete 包含的值是Flag.Delete还是View=1|Edit=2就无从检测了.

每个用户,可以属于不同的角色不同的角色分配不同的权限,计算所有解权的所有可能的权限组合,只要有充许的权限,那么该用户既获取该权限。

在CS系统中,Permissions表合用了二个字段来标识权限.
AllowMask,DenyMask 规责是Deny优先,也就是说当权限标记为Deny那么不论是否Allow一律禁止该用户进行此项操作。

另外,像论坛类的权限设计,仅仅一个ApplicationID字段是不够用的,因为每个版块都需要设置不同的权限,来控制权限的粒度,可在增加一张Permission表,ApplicationID修改为版块ID
这样,就可以针对不同的版块设置不同的权限

好了,接下的问题是怎么和.net自带的权限系统挂钩了。。
在asp.net系统中 ,HttpContext.Current.User实现了一个接口IPrincipal,IPrincipal包含了另一个接口Identity
我们在设计User类的时候继承此接口
public class User:IPrincipal
{
string username;
public string Username
{
get{return username;}
set{username=value;}
}
}
实现IPrincipal接口方法
public IIdentity Identity
{
get {
if (!string.IsNullOrEmpty(username))
_Identity = new GenericIdentity(username,"Forums");
return (IIdentity)_Identity;
}
}
public bool IsInRole(string role)
{
.....
}
怎样和asp.net挂钩呢,这里可以在登陆时做检查
if(HttpContext.Current!=null){
User u= Users.GetUser(name);
HttpContext.Current.User =u;
在使用时
User u = HttpContext.Current.User as User;
当然检查用户角色可以直接用

if(HttpContext.Current.User.Identity.IsAuthenticated&&HttpContext.Current.User.IsInRole(角色名))

另外可以直接把到当用户权限策略挂接到当前线程 ,使用以下方法
AppDomain.CurrentDomain.SetPrincipalPolicy(User);

好了,接下来,怎么check权限?
我倾向于使用Attribute

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Delegate, Inherited = true, AllowMultiple = true)]
public class CheckPermissionAttribute : Attribute
{
int appID;
public int ApplicationID
{
get { return appID; }
set { appID = value; }
}
Permission _allMask;
public Permission AllMask
{
get { return _allMask; }
set { _allMask = value; }
}
public CheckPermissionAttribute(ApplicationID app, Permission allMask)
{
appID = app;
_allMask = allMask;
}
public CheckPermissionAttribute(Permission allMask)
{
_allMask = allMask;
}
}
AttributeUsage 第一个参数表示该属性可以应用于类,方法,属性,代理上
Inherited 检查继承的权限。
AllowMultiple 充许多次应用。
按下来,设计一个基类,继承自Page:
public class PageBase : Page
{
Flag _allMask;
/// <summary>
/// 检查类型权限
/// </summary>
public void CheckClass()
{
Type type = this.GetType();
CheckPermissionAttribute att = (CheckPermissionAttribute)CheckPermissionAttribute.GetCustomAttribute(type, typeof(CheckPermissionAttribute));
if (att != null)
{
Check(att.AllMask);
}
}
/// <summary>
/// 检查函数调用权限
/// </summary>
/// <param name="methodName">方法名</param>
public void CheckMethod(string methodName)
{
Type type = this.GetType();
string name = "*";
if (!string.IsNullOrEmpty(methodName))
name = methodName;
MemberInfo[] mis = type.FindMembers(MemberTypes.Method ,BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.IgnoreCase,Type.FilterNameIgnoreCase,name);
foreach (MethodInfo m in mis)
{
CheckPermissionAttribute att = (CheckPermissionAttribute)CheckPermissionAttribute.GetCustomAttribute(m, typeof(CheckPermissionAttribute));
if (att != null)
{
Check(att.AllMask);

}

}
return;

}
public void Check(Flag permissions)
{
if (!CheckPermission(permissions))
{
string url = string.Format("MsgPage.aspx?msg={0}", HttpUtility.UrlEncode("您没有权限访问该资源"));
Response.Redirect(url);
}
}
public void Check(ApplicationID appID, Flag permissions)
{
PermissionManager pm= Spaces.PermissionManager.Instance(appType);
if (!CheckPermission(pm,permissions))
{
string url = string.Format("MsgPage.aspx?msg={0}", HttpUtility.UrlEncode("您没有权限访问该资源"));
Response.Redirect(url);
}

}
protected override void OnInit(EventArgs e)
{
CheckClass();
base.OnInit(e);
}
}

如何使用:
[CheckPermission(2, Flag.View)]
public partial class MyPage : PageBase
{
}
若没有查看权限,会自运导向错误页面。
在类上应用挺方便。
方法上应用我于一个方法比较麻烦,我还没有找到在页面class里怎么获取当前调用的类名.
可以调用 CheckMethod(方法名称);如
[CheckPermission(2, Flag.Delete)]
public partial class MyPage : PageBase
{
public void test()
{
CheckMethod("test");
.......
}
}

7、html、php、网页设计,用户权限设置问题,如下:

那你就在 if($_POST['username']=="spy" && $_POST['pwd']=="1234"){ 这个判断里面再加一个判断啊,判断是不是spy,如果是,就跳转,如不是提示权限不足

8、vc登陆界面权限设计

先插入对抄话框资源,并为其新建好类
把对话框设成你想的样子,并在里面做好对用户登陆权限的判断(用户名、密码、以及拥有什么样的权限)
然后在整个工程的app类的InitInstance()函数里,在以下代码前面(假设整个工程名为Test,新添加的对话框类名是CLogoInDlg):
CTestDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();

添加以下语句:
CLogoInDlg dlg;
if(dlg.DoModal()==IDCANCEL) return false; //没通过验证时直接退出应用程序

这样启动时将先显示处登陆对话框

重要的是你要处理好权限的分配,可以设一些全局变量来判断,例如设一个BOOL型变量bViewList,并在登陆对话框类中根据用户登陆的方式(管理员,职员)设为true或false,然后在用户要打开工资表时先进行判断,如果bViewList为真,允许打开,否则不允许。不知道你的原工程工作流程,这里也说不清楚

9、网站开发,后台权限设计,高分求教,求具体数据库设计

你可以参考下rbac模式的角色权限管理方法

10、c#中如何设计登录界面账号的权限

一般都是在数据库里面配字段,比如数据库里卖弄有权限的这个字段,0代表管理员,1代表普通员工,在登陆后跳转的页面可以判断权限这个字段了,根据权限的范围在给它设置权限(可以理解能看到那些功能,看不到那些)等等,希望能帮助到你,望采纳!

与网站登陆权限设计相关的知识