asp.net+sqlserver 가 실현 하 는 간단 하고 효율 적 인 권한 설계 예시
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 작성 자:주기 림
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
작업 중 문제 해결 - (win 2003 asp. net) Session 과 페이지 전송 방법 으로 해결 방안 을 정상적으로 사용 할 수 없습니다.또한 F 는 처음에 우리 의 BP & IT 프로젝트 팀 이 Forms 폼 검증 을 사용 했다 고 판단 할 수 있 습 니 다. 페이지 를 뛰 어 넘 는 것 은http://hr.bingjun.cc/MyTask/MyTas...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.