Felhasználó utánzatok

ASP.NET-es fejlesztés közben gyakran előfordul, hogy egy olyan funkciót kell megvalósítanunk, amely felhasználói fiókhoz vagy szerepkörhöz kötött, de még nincs kész a projektünkben a regisztráció vagy a bejelentkezés oldal.Ilyenkor az egyik lehetőség a felhasználói adatbázis gyors összekattintgatása, de ha ezt nem tehetjük meg, akkor nincs más megoldás, mint saját Membership- és Role providerek készítése, amelyek ugyanúgy bejelentkeztetik a felhasználót, de nem igényelnek adatbázist. Ez egyszerűbb, mint azt első hallásra gondolnánk.

Ha már megvan az ASP.NET alkalmazásunk, az App_Code mappában hozzunk létre egy új osztályt, amely a dummy felhasználóinkat, azaz felhasználó utánzatainkat fogja kezelni. Ezt a DummyMembershipProvider osztályt a MembershipProvider ősosztályból kell származtatnunk. Mivel ez abstract ősosztály, a Studio rögtön fel fogja kínálni az összes felülírandó metódust, melyből a bejelentkezés működéséhez legalább a ValidateUsert implementálnunk kell, például így:

    public class DummyMembershipProvider : MembershipProvider
    {
        private Dictionary<string, string> _users = null;

        internal static string AdminUserName = "admin".ToLowerInvariant();
        internal static string MemberUserName = "user".ToLowerInvariant();

        public override void Initialize( string name, 
                                         NameValueCollection config )
        {
            this._users = new Dictionary<string, string>();
            this._users.Add( AdminUserName, AdminUserName );
            this._users.Add( MemberUserName, MemberUserName );

            base.Initialize( name, config );
        }

        public override bool ValidateUser( string username, string password )
        {
            if( this._users.ContainsKey( username.ToLowerInvariant() ) )
            {
                return password.Equals( this._users[ username ], 
                                        StringComparison.OrdinalIgnoreCase );
            }
            return false;
        }

        // Itt még sok metódus van, amely NotImplementedExceptiont dob...
    }

A fenti példa tartalmaz egy admin és egy user felhasználót, a jelszava mindkettőnek megegyezik a felhasználónevével.

Ahhoz, hogy mindez működjön, még át kell kapcsolnunk az ASP.NET-et erre a providerre a web.configban:

    <authentication mode="Forms"/>
    <membership defaultProvider="DummyMembershipProvider">
        <providers>
            <add name="DummyMembershipProvider" type="DummyMembershipProvider"/>
        </providers>
    </membership>

Ezzel már be is tudunk jelentkezni a két felhasználónkkal. Ha még szerepkörök is kellenek, akkor egy DummyRoleProvidert kell származtatnunk az abstract RoleProvider ősosztályból, amelyből legalább az IsUserInRole metódusra szükségünk lesz:

    public class DummyRoleProvider : RoleProvider
    {
        internal static string AdminRoleName = "admins";
        internal static string MemberRoleName = "members";

        public override bool IsUserInRole( string username, string roleName )
        {
            string[] roles = this.GetRolesForUser( username );
            return roles.Contains( roleName );
        }

        public override string[] GetRolesForUser( string username )
        {
            if( username.Equals( DummyMembershipProvider.AdminUserName,                                  StringComparison.OrdinalIgnoreCase ) )
            {
                return new string[] { DummyRoleProvider.AdminRoleName };
            }
            else if( username.Equals( DummyMembershipProvider.MemberUserName,                                       StringComparison.OrdinalIgnoreCase ) )
            {
                return new string[] { DummyRoleProvider.MemberRoleName };
            }
            else
            {
                return new string[ 0 ];
            }
        }

        // ...
    }

Persze ez sem működik egy kis konfigurálgatás nélkül, de szerencsére csak ennyi kell a web.configba:

    <roleManager enabled="true" defaultProvider="DummyRoleProvider">
        <providers>
            <add name="DummyRoleProvider" type="DummyRoleProvider"/>
        </providers>
    </roleManager>

A fenti két osztály és a hozzá tartozó konfigurációs XML egyébként rettenetesen könnyen kopipésztelhető egyik projektből a másikba és tada, máris van jogosultság-szabályozás a projektben.

A cikkhez tartozó mellékletben a két osztály teljes forráskódja megtalálható.

 

One thought on “Felhasználó utánzatok

  1. Gergő

    Királyság. Én eddig a Mads Kristensen-féle XmlMembershipProvider-t használtam ilyen tesztcélra, de ez még lightweightebb (de szép szó is ez). Ráadásul kevésbé bugos.🙂

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s