13 messaggi dal 14 luglio 2016
Buongiorno a Tutti,

Ho necessità di abilitare e disabilitare controlli in funzione delle credenziali di accesso, per esempio se l'utente loggato non fa parte del gruppo Amministratori non può utilizzare determinati controlli ma può solamente leggerne il valore (Readonly).
Qualcuno a già affrontato questa problematica...?
Esistono delle librerie dedicate a questo scopo...?

Grazie in Anticipo
Modificato da Controls il 10 febbraio 2022 14:55 -
Ciao!
probabilmente non è la soluzione più robusta ma fa il suo dovere..
Con il metodo seguente puoi recuperare l'utente windows che ha lanciato l'applicazione

var user = Environment.GetEnvironmentVariable("USERNAME");


E puoi usare questo codice per fare un check su una tabella (o un file o dove ti è comodo in base all'applicazione) e recuperare dei dati, dove avrai l'elenco degli utenti autorizzati (con la possibilità di avere più cambi per utente, definendo più permessi o un ruolo)
Se non è presente nell'elenco all'ora l'utente può essere considerato un GUEST.

fammi sapere se ti è utile o cosa ne pensi.
Maurizio
13 messaggi dal 14 luglio 2016
Ciao Maury07,

non è proprio quello che mi servirebbe,
i gruppi e gli utenti non sono quelli del sistema operativo ma sono gruppi e utenti creati da me (per esempio nel file di configurazione dell'applicazione).
Una volta recuperato dal file di configurazione dell'applicazione il gruppo al quale appartiene l'utente loggato devo poter accedere ai controlli della View ed abilitarli o disabilitarli.

Cerco di postare delle immagini del software che utilizzo attualmente che però non ha nulla a che fare con WPF.
Ok quindi si tratta della logica della UI giusto?
Ma quindi è un applicazione in WPF o in quale framework?
13 messaggi dal 14 luglio 2016
Si esatto si tratta della logica della UI.
Questa che sto sviluppando è in WPF quella di esempio è un tool proprietario, non è un framework è un tool già preconfigurato che ti dà la possibilità di creare semplici interfacce utente tramite drag and drop di pulsanti textbox ecc.

Non si possono allegare immagini nel forum...?

Stavo pensando di utilizzare la Reflection per questo scopo.
Modificato da Controls il 10 febbraio 2022 17:39 -
in WPF puoi legare le proprietà dei controlli a delle proprietà della tua classe (ma la classe con le proprietà che vuoi legare ai controlli deve implementare l'interfaccia INotifyPropertyChanged)
Immagina di avere una classe USER tipo la seguente con relativo ROLE

 public class User
    {
        public string Name { get; set; }
        public UserRoleEnum Role { get; set; }

        public User()
        {
            Name = string.Empty;
            Role = UserRoleEnum.Guest;
        }
    }

  public enum UserRoleEnum
    {
        Guest = 0,
        Admin = 1
    }


poi per renderla semplice, immaginiamo di implementare nel main windows l'interfaccia INotifyPropertyChanged e di gestire sempre in questa classe l'utente corrente, creando 2 pulsanti per definire l'account locale (immaginiamo che recuperino il dato da un db)

public partial class MainWindow : Window, INotifyPropertyChanged
    {
        private void NotifyPropertyChanged(string info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;


        private User _currentUser { get; set; }
        public User CurrentUser {
            get {  return _currentUser; }
            set { _currentUser = value;
                NotifyPropertyChanged("CurrentUser");
            }  
        }

        public MainWindow()
        {
            InitializeComponent();
            CurrentUser = new User() { Name="GuestUser"};
        }

        private void LoadAdminButton(object sender, RoutedEventArgs e)
        {
            CurrentUser = new User() { Name = "AdminUser", Role = UserRoleEnum.Admin };
        }

        private void LoadGuestButton(object sender, RoutedEventArgs e)
        {
            CurrentUser = new User() { Name = "GuestUser", Role = UserRoleEnum.Guest };
        }       
    }


Ora nella UI prepariamo 2 pulsanti per richiamare le due funzioni e 2 etichette.
Una dovrà essere visibile SOLO quando l'utente corrente è ADMIN, l'altra sempre.

      
 <Button Grid.Column="1" Grid.Row="1" Content="Load Admin User" Click="LoadAdminButton" />
  <Button Grid.Column="1" Grid.Row="3" Content="Load Guest User" Click="LoadGuestButton" />

 <Label Grid.Column="3" Grid.Row="1" Content=" Only Admin Label" 
          DataContext="{Binding ElementName=myWindow}"
          Visibility="{Binding Path=CurrentUser.Role, Converter={converter:UserRoleToVisibilityConverter}}"/>

 <Label  Grid.Column="3" Grid.Row="3" Content=" Guest and Admin Label"  />


la visualizzazione condizionale viene otteunta nella label "Only Admin Label" impostando il datacontext (riferendolo alla mainwindow)
e la visibility si lega all'oggetto CurrentUser.Role. Il converter serve a convertire l'enum UserRole nella proprietà visibility e questo è implementato nella classe seguente

 public class UserRoleToVisibilityConverter : BaseValueConverter<UserRoleToVisibilityConverter>
 {
        public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {

            switch ((UserRoleEnum)value)
            {
                case UserRoleEnum.Guest:
                    return Visibility.Hidden;                    
                case UserRoleEnum.Admin:
                    return Visibility.Visible;                
                    default:
                    return Visibility.Hidden;               
            }         
        }

        public override object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

    }


A sua volta l'oggetto BaseConverter è una classe astratta che implementa le funzioni che servono al convertitore

 public abstract class BaseValueConverter<T> : MarkupExtension, IValueConverter
        where T : class, new()
    {
        private static T Converter = null;

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return Converter ?? (Converter = new T());
        }

        public abstract object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture);

        public abstract object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture);

    }


Perdona la spiegazione, è più complicato a vedersi che a farsi
fammi sapere se ti è d'aiuto.
Maurizio
Modificato da Maury07 il 11 febbraio 2022 16:20 -
13 messaggi dal 14 luglio 2016
Ciao Maury07,

Il tuo esempio è proprio la dritta che cercavo, appena riesco lo provo.

Per il momento ti ringrazio

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.