IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration SQL Server Discussion :

Quels droits accorder ? Comment ? [2017]


Sujet :

Administration SQL Server

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut Quels droits accorder ? Comment ?
    Bonjour,

    Je travaille sur un site extranet.
    J'ai des utilisateurs "internes" (salariés de l'entreprise) et des utilisateurs "externes" (clients, fournisseurs, partenaires).

    J'ai décidé de faire en sorte que l'application web se connecte à la base de données avec un compte dédié à chaque utilisateur.

    Un utilisateur "interne" peut créer un compte pour un autre utilisateur (interne ou externe).
    Un niveau de droit plus fin sera mis en place dans l'application elle-même, au niveau base de données on va partir du principe que c'est suffisant pour le moment (puisqu'on les utilisateurs créés ne peuvent qu'exécuter des procédures stockées qui gèrent ces droits, sans accéder directement aux tables)

    J'ai donc créé deux rôles "interne" et "externe", ainsi qu'une procédure stockée "createPerson", que les utilisateurs peuvent lancer.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    use mabase;
    go
     
    CREATE ROLE interne;
    GRANT EXECUTE TO interne;
    GRANT ALTER ANY USER TO interne;
    --EXEC sp_addrolemember 'securityadmin', interne; // La je suis embêté, je ne sais pas comment autoriser le rôle "INTERNE" de ma base à créer des logins sur le serveur...
    GO
     
    CREATE ROLE externe;
    GRANT EXECUTE TO externe;
    GO
     
    create procedure dbo.CreatePerson
    (
        @person_id int output,
    	@person_email varchar(256),
        @person_name varchar(50),
    	@person_internal bit,
    	@user_name nvarchar(128),
        @user_password varchar(50)
    )
    as
    begin
    	declare @user_uid smallint;
     
    	execute('CREATE LOGIN mydb_' + @user_name + ' WITH PASSWORD = ''' + @user_password + '''');
    	execute('CREATE USER ' + @user_name + ' FOR LOGIN mydb_' + @user_name + ' WITH DEFAULT_SCHEMA = dbo');
     
    	select @user_uid = u.[uid]
    	from sys.sysusers u
    	where u.[name] = @user_name and u.islogin = 1;
     
    	if (@person_internal = 1)
    	begin
    		exec sp_addrolemember 'interne', @user_name;
    	end
    	else
    	begin
    		exec sp_addrolemember 'externe', @user_name;
    	end;
     
        insert into dbo.person (email, [name], user_uid)
        values (@person_email, @person_name, @user_uid);
    end;
    go

    Comme en témoigne la ligne en commentaire sur la création du rôle "INTERNE", je ne sais pas comment faire pour octroyer le droit de créer des logins sur le serveur à mon rôle de base de données.

    Une suggestion ?
    On ne jouit bien que de ce qu’on partage.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Tu ne peut le faire qu'au niveau du compte de connexion, pas au niveau de l'utilisateur SQL.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Bonjour Frédéric et merci pour ta réponse.

    Désolé, la mienne est un peu tardive.


    J'ai donc tenté de modifier mon script de façon à déclarer login par login la possibilité de créer des logins.

    Cependant, il doit toujours me manquer un truc, car lorsque je crée un compte avec ma procédure stockée en utilisant un compte sysadmin/db_owner, aucun souci, mais si je l'exécute avec un compte créé par la procédure elle-même, j'obtiens un message d'erreur lors de la tentative de rattachement au rôle "interne" ou "externe".

    Voici mon code :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    CREATE ROLE interne;
    GRANT EXECUTE TO interne;
    GRANT ALTER ANY USER TO interne with grant option;
    GO
     
    CREATE ROLE externe;
    GRANT EXECUTE TO externe;
    GO
     
    create procedure dbo.CreatePerson
    (
        @person_id int output,
    	@person_email varchar(256),
        @person_name varchar(50),
    	@person_internal bit,
    	@user_name nvarchar(128),
        @user_password varchar(50)
    )
    as
    begin
    	declare @user_uid smallint;
     
    	execute('CREATE LOGIN mydb_' + @user_name + ' WITH PASSWORD = ''' + @user_password + '''');
    	execute('CREATE USER ' + @user_name + ' FOR LOGIN mydb_' + @user_name + ' WITH DEFAULT_SCHEMA = dbo');
     
    	select @user_uid = u.[uid]
    	from sys.sysusers u
    	where u.[name] = @user_name and u.islogin = 1;
     
    	if (@person_internal = 1)
    	begin
    		execute('ALTER ROLE interne ADD MEMBER ' + @user_name);
    		execute('use master;grant alter any login to mydb_' + @user_name + ' with grant option');
    	end
    	else
    	begin
    		execute('ALTER ROLE externe ADD MEMBER ' + @user_name);
    	end;
     
        insert into dbo.person (email, [name], user_uid)
        values (@person_email, @person_name, @user_uid);
    end;
    go

    Ensuite, si je me connecte à la base avec par exemple mon compte Windows (membre du groupe administrateur Windows local, sysadmin et db_owner) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    declare @void int;
     
    exec dbo.CreatePerson @void, 'test1@email.com', 'Test 1', 1, 'test1', 'pwd';
    Tout va bien : le login "mydb_test1" est créé sur le serveur, le user "test1" est créé dans la base, et je peux me connecter avec le compte.

    Ensuite, si je me connecte à la base avec le compte "test1", créé ci-dessus :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    declare @void int;
     
    exec dbo.CreatePerson @void, 'test2@email.com', 'Test 2', 1, 'test2', 'pwd';

    Tout va presque bien : j'ai ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Msg*15151, Niveau*16, État*1, Ligne*1
    Impossible de modifier le rôle 'interne', car il n'existe pas ou vous ne possédez pas d'autorisation.
     
    (1*ligne(s) affectée(s))
    Et évidement, le user "test2" n'est pas membre du rôle "interne".

    Du coup je peux me connecter à la base avec mais il n'a aucun droit
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    J'ai fini par m'en sortir en ajoutant ce droit au rôle "interne" :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GRANT ALTER ANY ROLE TO interne with grant option;
    On ne jouit bien que de ce qu’on partage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/06/2007, 14h56
  2. [ecrire un livre] quel droit?
    Par valal dans le forum Juridique
    Réponses: 6
    Dernier message: 28/06/2006, 10h15
  3. [DBA]Quels droits pour sys.link$
    Par zorglob dans le forum Oracle
    Réponses: 4
    Dernier message: 17/02/2006, 16h01
  4. [débutant][Listener] quel listener et comment l'utiliser
    Par pingoui dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 12/02/2006, 22h54
  5. quels droits ?
    Par Shabata dans le forum InterBase
    Réponses: 5
    Dernier message: 16/02/2004, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo