Récemment, je travaille sur un projet de type site Web qui nécessite de contrôler le module d'accès de l'utilisateur (autorisation), de sorte qu'un simple ensemble de fonctions de contrôle d'autorisation est conçu et implémenté.
1. Conception de la base de données
Utilisateur: utilisateurs
Modules: modules
Code SQL:
/ * Type de serveur cible: MySqlTarget Server Version: 50628 Encodage: 65001Date: 2016-08-26 10: 35: 28 * / Set Foreign_Key_Checks = 0; - ------------------------------ Table Structure pour `modules`-- ----------------------- Null auto_increment, `module` varchar (30) commentaire null par défaut '模块',` pid` int (10) commentaire nul par défaut '上一级 id', `niveau` int (4) commentaire null par défaut '级别', clé primaire (` id`)) moteur = innodb charset par défaut = utf8; - ----------------------- ------------------------------ STRUCTURE DE TABLE pour `Users`-- ---------------------------- Déposez la table si existe` `Users`; Créer la table 'Users' (` User_Code` Varchar (10) Not Null Commentaire '' 用户代码 ', `User_NAME` VARCHAR (40) COMMENTAGE NULL DÉFAUT' '用户名',« User_Password` Commentaire nul «qq», `msn` varchar (50) commentaire null par défaut« msn »,` dismo` varchar (100) commentaire null comment «备注», `autocode` commentaire par défaut '权限码', clé primaire (` user_code`)) moteur = innondb charme par défaut = utf8; - -----------------------
1. Implémentation de l'arrière-end <Br /> Le cadre SSM + Freemarker est utilisé dans le projet pour encapsuler les autorisations en structure de données de l'arborescence d'autorisation, puis la convertir au format JSON.
1) La couche d'affichage adopte Ztree Tree (setUserAuthOrne.html)
<! Doctype html> <html> <ead> <# inclue "commun / res.html" /> <script src = "$ {base.ctx} /js/layer-v2.1/laypage/laypage.js"> </ script> <link href = "$ {base.ctx} /js/layer-v2.1/laypage/skin/laypage.css" rel = "stylesheet" type = "text / css" /> <script src = "$ {base.ctx} /js/layer-v2.1/layer/layer.js"> </cript> <! href = "$ {base.ctx} /component/ztree/css/ztrestyle/ztrestyle.css" rel = "stylesheet" type = "text / css" /> <script type = "text / javascript" src = "$ {base.ctx} /component/ztree/js/jquery.ztree.core-3.5.js"> </ script> <script type = "text / javascrip Type = "Text / CSS">. Blue-Madison {Border: 1Px Solid # 7CA7CC; Border-top: 0;}. Légende {Background-Color: # 578EBE; Border-Bottom: 0; rembourrage: 0 10px; marge-fond: 0; Couleur: #fff;} </ style> </ head> <body> <div style = "overflow-y: auto; width: 400px; height: 550px;"> <div id = "ztree"> <ul id = "triedemo"> </ul> </ div> </v> <v> <v> <div align = "Center" Style = "margin-top: 5px"> <iv type = "Center" Style = "margin-top: 5px"> <dev onclick = "editmodle ()"> ok </futton> <button type = "Button" id = "annuler"> Close </ button> </div> </div> </div> <cript> $ ("document"). Ready (function () {$ .ajax ({type: "Post", url: "$ {base.ctx} / setup / getUsherghmaskyd", " Data: {"id": "$ {userId}"}, DataType: "JSON", Success: Function (Result) {ZtreeObj = $ .fn.ztree.init ($ (# TreedEMO "), Result.datas.Data); // Chargez l'arbre var ztreeoBj; // Pour une utilisation approfondie, veuillez vous référer à la documentation de l'API (explication détaillée de la configuration du paramètre) Var Setting = {View: {// dblclickExpand: false, showline: true, // La connexion entre les nœuds est-elle affichée}, vérifie: {activer:: CHKBOXT "N": "ps"}, // autocheckTrigger: true}, rappel: {oncheck: zTreeOncheck,}}; // Fonction de l'événement de rappel cliqueté sur ZtreeOncheck (événement, TreeID, Treenode) {/ * var ztree = $ .fn.ztree.getztreeObj ("TreedEmo"); var changageNodes = zTree.getChangeCheckEdNodes (); pour (var i = 0; i <changéNodes.Length; i ++) {var Treenode = changolNodes [i]; } * /}; fonction editmodle () {var rootId = null; var midid = null; var minid = null; var treeoBj = $ .fn.ztree.getztreeObj ("triedemo"); var nœuds = treeoBj.getCheckEdNodes (); for (var i = 0; i <nœuds.length; i ++) {if (nœuds [i] .level == 0) {rootId = roolid + "," + nœuds [i] .id; } if (nœuds [i] .level == 1) {midid = midid + "," + nœuds [i] .id; } if (nœuds [i] .level == 2) {minid = minid + "," + nœuds [i] .id; }} if (rootId! = null) {rootId = rootId.substring (5, rootId.length); } if (midid! = null) {midid = midid.substring (5, midid.length); } if (minid! = null) {minid = minid.substring (5, minid.length); } $ .ajax ({type: "post", URL: "$ {base.ctx} / setup / updateUserRightMaskByajax", dataType: "json", data: {"roolid": roolid, "midid": midid, "minid": minid, "userId": "$ {userId}"}, Success: fonction (résultat) {if (1 ")}"}, Success: fonction (résultat) {if (1 ")}"}, Success: fonction (résultat) {if (1 ")}"}, Success: fonction (Résultat) {Résultat = ")}"}, Success: fonction (Résultat) {Résultat = ")}"}, Succès couchers.msg ("Empowered avec succès!"); } // Close $ ("# annuler"). Cliquez sur (fonction () {top.dialog.get ("set-dialog"). Close (). Retire ();}); </cript> </ body> </html> L'effet d'affichage est le suivant:
2) La couche de contrôle du contrôleur utilise Springmvc
Dans la couche de contrôle, convertissez les données au format JSON et envoyez-la à la couche d'affichage.
/ ** * @fun obtiennent les autorisations d'utilisateur de la branche * @author pi Feng * @date 2016/8/25 * @param session * @param id * @param subsoreid * @return * / @requestmapping ("getUserRightMaskbyid") @reSponsebody public objet GetUserRightMaskId (httSession, string id, String subsoreId) { subsoreId = StringUtils.Isempty (subsoreid)? String.Valueof (session.getAttribute ("subsoreId")): subsoreId; // Jugez s'il s'agit d'un hôtel ou d'une liste d'inndre <map <string, objet >> versionsList = this.setupservice.Gethotelversions (subsoreid); Objet versions = versionsList.get (0) .get ("versions"); Map <string, objet> hotelmap = new HashMap <String, objet> (); if ((null! = versionsList) && (versionsList.size ()! = 0)) {// List n'est pas vide if ("complet" .equals (versions)) {// hôtel // requête de l'hôtel Permission Tree HotelMap = this.RightMaskService.GetUserRightMaskontree (subsoreid, id, "complete"); } else if ("Simple" .equals (versions)) {// inn // query inn permission arbre hotelmap = this.RightMaskService.getUserRightMaskontree (subsoreid, id, "simple"); }} Map <string, object> resultMap = new HashMap <String, object> (); ResultMap.put ("Datas", HotelMap); return jsonObject.tojSontring (resultemap, serializerfeature.writeMapNullValue); } 3) La couche de service de service résume les autorisations dans une structure de données d'arbre qui satisfait le format Ztree
/ ** * @Fun Get Branch User les autorisations * @Author Pi Feng * @Date 2016/8/25 * @param subsoreid * @param id * @param versions * @return map <String, Object> * / @Override Public Map <String, Object> GetUserRight, objet> (String userRightMask = this.IrightMaskdao.getUserRightMaskBySubandid (subsoreId, id); List <map <string, objet >> listOne = new ArrayList <map <string, objet >> (); List <map <string, objet >> listTwo = new ArrayList <map <string, objet >> (); // list <map <string, objet >>> listThere = new ArrayList <map <string, objet >> (); List <map <string, objet >>> resultList = new ArrayList <map <string, objet >> (); if (versions.equals ("complete")) {// hotel listOne = this.irightmaskdao.getrightmaskonhotelone (); listTwo = this.irightmaskdao.getRightMaskonHoteltWo (); // listTheRe = this.irightmaskdao.getRightMaskonHotelThere (); PackagingTotWoTree (resultList, listOne, listTwo, userrightmask); } else if (versions.equals ("Simple")) {// inn listOne = this.irightmaskdao.getRightMaskontAvernone (); listTwo = this.irightmaskdao.getRightMaskontaverntwo (); // listThere = this.irightmaskdao.getRightMaskontaverNTe (); PackagingTotWoTree (resultList, listOne, listTwo, userrightmask); } Map <string, objet> map = new hashmap <string, object> (); map.put ("data", resultList); carte de retour; } / ** * @function encapsule une arbre de premier niveau * @author pi feng * @date 2016/8/26 * @param resultList * @param listone * @param authcode * @return void * / private void packagingtoonetere 0; rootmap.put ("id", listOne.get (i) .get ("id")); rootmap.put ("name", listOne.get (i) .get ("module")); if (validaterightMask (listOne, authCode, i)! = -1) {rootmap.put ("vérifié", true); } else {rootmap.put ("vérifié", false); } resultList.add (rootmap); }} / ** * @function encapsule une arborescence secondaire * @author pi Feng * @date 2016/8/26 * @param resultList * @param listone * @param listtwo * @param authCode * @return void * / private void packagingTotwOtree (listone <map, objet >> resultList <map <map <String, objet >> listone, listone, <sthring >> resultList, list <map <map <String, objet >> ListOne, ListOne, List <Map <String >> ResultList listTwo, map <string, objet >> authCode) {for (int i = 0; i <listOne.size (); i ++) {list <map <string, objet >> midList = new ArrayList <map <string, objet >> (); pour (int j = 0; j <listtwo.size (); j ++) {if (listTwo.get (j) .get ("pid"). toString () .equals (listOne.get (i) .get ("id"). toString ())) {list <map <string, objet>> minlist = new ArrayList <map <map <String, objet>); Map <string, objet> midmap = new hashmap <string, objet> (); midmap.put ("id", listTwo.get (j) .get ("id")); midmap.put ("name", listTwo.get (j) .get ("module")); midmap.put ("enfants", minlist); if (validaterightMask (listTwo, authCode, j)! = -1) {midmap.put ("checked", true); } else {midmap.put ("vérifié", false); } midlist.add (midmap); }} Map <string, objet> rootmap = new hashmap <string, objet> (); rootmap.put ("id", listOne.get (i) .get ("id")); rootmap.put ("name", listOne.get (i) .get ("module")); rootmap.put ("enfants", midlist); if (validaterightMask (listOne, authCode, i)! = -1) {rootmap.put ("vérifié", true); } else {rootmap.put ("vérifié", false); } resultList.add (rootmap); }} / ** * @function encapsule un arbre de troisième niveau * @author pi Feng * @Date 2016/8/26 * @param resultList * @param listone * @param listtwo * @param listtwo * @param authcode * @return void * / private void packagingtothreetree (list <maph List <map <string, object >> listTwo, list <map <string, object >> listTheree, map <string, object> authCode) {for (int i = 0; i <listone.size (); i ++) {list <map <string, objet >> midlist = new ArrayList <map <string, object >> (); pour (int j = 0; j <listTwo.size (); j ++) {if (listTwo.get (j) .get ("pid"). toString () .equals (listOne.get (i) .get ("id"). toString ())) {list <string, objet >> minlist = new ArrayList <Map <String, objet >> ();); for (int k = 0; k <listTheRe.size (); k ++) {map <string, objet> minmap = new hashmap <string, object> (); if (listTheRe.get (k) .get ("pid"). toString () .equals (listTwo.get (j) .get ("id"). toString ())) {minmap.put ("id", listTheRe.get (k) .get ("id")); minmap.put ("name", listTheRe.get (k) .get ("module")); if (validaterightMask (listTheRe, authCode, k)! = -1) {minmap.put ("vérifié", true); } else {minmap.put ("vérifié", false); } minlist.add (minmap); }} Map <string, objet> midmap = new hashmap <string, objet> (); midmap.put ("id", listTwo.get (j) .get ("id")); midmap.put ("name", listTwo.get (j) .get ("module")); midmap.put ("enfants", minlist); if (validaterightMask (listTwo, authCode, j)! = -1) {midmap.put ("checked", true); } else {midmap.put ("vérifié", false); } midlist.add (midmap); }} Map <string, objet> rootmap = new hashmap <string, objet> (); rootmap.put ("id", listOne.get (i) .get ("id")); rootmap.put ("name", listOne.get (i) .get ("module")); rootmap.put ("enfants", midlist); if (validaterightMask (listOne, authCode, i)! = -1) {rootmap.put ("vérifié", true); } else {rootmap.put ("vérifié", false); } resultList.add (rootmap); }} / ** * @Function Vérifiez s'il existe un code d'autorisation dans AuthCode dans la liste * @author pi Feng * @Date 2016/8/26 * @param liste * @param authCode * @param i * @return int * / private int Validaterightmask (list <string, objet >> list, map <string> object> authcode, int i) {string> list> authCode.get ("auth_code")! = null? authCode.get ("auth_code"). toString (): ""; if (! StringUtils.Isempty (droite Mask)) {RightMask = RightMask.replace (";", ","); String [] array = rightmask.split (","); for (int j = 0; j <arry.length; j ++) {String arrayRightMask = arry [j]; String ListrightMask = list.get (i) .get ("id"). ToString (); if (arryRightMask.equals (ListrightMask)) {return 1; }}} else {return -1; } return -1; } 4) Interrogez la base de données pour obtenir des autorisations utilisateur
un. Éliminez différents niveaux d'autorisations de la table des modules en fonction du niveau d'autorisation dans la couche de données.
Sélectionnez ID, module, pid, niveau à partir des modules où le niveau = '0' SELECT ID, module, PID, niveau à partir des modules où le niveau = '1' SELECT ID, module, PID, niveau à partir des modules où le niveau = '2'
né Sortez toutes les autorisations d'un utilisateur (code d'autorisation) dans le tableau des utilisateurs
Sélectionnez Auth_Code dans les utilisateurs où user_code = 'Pifeng'
c. Lors de la sauvegarde des autorisations, les codes d'autorisation entre différents niveaux sont séparés par le point-virgule britannique ";", et les codes d'autorisation entre le même niveau sont séparés par la virgule britannique ",". Par exemple: 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,36,37,27,28,29,30,31,32,33,34,35,38,39,40,41,42,43,44 , 45,46,47,48,49,50,51,52,53,54,56,57,58,59,60,61,62,63,64,133,65,66,67,68,69,70,71,72,73,74,75,1 26,127,128,129,130,131,76,77,78,79,80,81,82,83,84,85,86,87,88,99,124,134,135,136,140,141,89,90,91,92,93,94,95,9 6,97,98,137,138,139,100,101,102,103,106,107,132,108,109,110,111112,113,114,115,116,125,117,118,119,120,121.122222
5) Utilisez la balise Freemarker pour contrôler si le module de fonction de page s'affiche en fonction du code d'autorisation de l'utilisateur
un. Configuration Freemarker dans le fichier XML
<bean id = "FreemarkerConfig"> <! - Temple de chargement de chargement -> <propriété name = "TemplateLoaderPath"> <value> / web-inf / ftl / </value> </ propriété> <propriété name = "freemarkervariables"> <map> <entrée clés = "xml_escape" Value-Ref = "FMXMlesCape" name = "freemarkersettings"> <popps> <prop key = "tag_syntax"> auto_detect </prop> <prop key = "template_update_delay"> 0 </ prop> <prop Key = "default_encoding"> utf-8 </ prop> <prop. <prop key = "date_format"> yyyy-mm-dd </ prop> <prop key = "time_format"> hh: mm: ss </ prop> <prop key = "number_format"> 0. ###### </ prop> <prop key = "datetime_format"> yyyy-mm-dd hh: mm: ss </pat> <! KEY = "Classic_Compatible"> true </prop> <! - Importez automatiquement le modèle FTL et utilisez l'alias "base" comme espace de noms -> <prop Key = "AUTO_IMPORT"> Inc / Spring.ftl comme base </prop> </props> </ propriété> </ bean> <bean id = "FMXMLESCAPE" /> <EAN ID = "FREEMARKERWRESOR" Value = ". Html" /> <propriété name = "cache" value = "false" /> <propriété name = "ViewClass" value = "org.springframework.web.servlet.view.freMarker.freMarkerview" /> <propriété Name = "ContentType" Value = "Text / html; charset = utf-8"> </ Property> 'subsoreid' en raison d'un modèle existant -> <propriété name = "permettre la commande" value = "true" /> <propriété name = "exposerequestattributes" value = "true" /> <propriété name = "exposeSessionAttributes" value = "true" /> <property name = "exposePringmacrohelpers" valueT " Méthode: request.contextPath -> <propriété name = "requestContextAttribute" value = "request" /> <propriété name = "AttributeMap"> <map> <! - Définissez le nom de la méthode Freemarker -> <entrée clé = "Menucal"> <!
né Écrivez une classe pour hériter de la classe TemplateMethodModel et implémentez la méthode personnalisée Freemarker pour contrôler si le module de page affiche la connexion et stockez le code d'autorisation utilisateur dans la session, puis obtenez l'autorisation de la session. Voici un exemple:
La classe publique Menufonction implémente TemplateMethodModel {@Override Public Object Exec (list arg0) lève TemplateModeLexception {int niveau = Integer.Valueof (arg0.get (0) .toString ()); // Niveau du module int ModeLID = Integer.ValueOf (arg0.get (1) .toString ()); // id module int count = 0; // Enregistrez la session si le code d'autorisation pour ce module httpservletRequest request = ((servleTrequestAttributes) requestContexTholder.getRequestAttributes ()). GetRequest (); HttpSession session = request.getSession (); Objet o = session.getAttribute ("info"); if (o == null) return false; Info info = (info) o; String authCode = info.getUser (). GetAuthCode (); // Code d'autorisation if (authCode.Contains (";;")) {String [] masks = authCode.split (";"); String [] m = masques [niveau] .split (","); for (int i = 0; i <M.Length; i ++) {if (modélid == Integer.ParseInt (m [i])) {++ count; } else {count + = 0; }}}} if (count == 0) {return false; } else {return true; }}} c. Utilisez la balise Freemarker sur la page et contrôlez l'affichage du module
Deux paramètres dans Menucall, le premier est le niveau du module et le second est l'ID du module
Par exemple:
<#if menucall (1,122)> <li style = "line-height: 250%"> <a href = "#" id = "bookNew"> <i> </i> réservation </a> </li> </ # if>
Ce qui précède est la mise en œuvre générale du contrôle du module d'accès de l'utilisateur (autorisation).
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.