ورود

View Full Version : سوال: بهترین روش برای خواندن حق دسترسی؟



TeRMiNaT00o00R
شنبه 14 اسفند 1389, 10:05 صبح
با سلام
یک سوالی داشتم که نیاز به راهنمایی داشتم
یک سایتی هست که کاربران زیادی داره و در هنگام ورود هر کاربر حق دسترسی آن خونده میشه
به نظر شما بهتر این role کاربر در داخل سیشن ریخته بشه یا اینکه هر گاه نیاز بود از بانک اطلاعاتی خونده بشه ؟
و یا اینکه روش بهتری به ذهن شما میرسه ؟
ممنونم

ایمان مدائنی
شنبه 14 اسفند 1389, 10:36 صبح
دوست عزيز شما چند نقش تعريف كن رول نه براي خودت
بعد در بانك كاربران براي هر عضو نقش آن را تعيين كن
بعد هنگام ورود نقش آن كاربر را بخوان و در هرجا كه خواستي ذخيره كن
پيشنهاد من viewstate هست چون session انقضا داره

TeRMiNaT00o00R
شنبه 14 اسفند 1389, 10:51 صبح
مننونم از جوابت
نقش هایی من به شکلی هست مثلblogfa که میاد برای نویسندگانش حق دسترسی هایی تایین میکنه
چون به این شکل باشه دیگه به صورت Role مانند نمیشه چون باید حق دسترسی ها رو با لینک ها رو ذخیره کرد
و در مورد viewstate مربوط یه صفحه جاری میشه مثلآ با کلیک به رو لینک viewstate از بیین میره
میشه شما یکم ریز تر توضیح بدهید ؟

sam166
شنبه 14 اسفند 1389, 15:17 عصر
دوست عزیز شما میتونید Role هاتون رو تو بانک اطلاعاتی ذخیره کنید و
زمانی که کاربر وارد شد رول مورد نظر بهش اختصاص داده بشه(حالا تو سشن یا هرجایی که یه نظر خودت میرسه)

حالا مثلا کاربر میخواد به صفحه Test.aspx بره اول در لود صفحه سشن کاربر رو بخونه و رول رو بدست بیاره و (البته در این روش باید نام تمام صفحات و حق دسترسی آنها در دیتا بیس موجود باشد) بعد با دسترسی صفحه مطابقت بده اگر اجازه داشت صفحه رو ببینه و اگه اجازه نداشت به صفحه اول بره

TeRMiNaT00o00R
شنبه 14 اسفند 1389, 19:58 عصر
سلام
سوال من این نیست که چه طور این کارو میشه انجام داد
سوال من اینه که اگر کاربر ورد سایت شد و حق دسترسی اون داخل سیشن ریخته بشه بهتر یا اینکه هر گاه نیاز بود از table حق دسترسی رو بخونه و چک کنه؟
یا روشه بهتری که سراغ دارید؟

actros
شنبه 14 اسفند 1389, 20:13 عصر
اصولی ترین راحت ترین کار استفاده از WSAT :WebSite Administration Tools و MemberShip Database ئه.
یه رول نویسنده تعریف میکنی و صفحه مربوط به افزودن مطلب رو تو یه فولدر میگذاری.
حالا حق دسترسی اون فولدر رو میتونی به role و User های دلخواه بدی.
این طوری وقتی کاربری بخاد به اون صفحه دسترسی داشته باشه باید سطح دسترسی لازم رو داشته باشه.
تمامی مراحال کار به صورت Wizard ئه و نیازی به یه خط کد نویسی و درگیری با Session و ViewState نداره.
مایکروسافت WSAT رو دقیقا برای تسهیل در چنین مواردی گذاشته.

hobab-theme
یک شنبه 15 اسفند 1389, 04:08 صبح
ذخیره اطلاعات در Session سرعت کار رو بالاتر میبره ولی ذخیره اطلاعات(همون حق دسترسی ها رو میگم) امنیت رو بالاتر میبره. چون session رو میشه دستکاری کرد


هر گاه نیاز بود از table حق دسترسی رو بخونه

اگر بعضی مواقع نیاز بود (یعنی فقط تو بعضی از قسمتها از حق دسترسی استفاده میکنی، اطلاعات رو از بانکت بخون. و در غیر اینصورت اونارو تو جلسات ذخیره کن.

oossaa
یک شنبه 15 اسفند 1389, 10:38 صبح
بهترین کار استفاده از session هست اما باید مقداری که توش قرار می گره حتما encrypt شده باشه تا امنیتش تضمین بشه

komeil64
یک شنبه 15 اسفند 1389, 11:01 صبح
به نظر من بهترین راه استفاده از کلاس roleprovider هستش
اگر مایل بودید بگید کدشو بزارم البته توی سایت بگردید پیدا میشه
مکانیزمش به این صورته که شما یه کلاس داری که رول رو از فیلد رول تیبل یوزر چک می کنه موقع لاگین و توی وب کانفیگ هم مشخص کردی رول رو چک کرد به کدوم فولدر ها دسترسی داشته باشه هر رول

TeRMiNaT00o00R
یک شنبه 15 اسفند 1389, 12:24 عصر
سلام ممنون میشم اگه کد بزارید
و ممنونم از جوابهای دوستان شما در نظر بگیرید که یک سیستم وبلاگ دهی داریم و هر بلاگ میتواند دارایی چندین نویسنده باشد و هر نویسنده برای خودش نقشی دارد که در جداوای ذخیره شده مثل نقش ویرایش یا حذف کردن و ...
حالا در نظر بگیرید هر نویسنده بر خلاف وبلاگ ها میتواند در یک زمان وارد مدیریت چندین وبلاگ شود و متناسب با نقشی که در آن وبلاگ دارد کارهایی خود را انجام دهد
(به این شکل که دیگر نویسنده ها را مدیر ایجاد نمیکند بلکه نویسندگان کاربران ما هستند که با وبلاگ ها رابطه دارند)
در این سیستم برای مدیریت نقش ها چه راه حلی را پیشنهاد میدهید ؟
مثلا در نظر بگیرید user 1 در وبلاگ 1 نویسنده است و نقش ویرایش را دارد
وکاربر 2 هم در وبلاگ دیگری همین نقش را دارد و چکاری باید انجام شود که تداخلی صورت نگیرد؟

alonemm
یک شنبه 15 اسفند 1389, 13:06 عصر
با سلام:
من خودم برای چنین کاری یک کلاس برای چک کردن سطح دسترسی درست کردم که این کارو انجام میده و نوع رو برمیگردونه بعد توی روییداد مثل پیج لود این کلاس رو فراخوانی میکنم و بسته به نوع دسترسی یک سری کنترل ها رو مخفی یا غیر فعال میکنم.


موفق باشید.

komeil64
یک شنبه 15 اسفند 1389, 22:29 عصر
کلاس roleprovider:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Data.SqlClient;
using System.Configuration;


namespace WebApplication4.Classes
{
public class eShopRoleProvider : RoleProvider
{
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}

public override string ApplicationName
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}

public override void CreateRole(string roleName)
{
throw new NotImplementedException();
}

public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
throw new NotImplementedException();
}

public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
throw new NotImplementedException();
}

public override string[] GetAllRoles()
{
throw new NotImplementedException();
}

public override string[] GetRolesForUser(string username)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrin gs["books"].ToString());
string[] roles = new string[1];
try
{
con.Open();
string sql = "Select roll from tbl_user Where user_name = @user_name";
SqlCommand cmd = new SqlCommand(sql, con);
cmd.Parameters.Add(new SqlParameter("user_name", username));


SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
roles[0] = reader["roll"].ToString();
}

}
catch
{

}
finally
{
con.Close();
}
return roles;
}

public override string[] GetUsersInRole(string roleName)
{
throw new NotImplementedException();
}

public override bool IsUserInRole(string username, string roleName)
{
throw new NotImplementedException();
}

public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}

public override bool RoleExists(string roleName)
{
throw new NotImplementedException();
}
}
}


وب کانفیگ اصلی را به این صورت تغییر میدید:


<roleManager defaultProvider="eShopRoleProvider" enabled="true">
<providers>
<clear/>
<add name="eShopRoleProvider" type="WebApplication4.Classes.eShopRoleProvider"/>
</providers>
</roleManager>
<authentication mode="Forms">
<forms name="eShopLogin" loginUrl="~/login.aspx" timeout="30" slidingExpiration="true"/>
</authentication>


فرضا دو تافولدر داریم admin و users
وب کانفیگ ادمین:

<authorization>
<allow roles="Administrator"/>
<deny users="*"/>
</authorization>

و برای فولدر یوزر کلمه Administrator رو مساوی رولی میزارید که توی دیتابیس مشخص کردید برای یوزر ها

TeRMiNaT00o00R
سه شنبه 17 اسفند 1389, 11:55 صبح
سلام ممنونم از کدی که قرار دادین
همون طور که گفتم سیستم همانند سیستم وبلاگ دهی میباشد اما با این تفاوت که هر کاربرمیتواند چند وبلاگ داشته باشد
یعنی وقتی که وارد سایت شد لیست وبلاگ هایی خود را میتواند ببیند و وارد بخش مدیریت آن شود
اگر به این شکل باشد و از کد بالا استفاده شود در یک وبلاگ کاربر حق دسترسی حذف کردن به او داده شده و ببا این روش این دسترسی برای سایر وبلاگ ها هم میتواند استفاده کند
اگر امکانش هست راهنمایی نمایید؟

raziee
سه شنبه 17 اسفند 1389, 20:49 عصر
سلام ممنونم از کدی که قرار دادین
همون طور که گفتم سیستم همانند سیستم وبلاگ دهی میباشد اما با این تفاوت که هر کاربرمیتواند چند وبلاگ داشته باشد
یعنی وقتی که وارد سایت شد لیست وبلاگ هایی خود را میتواند ببیند و وارد بخش مدیریت آن شود
اگر به این شکل باشد و از کد بالا استفاده شود در یک وبلاگ کاربر حق دسترسی حذف کردن به او داده شده و ببا این روش این دسترسی برای سایر وبلاگ ها هم میتواند استفاده کند
اگر امکانش هست راهنمایی نمایید؟
ببینید شما باید یک جدول ایجاد کنید.
که در اون در اون حق دسارسی به بخش های مختلف رو داشته باشه. و تعیین کنه کاربر مورد نظر اجازه دسترسی و ویرایش رو داره و یا خیر.
و به نظر من ن استفاده از سشن مناشبه نه ویو استیت(که اصلا متوجه نمشم چرا؟؟؟؟).
این مجوز ها رو از دیتابسی بخونید و برای بالا بردن پرفرمنس هم اون ها رو کش کنید(تا از درخواست مکرر به دیتابیس جلوگیری بشه)

TeRMiNaT00o00R
سه شنبه 17 اسفند 1389, 22:36 عصر
ممنونم از جوابتون
اما باز هم من جوابی که میخواستمو نگرفتم
من تصمیم گرفتم از roleprovider برای حق دسترسی استفاده کنم
اما roleprovider او کاری که من میخوام برام انجام نمیده
چون کاری که من میخام انجام بدم یکم فرق داره . کلا شما در نظر بگیرید یک سیستم وبلاگ دهی رو . هر بلاگ میتواند دارایی چندین نویسنده باشد و هر نویسنده برای خودش نقشی دارد که در جداوای ذخیره شده مثل نقش مدیر و ویرایش یا حذف کردن و ...
حالا در نظر بگیرید هر نویسنده بر خلاف وبلاگ ها میتواند در یک زمان وارد مدیریت چندین وبلاگ شود و متناسب با نقشی که در آن وبلاگ دارد کارهایی خود را انجام دهد
مثلا در نظر بگیرید کاربر 1 وبلاگ شماره یک رو داره و در آن نقش مدیره و کاربر 2 وبلاگ شماره یک رو داره و در آن نقش ویرایشگر رو داره و همین کاربر شماره 2 یک وبلاگ دیگر به نام وبلاگ 2 رو داره که نقش مدیر را داره در اون وبلاگ
اگر من از roleprovider استفاده کنم کاربر شماره 2 که در وبلاگ 1 نقش ویرایشگرو داره میتونه به عنوان مدیر وارد شه چون در جدول رول ها نقش مدیر برایش در نظر گرفته شده اما نه برای وبلاگ 1 بلکه برای وبلاگ 2
میدونم که باید یه جدولی ایجاد بشه و یک رابطه ایی بین کاربر و وبلاک با Role آن ایجاد بشه اما من میخوام بدونم با roleprovider چطور پیاده شازی بشه ؟
کلآ در مورد پیاده سازی اگر راهنمایی کنید ممنون میشم .

raziee
سه شنبه 17 اسفند 1389, 22:58 عصر
من تصمیم گرفتم از roleprovider برای حق دسترسی استفاده کنم
اما roleprovider او کاری که من میخوام برام انجام نمیده
دوست من :

ببینید شما باید یک جدول ایجاد کنید.
که در اون در اون حق دسارسی به بخش های مختلف رو داشته باشه. و تعیین کنه کاربر مورد نظر اجازه دسترسی و ویرایش رو داره و یا خیر.


چون کاری که من میخام انجام بدم یکی فرق داره . کلا شما در نظر بگیرید یک سیستم وبلاگ دهی رو . هر بلاگ میتواند دارایی چندین نویسنده باشد و هر نویسنده برای خودش نقشی دارد که در جداوای ذخیره شده مثل نقش ویرایش یا حذف کردن و ...
حالا در نظر بگیرید هر نویسنده بر خلاف وبلاگ ها میتواند در یک زمان وارد مدیریت چندین وبلاگ شود و متناسب با نقشی که در آن وبلاگ دارد کارهایی خود را انجام دهد
مثلا در نظر بگیرید کاربر 1 وبلاگ شماره یک رو داره و در آن نقش مدیره و کاربر 2 وبلاگ شماره یک رو داره و در آن نقش ویرایشگر رو داره و همین کاربر شماره 2 یک وبلاگ دیگر به نام وبلاگ 2 رو داره که نقش مدیر را داره در اون وبلاگ
شما باید جدولی شبیه به یکی از جداول زیر طراحی کنید:
CREATE TABLE [dbo].[AuthorPermissions](
[BlogID] [int] NOT NULL,
[AuthorID] [int] NOT NULL,
[AllowAddPost] [bit] NULL,
[AllowDeletePost] [bit] NULL,
CONSTRAINT [PK_AuthorPermissions] PRIMARY KEY CLUSTERED
(
[BlogID] ASC,
[AuthorID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
در این جدول تعداد سطوح دسترسی رو باید مشخص کنید(به عنوان یک فیلد).
در این جدول هر نویسنده در یک بلاگ تنها میتواند یک رکورد داشته باشد(به کلید ترکیبی توجه کنید)
CREATE TABLE [dbo].[AuthorPermissions](
[PermissionID] [int] IDENTITY(1,1) NOT NULL,
[BlogID] [int] NOT NULL,
[AuthorID] [int] NOT NULL,
[AccessType] [int] NOT NULL,
[AllowAccess] [bit] NOT NULL,
CONSTRAINT [PK_AuthorPermissions] PRIMARY KEY CLUSTERED
(
[PermissionID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
در این نوع پیاده سازی شما محدود نیستید که چند نوع حق دسترسی دارید.
این انوع حق دسترسی ها میتونه افزایش پیدا کنه(مثل : اضافه کردن پست،ویرایش پست،ویرایش قالب و ....) (فیلد AccessType)
اینکه کاربر مجوز رو داره یا نه رو در فیلد AllowAccess بررسی میکنید.
در این جدول هر نویسنده در یک بلاگ میتوه چند رکورد داشته باشه.
اگر بخواهید کلید ترکیبی تعریف کنید باید »» BlogID و AuthorID و AccessType رو در نظر بگیرید.


دوست من به پاسخ هایی که دیگران به پرسش شما میدند بیشتر دقت کن.

mmnoody2006
سه شنبه 17 اسفند 1389, 23:19 عصر
سلام

برادر شما حق دسترسی کاربر رو در جدول ذخیره کن هنگام لود صفحه بررسی کن ببین حق داره یا نه :قلب:

TeRMiNaT00o00R
دوشنبه 23 اسفند 1389, 12:02 عصر
سلام
اگر من در پروژه خود دو جدول داشته باشم برای حق دسترسی مثلا یکی برای وبلاگ و یکی برای حق دسترسی دوستان و اگر بخام از RoleProvaider استفاده کنم به چه شکل میشه ؟

ricky22
سه شنبه 02 فروردین 1390, 13:40 عصر
به نظر من فقط استفاده از netqlazman .
http://netsqlazman.codeplex.com

komeil64
جمعه 05 فروردین 1390, 02:23 صبح
لازم نیست دو تا جدول داشته باشین که
شما یه جدول دارین حق دسترسی ها رو مشخص می کنین فلان یوزر حق دسترسی وبلاگ فلان یوزر حق دسترسی دوستان