Prechádzať zdrojové kódy

NEW Gestion des accès: contrôle des autorisation à chaque requete

olivier.massot 7 rokov pred
rodič
commit
5d2e777ff4

+ 2 - 2
CD67.FicheCollege.Entity/EntityModel.edmx

@@ -242,7 +242,7 @@
           <Key>
             <PropertyRef Name="Id" />
           </Key>
-          <Property Name="Id" Type="int" Nullable="false" />
+          <Property Name="Id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
           <Property Name="Sid" Type="nvarchar" MaxLength="64" Nullable="false" />
           <Property Name="GroupeId" Type="int" Nullable="false" />
         </EntityType>
@@ -1163,7 +1163,7 @@
           <Key>
             <PropertyRef Name="Id" />
           </Key>
-          <Property Name="Id" Type="Int32" Nullable="false" />
+          <Property Name="Id" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
           <Property Name="Sid" Type="String" Nullable="false" MaxLength="64" FixedLength="false" Unicode="true" />
           <Property Name="GroupeId" Type="Int32" Nullable="false" />
           <NavigationProperty Name="Groupe" Relationship="CD67.FicheCollege.FK_GroupeUtilisateur" FromRole="Utilisateur" ToRole="Groupe" />

+ 2 - 0
CD67.FicheCollege.MVC/CD67.FicheCollege.MVC.csproj

@@ -202,6 +202,7 @@
     <Compile Include="Global.asax.cs">
       <DependentUpon>Global.asax</DependentUpon>
     </Compile>
+    <Compile Include="Internal\Acces.cs" />
     <Compile Include="Internal\Referentiel.cs" />
     <Compile Include="Internal\FlashMessageExtensions.cs" />
     <Compile Include="Internal\MvcHtmlHelpers.cs" />
@@ -511,6 +512,7 @@
     <Content Include="Views\Groupes\Details.cshtml" />
     <Content Include="Views\Groupes\Index.cshtml" />
     <Content Include="Views\Utilisateurs\Create.cshtml" />
+    <Content Include="Views\Home\Unauthorized.cshtml" />
   </ItemGroup>
   <ItemGroup>
     <Folder Include="App_Data\" />

+ 2 - 0
CD67.FicheCollege.MVC/Controllers/ActionEduAxesController.cs

@@ -1,11 +1,13 @@
 using CD67.FicheCollege.Entity;
 using CD67.FicheCollege.Factory;
 using CD67.FicheCollege.MVC.Models;
+using CD67.PIMP.MVC.Internal;
 using System.Net;
 using System.Web.Mvc;
 
 namespace CD67.FicheCollege.MVC.Controllers
 {
+    [Acces(groupes = "AdminActionsEdu")]
     public class ActionEduAxesController : Controller
     {
         private Entities db = new Entities();

+ 2 - 0
CD67.FicheCollege.MVC/Controllers/ActionEduThematiquesController.cs

@@ -1,11 +1,13 @@
 using CD67.FicheCollege.Entity;
 using CD67.FicheCollege.Factory;
 using CD67.FicheCollege.MVC.Models;
+using CD67.PIMP.MVC.Internal;
 using System.Net;
 using System.Web.Mvc;
 
 namespace CD67.FicheCollege.MVC.Controllers
 {
+    [Acces(groupes = "AdminActionsEdu")]
     public class ActionEduThematiquesController : Controller
     {
         private Entities db = new Entities();

+ 2 - 0
CD67.FicheCollege.MVC/Controllers/ActionsEduActeursController.cs

@@ -1,6 +1,7 @@
 using CD67.FicheCollege.Entity;
 using CD67.FicheCollege.Factory;
 using CD67.FicheCollege.MVC.Models;
+using CD67.PIMP.MVC.Internal;
 using System.Collections.Generic;
 using System.Linq;
 using System.Net;
@@ -9,6 +10,7 @@ using System.Web.Mvc;
 
 namespace CD67.FicheCollege.MVC.Controllers
 {
+    [Acces(groupes = "AdminActionsEdu")]
     public class ActionsEduActeursController : Controller
     {
         private Entities db = new Entities();

+ 2 - 14
CD67.FicheCollege.MVC/Controllers/ActionsEduCollegeController.cs

@@ -1,6 +1,7 @@
 using CD67.FicheCollege.Entity;
 using CD67.FicheCollege.Factory;
 using CD67.FicheCollege.MVC.Models;
+using CD67.PIMP.MVC.Internal;
 using System.Collections.Generic;
 using System.Linq;
 using System.Net;
@@ -9,24 +10,11 @@ using System.Web.Mvc;
 
 namespace CD67.FicheCollege.MVC.Controllers
 {
+    [Acces(groupes = "AdminActionsEdu")]
     public class ActionsEduCollegeController : Controller
     {
         private Entities db = new Entities();
 
-        // GET: ActionsEdu
-        public ActionResult Index(int? annee_id)
-        {
-            if (annee_id == null)
-            {
-                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
-            }
-
-            AnneeFactory fact = new AnneeFactory(db);
-            Annee annee = fact.getById(annee_id);
-            AnneeViewModel model = new AnneeViewModel(annee, db);
-            return View(model);
-        }
-
         // GET: ActionsEdu/Details/5
         public ActionResult Details(int? id)
         {

+ 9 - 1
CD67.FicheCollege.MVC/Controllers/ActionsEduController.cs

@@ -1,6 +1,7 @@
 using CD67.FicheCollege.Entity;
 using CD67.FicheCollege.Factory;
 using CD67.FicheCollege.MVC.Models;
+using CD67.PIMP.MVC.Internal;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -47,6 +48,7 @@ namespace CD67.FicheCollege.MVC.Controllers
 
 
         // GET: ActionEduAxe/Create
+        [Acces(groupes = "AdminActionsEdu")]
         public ActionResult Create(int? annee_id)
         {
             if (annee_id == null)
@@ -68,6 +70,7 @@ namespace CD67.FicheCollege.MVC.Controllers
         // Afin de déjouer les attaques par sur-validation, activez les propriétés spécifiques que vous voulez lier. Pour 
         // plus de détails, voir  http://go.microsoft.com/fwlink/?LinkId=317598.
         [HttpPost]
+        [Acces(groupes = "AdminActionsEdu")]
         [ValidateAntiForgeryToken]
         public ActionResult Create(ActionEdu actionEdu)
         {
@@ -82,6 +85,7 @@ namespace CD67.FicheCollege.MVC.Controllers
         }
 
         // GET: ActionEduAxe/Edit/5
+        [Acces(groupes = "AdminActionsEdu")]
         public ActionResult Edit(int? id)
         {
             if (id == null)
@@ -102,6 +106,7 @@ namespace CD67.FicheCollege.MVC.Controllers
         // Afin de déjouer les attaques par sur-validation, activez les propriétés spécifiques que vous voulez lier. Pour 
         // plus de détails, voir  http://go.microsoft.com/fwlink/?LinkId=317598.
         [HttpPost]
+        [Acces(groupes = "AdminActionsEdu")]
         [ValidateAntiForgeryToken]
         public ActionResult Edit(ActionEdu actionEdu)
         {
@@ -121,6 +126,7 @@ namespace CD67.FicheCollege.MVC.Controllers
         }
 
         // GET: ActionEduAxe/Delete/5
+        [Acces(groupes = "AdminActionsEdu")]
         public ActionResult Delete(int? id)
         {
             if (id == null)
@@ -139,6 +145,7 @@ namespace CD67.FicheCollege.MVC.Controllers
 
         // POST: ActionEduAxe/Delete/5
         [HttpPost, ActionName("Delete")]
+        [Acces(groupes = "AdminActionsEdu")]
         [ValidateAntiForgeryToken]
         public ActionResult DeleteConfirmed(int id)
         {
@@ -168,7 +175,7 @@ namespace CD67.FicheCollege.MVC.Controllers
             return non_importees;
         }
 
-        // GET: Colleges
+        [Acces(groupes = "AdminActionsEdu")]
         public ActionResult Import(int? annee_id)
         {
             if (annee_id == null)
@@ -199,6 +206,7 @@ namespace CD67.FicheCollege.MVC.Controllers
         }
 
         [HttpPost]
+        [Acces(groupes = "AdminActionsEdu")]
         [ValidateAntiForgeryToken]
         public ActionResult Import(int Annee_Id, List<int> actionsEdu_ids, List<bool> selection)
         {

+ 9 - 0
CD67.FicheCollege.MVC/Controllers/CollegesController.cs

@@ -6,6 +6,7 @@ using CD67.FicheCollege.MVC.Models;
 using System.Linq;
 using System.Collections.Generic;
 using System;
+using CD67.PIMP.MVC.Internal;
 
 namespace CD67.FicheCollege.MVC.Controllers
 {
@@ -103,6 +104,7 @@ namespace CD67.FicheCollege.MVC.Controllers
         }
 
         // GET: Colleges/Create
+        [Acces(groupes = "AdminColleges")]
         public ActionResult Create(int? annee_id)
         {
             if (annee_id == null)
@@ -126,6 +128,7 @@ namespace CD67.FicheCollege.MVC.Controllers
         // Afin de déjouer les attaques par sur-validation, activez les propriétés spécifiques que vous voulez lier. Pour 
         // plus de détails, voir  http://go.microsoft.com/fwlink/?LinkId=317598.
         [HttpPost]
+        [Acces(groupes = "AdminColleges")]
         [ValidateAntiForgeryToken]
         public ActionResult Create(Entity.College college)
         {
@@ -143,6 +146,7 @@ namespace CD67.FicheCollege.MVC.Controllers
         }
 
         // GET: Colleges/Edit/5
+        [Acces(groupes = "AdminColleges")]
         public ActionResult Edit(int? id)
         {
             CollegeFactory collegeFactory = new CollegeFactory(db);
@@ -161,6 +165,7 @@ namespace CD67.FicheCollege.MVC.Controllers
         // Afin de déjouer les attaques par sur-validation, activez les propriétés spécifiques que vous voulez lier. Pour 
         // plus de détails, voir  http://go.microsoft.com/fwlink/?LinkId=317598.
         [HttpPost]
+        [Acces(groupes = "AdminColleges")]
         [ValidateAntiForgeryToken]
         public ActionResult Edit(Entity.College college)
         {
@@ -217,6 +222,7 @@ namespace CD67.FicheCollege.MVC.Controllers
 
 
         // GET: College/Delete/5
+        [Acces(groupes = "AdminColleges")]
         public ActionResult Delete(int? id)
         {
             if (id == null)
@@ -237,6 +243,7 @@ namespace CD67.FicheCollege.MVC.Controllers
 
         // POST: College/Delete/5
         [HttpPost, ActionName("Delete")]
+        [Acces(groupes = "AdminColleges")]
         [ValidateAntiForgeryToken]
         public ActionResult DeleteConfirmed(int? id)
         {
@@ -270,6 +277,7 @@ namespace CD67.FicheCollege.MVC.Controllers
         }
 
         // GET: Colleges
+        [Acces(groupes = "AdminColleges")]
         public ActionResult Import(int? annee_id)
         {
             if (annee_id == null)
@@ -285,6 +293,7 @@ namespace CD67.FicheCollege.MVC.Controllers
         }
 
         [HttpPost]
+        [Acces(groupes = "AdminColleges")]
         [ValidateAntiForgeryToken]
         public ActionResult Import(int Annee_Id, List<int> colleges_ids, List<bool> selection)
         {

+ 2 - 0
CD67.FicheCollege.MVC/Controllers/GroupesController.cs

@@ -1,11 +1,13 @@
 using CD67.FicheCollege.Entity;
 using CD67.FicheCollege.Factory;
 using CD67.FicheCollege.MVC.Models;
+using CD67.PIMP.MVC.Internal;
 using System.Net;
 using System.Web.Mvc;
 
 namespace CD67.FicheCollege.MVC.Controllers
 {
+    [Acces(groupes = "Admin")]
     public class GroupesController : Controller
     {
         private Entities db = new Entities();

+ 5 - 0
CD67.FicheCollege.MVC/Controllers/HomeController.cs

@@ -27,5 +27,10 @@ namespace CD67.FicheCollege.MVC.Controllers
             
             return RedirectToAction("Details", "Annees", new { id = annee_id });
         }
+
+        public ActionResult Unauthorized()
+        {
+            return View();
+        }
     }
 }

+ 2 - 0
CD67.FicheCollege.MVC/Controllers/TerritoireController.cs

@@ -3,9 +3,11 @@ using System.Web.Mvc;
 using CD67.FicheCollege.Entity;
 using CD67.FicheCollege.Factory;
 using CD67.FicheCollege.MVC.Models;
+using CD67.PIMP.MVC.Internal;
 
 namespace CD67.FicheCollege.MVC.Controllers
 {
+    [Acces(groupes = "AdminColleges")]
     public class TerritoireController : Controller
     {
         private Entities db = new Entities();

+ 2 - 0
CD67.FicheCollege.MVC/Controllers/TypeCollegeController.cs

@@ -9,9 +9,11 @@ using System.Web.Mvc;
 using CD67.FicheCollege.Entity;
 using CD67.FicheCollege.Factory;
 using CD67.FicheCollege.MVC.Models;
+using CD67.PIMP.MVC.Internal;
 
 namespace CD67.FicheCollege.MVC.Controllers
 {
+    [Acces(groupes = "AdminColleges")]
     public class TypeCollegeController : Controller
     {
         private Entities db = new Entities();

+ 3 - 0
CD67.FicheCollege.MVC/Controllers/UtilisateursController.cs

@@ -1,11 +1,13 @@
 using CD67.FicheCollege.Entity;
 using CD67.FicheCollege.Factory;
 using CD67.FicheCollege.MVC.Models;
+using CD67.PIMP.MVC.Internal;
 using System.Net;
 using System.Web.Mvc;
 
 namespace CD67.FicheCollege.MVC.Controllers
 {
+    [Acces(groupes = "Admin")]
     public class UtilisateursController : Controller
     {
         private Entities db = new Entities();
@@ -19,6 +21,7 @@ namespace CD67.FicheCollege.MVC.Controllers
             }
             Utilisateur utilisateur = new Utilisateur();
             utilisateur.GroupeId = groupe_id.Value;
+
             GroupeFactory fact = new GroupeFactory(db);
             utilisateur.Groupe = fact.getById(groupe_id);
 

+ 57 - 0
CD67.FicheCollege.MVC/Internal/Acces.cs

@@ -0,0 +1,57 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Web.Mvc;
+using System;
+using System.IO;
+using CD67.FicheCollege.Entity;
+using CD67.FicheCollege.MVC.Models;
+using System.Web;
+using CD67.FicheCollege.MVC.Internal;
+
+namespace CD67.PIMP.MVC.Internal
+{
+    public class Acces : ActionFilterAttribute
+    {
+        private Entities db = new Entities();
+        public string groupes { get; set; }
+
+        public override void OnActionExecuting(ActionExecutingContext filterContext)
+        {
+            UtilisateurConnecte uc = UtilisateurConnecteFactory.getUtilisateurConnecte();
+
+            if (string.IsNullOrEmpty(groupes)|groupes == "*")
+            {
+                base.OnActionExecuting(filterContext);
+                return;
+            }
+
+            List<string> groupe_names = groupes.Split(',').ToList();
+            if(!groupe_names.Contains("Admin"))
+            {
+                groupe_names.Insert(0, "Admin");
+            }
+
+            foreach (string groupe_name in groupe_names)
+            {
+                try
+                {
+                    int groupe_id = db.Groupes.Where(g => g.Nom == groupe_name).First().Id;
+
+                    if (db.Utilisateurs.Any(u => u.Sid == uc.sid && u.GroupeId == groupe_id))
+                    {
+                        base.OnActionExecuting(filterContext);
+                        return;
+                    }
+                }
+                catch (System.InvalidOperationException)
+                {
+                    continue;
+                }
+            }
+
+            filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary(new { controller = "Home", action = "Unauthorized" }));
+
+        }
+    }
+
+}

+ 3 - 1
CD67.FicheCollege.MVC/Internal/UtilisateurConnecteFactory.cs

@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.DirectoryServices;
 using System.Linq;
+using System.Security.Principal;
 using System.Text.RegularExpressions;
 using System.Web;
 
@@ -26,6 +27,7 @@ namespace CD67.FicheCollege.MVC.Internal
                 try
                 {
                     DirectoryEntry userEntry = getUserEntry();
+
                     utilisateurConnecte = new Models.UtilisateurConnecte()
                     {
                         nom = userEntry.Properties["sn"].Value.ToString(),
@@ -35,7 +37,7 @@ namespace CD67.FicheCollege.MVC.Internal
                         login = userEntry.Properties["sAMAccountName"].Value.ToString(),
                         employeeID = userEntry.Properties["employeeID"].Value == null ? (int?)null : int.Parse(userEntry.Properties["employeeID"].Value.ToString()),
                         guid = userEntry.Properties["objectGUID"].Value == null ? (Guid?)null : new Guid((byte[])userEntry.Properties["objectGUID"].Value),
-                        sid = userEntry.Properties["objectSid"].Value.ToString(),
+                        sid = new SecurityIdentifier((byte[])userEntry.Properties["objectSid"].Value, 0).ToString(),
                         structure = String.Join(@"\", getOUs(userEntry))
                     };
                     HttpContext.Current.Session["UtilisateurConnecte"] = utilisateurConnecte;

+ 7 - 0
CD67.FicheCollege.MVC/Views/Home/Unauthorized.cshtml

@@ -0,0 +1,7 @@
+@{
+    ViewBag.Title = "Unauthorized";
+    Layout = "~/Views/Shared/_AdminLayout.cshtml";
+}
+
+<h2>Accès non autorisé</h2>
+

+ 1 - 1
CD67.FicheCollege.MVC/Views/Utilisateurs/Create.cshtml

@@ -25,7 +25,7 @@
                 <div class="panel-heading clearfix">
                     <h4 class="panel-title pull-left" style="padding-top: 7.5px;">
                         <i class="fa fa-user color1" aria-hidden="true"></i>
-                        @Html.LabelFor(model => utilisateur.Sid)
+                        Agent
                     </h4>
                     <div class="pull-right">
                         <span class="glyphicon glyphicon-trash removeItem btn btn-danger btn-sm" aria-hidden="true" data-type="gestionnaire"></span>