asp.net+sqlserver 가 실현 하 는 간단 하고 효율 적 인 권한 설계 예시

대부분의 시스템 은 권한 시스템 이 있다.일반적으로,그것 은 어떤 페이지 에 대한 접근 을 통제 할 수 있다.일부 필드,컨트롤 이 보이 거나 보이 지 않 습 니 다.gridview 의 데 이 터 를 삭제 할 수 있 는 지,추가 할 수 있 는 지,추가 할 수 있 는 지 등등.대부분의 사람들 은 권한 을 하위 시스템 으로 독립 시킨다.그러나 여기 서 저 는 권한 관리 시스템 을 설계 하고 싶 은 것 이 아니 라 인터넷 의 디자인 방안 이 너무 많아 서 모든 개발 자 들 이 자신의 개발 권한 관리 시스템 에 대한 생각 과 방향 을 가지 고 있다 고 할 수 있 습 니 다.이 글 에서 저 는 먼저 간단 한 C\#코드 로 사용자 의 권한 을 모방 한 다음 에 sql 로 시 뮬 레이 션 을 합 니 다.이것 은 매우 간단 하고 직관 적 이 며 효율 적 인 방식 으로 사용자 의 권한 을 판단 하 는 것 이다.C\#:그래,가장 간단 한 것 부터 사용자(User)클래스 를 정의 하 자.다음 과 같다.
 
class User
{
bool CanDelete;
bool CanRead;
bool CanWrite;
bool CanModify;
bool CanCreate;
}
사용자 의 권한 을 통제 하기 위해 5 개의 속성 을 설계 합 니 다.나 는 이렇게 하 는 것 이 비록 매우 직관 적 이지 만 확장 하 는 것 은 좋 지 않다 는 것 을 발견 했다.우 리 는 권한 을 독립 시 켜 다음 코드 를 보 았 다.
 
enum PermissionTypes : int
{
None = 0,
Read = 1,
Write = 2,
Modify = 4,
Delete = 8,
Create = 16,
All = Read | Write | Modify | Delete | Create
}
class User
{
public PermissionTypes Permissions = PermissionTypes.None;
}
우리 가 먼저 사용 해 보면 신기 한 점 을 느 낄 수 있다.
 
//
User admin = new User();
admin.Permissions = PermissionTypes.Read
| PermissionTypes.Write
| PermissionTypes.Delete;
//
bool canRead = ((PermissionTypes.Read & admin.Permissions) == PermissionTypes.Read);
bool canWrite = ((PermissionTypes.Write & admin.Permissions) == PermissionTypes.Write);
bool canCreate = ((PermissionTypes.Create & admin.Permissions) == PermissionTypes.Create);
//
Console.WriteLine(canRead); //true
Console.WriteLine(canWrite); //true
Console.WriteLine(canCreate); //false
'|'과'&'두 가지 조작 을 이용 했다.그러나 이렇게 보면 매우 꼬 집 지 않 고 권한 초기 화 와 검증 권한 은 긴 문자열'|'과'&'연산 코드 를 사용 한 것 처럼 보인다.직관 적 이지 않다.System.Enum 에서 호출 할 수 있 는 방법 을 확장 하 겠 습 니 다.코드 는 다음 과 같 습 니 다.
 
//
public static bool Has<T>(this System.Enum type, T value)
{
try
{
return (((int)(object)type & (int)(object)value) == (int)(object)value);
}
catch
{
return false;
}
}
//
public static bool Is<T>(this System.Enum type, T value)
{
try
{
return (int)(object)type == (int)(object)value;
}
catch
{
return false;
}
}
//
public static T Add<T>(this System.Enum type, T value)
{
try
{
return (T)(object)(((int)(object)type | (int)(object)value));
}
catch (Exception ex)
{
throw new ArgumentException(
string.Format(
" '{0}'",
typeof(T).Name
), ex);
}
}
//
public static T Remove<T>(this System.Enum type, T value)
{
try
{
return (T)(object)(((int)(object)type & ~(int)(object)value));
}
catch (Exception ex)
{
throw new ArgumentException(
string.Format(
" '{0}'",
typeof(T).Name
), ex);
}
}
사용 해 보 세 요.
 
//
User admin = new User();
PermissionTypes permissions = new PermissionTypes();
admin.Permissions = permissions;
//
admin.Permissions = admin.Permissions.Add(PermissionTypes.Create);
admin.Permissions = admin.Permissions.Add(PermissionTypes.Read);
admin.Permissions = admin.Permissions.Add(PermissionTypes.Write);
//
bool canRead = admin.Permissions.Has(PermissionTypes.Read); //true
bool canWrite = admin.Permissions.Has(PermissionTypes.Write); //true
bool canDelete = admin.Permissions.Has(PermissionTypes.Delete); //false
bool canCreate = admin.Permissions.Has(PermissionTypes.Create); //true
Console.WriteLine(canRead); //true
Console.WriteLine(canWrite); //true
Console.WriteLine(canDelete); //false
Console.WriteLine(canCreate); //true
Console.Read();
SQL:대부분의 권한 관 리 는 데이터 베 이 스 를 조작 하 는 것 입 니 다.위의 생각 에 따라 저 는 sqlserver 에서 이상 의 조작 을 모 의 했 습 니 다.sql 에서 또는 연산 이 효율 적 입 니 다.먼저 표 두 장과 User 와 Permission 을 설계 합 니 다.

 
1.Read 권한 이 있 는 모든 사용자 가 져 오기:
 select * from [User] where PermissionTypes&1 =1 
Result:2.Delete 권한 이 있 는 모든 사용자 가 져 오기:
select * from [User] where PermissionTypes&8 =8
Result:3.기린 이 Delete 권한 이 있 는 지 판단 하기
 
if exists (select * from [User] where Name='qilin' and PermissionTypes&8 =8)
print 'true'
else
print 'flase'
Result:flase 작성 자:주기 림

좋은 웹페이지 즐겨찾기