| 1 | <!DOCTYPE html><html> |
|---|
| 2 | |
|---|
| 3 | <head> |
|---|
| 4 | <meta charset="utf-8"> |
|---|
| 5 | <title>geli_admin_auth</title> |
|---|
| 6 | <style type="text/css"> |
|---|
| 7 | body { |
|---|
| 8 | font-family: Helvetica, arial, sans-serif; |
|---|
| 9 | font-size: 14px; |
|---|
| 10 | line-height: 1.6; |
|---|
| 11 | padding-top: 10px; |
|---|
| 12 | padding-bottom: 10px; |
|---|
| 13 | background-color: white; |
|---|
| 14 | padding: 30px; } |
|---|
| 15 | |
|---|
| 16 | body > *:first-child { |
|---|
| 17 | margin-top: 0 !important; } |
|---|
| 18 | body > *:last-child { |
|---|
| 19 | margin-bottom: 0 !important; } |
|---|
| 20 | |
|---|
| 21 | a { |
|---|
| 22 | color: #4183C4; } |
|---|
| 23 | a.absent { |
|---|
| 24 | color: #cc0000; } |
|---|
| 25 | a.anchor { |
|---|
| 26 | display: block; |
|---|
| 27 | padding-left: 30px; |
|---|
| 28 | margin-left: -30px; |
|---|
| 29 | cursor: pointer; |
|---|
| 30 | position: absolute; |
|---|
| 31 | top: 0; |
|---|
| 32 | left: 0; |
|---|
| 33 | bottom: 0; } |
|---|
| 34 | |
|---|
| 35 | h1, h2, h3, h4, h5, h6 { |
|---|
| 36 | margin: 20px 0 10px; |
|---|
| 37 | padding: 0; |
|---|
| 38 | font-weight: bold; |
|---|
| 39 | -webkit-font-smoothing: antialiased; |
|---|
| 40 | cursor: text; |
|---|
| 41 | position: relative; } |
|---|
| 42 | |
|---|
| 43 | h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor { |
|---|
| 44 | background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA09pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoMTMuMCAyMDEyMDMwNS5tLjQxNSAyMDEyLzAzLzA1OjIxOjAwOjAwKSAgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUM2NjlDQjI4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUM2NjlDQjM4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5QzY2OUNCMDg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5QzY2OUNCMTg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsQhXeAAAABfSURBVHjaYvz//z8DJYCRUgMYQAbAMBQIAvEqkBQWXI6sHqwHiwG70TTBxGaiWwjCTGgOUgJiF1J8wMRAIUA34B4Q76HUBelAfJYSA0CuMIEaRP8wGIkGMA54bgQIMACAmkXJi0hKJQAAAABJRU5ErkJggg==) no-repeat 10px center; |
|---|
| 45 | text-decoration: none; } |
|---|
| 46 | |
|---|
| 47 | h1 tt, h1 code { |
|---|
| 48 | font-size: inherit; } |
|---|
| 49 | |
|---|
| 50 | h2 tt, h2 code { |
|---|
| 51 | font-size: inherit; } |
|---|
| 52 | |
|---|
| 53 | h3 tt, h3 code { |
|---|
| 54 | font-size: inherit; } |
|---|
| 55 | |
|---|
| 56 | h4 tt, h4 code { |
|---|
| 57 | font-size: inherit; } |
|---|
| 58 | |
|---|
| 59 | h5 tt, h5 code { |
|---|
| 60 | font-size: inherit; } |
|---|
| 61 | |
|---|
| 62 | h6 tt, h6 code { |
|---|
| 63 | font-size: inherit; } |
|---|
| 64 | |
|---|
| 65 | h1 { |
|---|
| 66 | font-size: 28px; |
|---|
| 67 | color: black; } |
|---|
| 68 | |
|---|
| 69 | h2 { |
|---|
| 70 | font-size: 24px; |
|---|
| 71 | border-bottom: 1px solid #cccccc; |
|---|
| 72 | color: black; } |
|---|
| 73 | |
|---|
| 74 | h3 { |
|---|
| 75 | font-size: 18px; } |
|---|
| 76 | |
|---|
| 77 | h4 { |
|---|
| 78 | font-size: 16px; } |
|---|
| 79 | |
|---|
| 80 | h5 { |
|---|
| 81 | font-size: 14px; } |
|---|
| 82 | |
|---|
| 83 | h6 { |
|---|
| 84 | color: #777777; |
|---|
| 85 | font-size: 14px; } |
|---|
| 86 | |
|---|
| 87 | p, blockquote, ul, ol, dl, li, table, pre { |
|---|
| 88 | margin: 15px 0; } |
|---|
| 89 | |
|---|
| 90 | hr { |
|---|
| 91 | background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC) repeat-x 0 0; |
|---|
| 92 | border: 0 none; |
|---|
| 93 | color: #cccccc; |
|---|
| 94 | height: 4px; |
|---|
| 95 | padding: 0; |
|---|
| 96 | } |
|---|
| 97 | |
|---|
| 98 | body > h2:first-child { |
|---|
| 99 | margin-top: 0; |
|---|
| 100 | padding-top: 0; } |
|---|
| 101 | body > h1:first-child { |
|---|
| 102 | margin-top: 0; |
|---|
| 103 | padding-top: 0; } |
|---|
| 104 | body > h1:first-child + h2 { |
|---|
| 105 | margin-top: 0; |
|---|
| 106 | padding-top: 0; } |
|---|
| 107 | body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child { |
|---|
| 108 | margin-top: 0; |
|---|
| 109 | padding-top: 0; } |
|---|
| 110 | |
|---|
| 111 | a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 { |
|---|
| 112 | margin-top: 0; |
|---|
| 113 | padding-top: 0; } |
|---|
| 114 | |
|---|
| 115 | h1 p, h2 p, h3 p, h4 p, h5 p, h6 p { |
|---|
| 116 | margin-top: 0; } |
|---|
| 117 | |
|---|
| 118 | li p.first { |
|---|
| 119 | display: inline-block; } |
|---|
| 120 | li { |
|---|
| 121 | margin: 0; } |
|---|
| 122 | ul, ol { |
|---|
| 123 | padding-left: 30px; } |
|---|
| 124 | |
|---|
| 125 | ul :first-child, ol :first-child { |
|---|
| 126 | margin-top: 0; } |
|---|
| 127 | |
|---|
| 128 | dl { |
|---|
| 129 | padding: 0; } |
|---|
| 130 | dl dt { |
|---|
| 131 | font-size: 14px; |
|---|
| 132 | font-weight: bold; |
|---|
| 133 | font-style: italic; |
|---|
| 134 | padding: 0; |
|---|
| 135 | margin: 15px 0 5px; } |
|---|
| 136 | dl dt:first-child { |
|---|
| 137 | padding: 0; } |
|---|
| 138 | dl dt > :first-child { |
|---|
| 139 | margin-top: 0; } |
|---|
| 140 | dl dt > :last-child { |
|---|
| 141 | margin-bottom: 0; } |
|---|
| 142 | dl dd { |
|---|
| 143 | margin: 0 0 15px; |
|---|
| 144 | padding: 0 15px; } |
|---|
| 145 | dl dd > :first-child { |
|---|
| 146 | margin-top: 0; } |
|---|
| 147 | dl dd > :last-child { |
|---|
| 148 | margin-bottom: 0; } |
|---|
| 149 | |
|---|
| 150 | blockquote { |
|---|
| 151 | border-left: 4px solid #dddddd; |
|---|
| 152 | padding: 0 15px; |
|---|
| 153 | color: #777777; } |
|---|
| 154 | blockquote > :first-child { |
|---|
| 155 | margin-top: 0; } |
|---|
| 156 | blockquote > :last-child { |
|---|
| 157 | margin-bottom: 0; } |
|---|
| 158 | |
|---|
| 159 | table { |
|---|
| 160 | padding: 0;border-collapse: collapse; } |
|---|
| 161 | table tr { |
|---|
| 162 | border-top: 1px solid #cccccc; |
|---|
| 163 | background-color: white; |
|---|
| 164 | margin: 0; |
|---|
| 165 | padding: 0; } |
|---|
| 166 | table tr:nth-child(2n) { |
|---|
| 167 | background-color: #f8f8f8; } |
|---|
| 168 | table tr th { |
|---|
| 169 | font-weight: bold; |
|---|
| 170 | border: 1px solid #cccccc; |
|---|
| 171 | margin: 0; |
|---|
| 172 | padding: 6px 13px; } |
|---|
| 173 | table tr td { |
|---|
| 174 | border: 1px solid #cccccc; |
|---|
| 175 | margin: 0; |
|---|
| 176 | padding: 6px 13px; } |
|---|
| 177 | table tr th :first-child, table tr td :first-child { |
|---|
| 178 | margin-top: 0; } |
|---|
| 179 | table tr th :last-child, table tr td :last-child { |
|---|
| 180 | margin-bottom: 0; } |
|---|
| 181 | |
|---|
| 182 | img { |
|---|
| 183 | max-width: 100%; } |
|---|
| 184 | |
|---|
| 185 | span.frame { |
|---|
| 186 | display: block; |
|---|
| 187 | overflow: hidden; } |
|---|
| 188 | span.frame > span { |
|---|
| 189 | border: 1px solid #dddddd; |
|---|
| 190 | display: block; |
|---|
| 191 | float: left; |
|---|
| 192 | overflow: hidden; |
|---|
| 193 | margin: 13px 0 0; |
|---|
| 194 | padding: 7px; |
|---|
| 195 | width: auto; } |
|---|
| 196 | span.frame span img { |
|---|
| 197 | display: block; |
|---|
| 198 | float: left; } |
|---|
| 199 | span.frame span span { |
|---|
| 200 | clear: both; |
|---|
| 201 | color: #333333; |
|---|
| 202 | display: block; |
|---|
| 203 | padding: 5px 0 0; } |
|---|
| 204 | span.align-center { |
|---|
| 205 | display: block; |
|---|
| 206 | overflow: hidden; |
|---|
| 207 | clear: both; } |
|---|
| 208 | span.align-center > span { |
|---|
| 209 | display: block; |
|---|
| 210 | overflow: hidden; |
|---|
| 211 | margin: 13px auto 0; |
|---|
| 212 | text-align: center; } |
|---|
| 213 | span.align-center span img { |
|---|
| 214 | margin: 0 auto; |
|---|
| 215 | text-align: center; } |
|---|
| 216 | span.align-right { |
|---|
| 217 | display: block; |
|---|
| 218 | overflow: hidden; |
|---|
| 219 | clear: both; } |
|---|
| 220 | span.align-right > span { |
|---|
| 221 | display: block; |
|---|
| 222 | overflow: hidden; |
|---|
| 223 | margin: 13px 0 0; |
|---|
| 224 | text-align: right; } |
|---|
| 225 | span.align-right span img { |
|---|
| 226 | margin: 0; |
|---|
| 227 | text-align: right; } |
|---|
| 228 | span.float-left { |
|---|
| 229 | display: block; |
|---|
| 230 | margin-right: 13px; |
|---|
| 231 | overflow: hidden; |
|---|
| 232 | float: left; } |
|---|
| 233 | span.float-left span { |
|---|
| 234 | margin: 13px 0 0; } |
|---|
| 235 | span.float-right { |
|---|
| 236 | display: block; |
|---|
| 237 | margin-left: 13px; |
|---|
| 238 | overflow: hidden; |
|---|
| 239 | float: right; } |
|---|
| 240 | span.float-right > span { |
|---|
| 241 | display: block; |
|---|
| 242 | overflow: hidden; |
|---|
| 243 | margin: 13px auto 0; |
|---|
| 244 | text-align: right; } |
|---|
| 245 | |
|---|
| 246 | code, tt { |
|---|
| 247 | margin: 0 2px; |
|---|
| 248 | padding: 0 5px; |
|---|
| 249 | white-space: nowrap; |
|---|
| 250 | border: 1px solid #eaeaea; |
|---|
| 251 | background-color: #f8f8f8; |
|---|
| 252 | border-radius: 3px; } |
|---|
| 253 | |
|---|
| 254 | pre code { |
|---|
| 255 | margin: 0; |
|---|
| 256 | padding: 0; |
|---|
| 257 | white-space: pre; |
|---|
| 258 | border: none; |
|---|
| 259 | background: transparent; } |
|---|
| 260 | |
|---|
| 261 | .highlight pre { |
|---|
| 262 | background-color: #f8f8f8; |
|---|
| 263 | border: 1px solid #cccccc; |
|---|
| 264 | font-size: 13px; |
|---|
| 265 | line-height: 19px; |
|---|
| 266 | overflow: auto; |
|---|
| 267 | padding: 6px 10px; |
|---|
| 268 | border-radius: 3px; } |
|---|
| 269 | |
|---|
| 270 | pre { |
|---|
| 271 | background-color: #f8f8f8; |
|---|
| 272 | border: 1px solid #cccccc; |
|---|
| 273 | font-size: 13px; |
|---|
| 274 | line-height: 19px; |
|---|
| 275 | overflow: auto; |
|---|
| 276 | padding: 6px 10px; |
|---|
| 277 | border-radius: 3px; } |
|---|
| 278 | pre code, pre tt { |
|---|
| 279 | background-color: transparent; |
|---|
| 280 | border: none; } |
|---|
| 281 | |
|---|
| 282 | sup { |
|---|
| 283 | font-size: 0.83em; |
|---|
| 284 | vertical-align: super; |
|---|
| 285 | line-height: 0; |
|---|
| 286 | } |
|---|
| 287 | * { |
|---|
| 288 | -webkit-print-color-adjust: exact; |
|---|
| 289 | } |
|---|
| 290 | @media screen and (min-width: 914px) { |
|---|
| 291 | body { |
|---|
| 292 | width: 854px; |
|---|
| 293 | margin:0 auto; |
|---|
| 294 | } |
|---|
| 295 | } |
|---|
| 296 | @media print { |
|---|
| 297 | table, pre { |
|---|
| 298 | page-break-inside: avoid; |
|---|
| 299 | } |
|---|
| 300 | pre { |
|---|
| 301 | word-wrap: break-word; |
|---|
| 302 | } |
|---|
| 303 | } |
|---|
| 304 | </style> |
|---|
| 305 | <style type="text/css"> |
|---|
| 306 | /** |
|---|
| 307 | * prism.js default theme for JavaScript, CSS and HTML |
|---|
| 308 | * Based on dabblet (http://dabblet.com) |
|---|
| 309 | * @author Lea Verou |
|---|
| 310 | */ |
|---|
| 311 | |
|---|
| 312 | code[class*="language-"], |
|---|
| 313 | pre[class*="language-"] { |
|---|
| 314 | color: black; |
|---|
| 315 | text-shadow: 0 1px white; |
|---|
| 316 | font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; |
|---|
| 317 | direction: ltr; |
|---|
| 318 | text-align: left; |
|---|
| 319 | white-space: pre; |
|---|
| 320 | word-spacing: normal; |
|---|
| 321 | word-break: normal; |
|---|
| 322 | word-wrap: normal; |
|---|
| 323 | line-height: 1.5; |
|---|
| 324 | |
|---|
| 325 | -moz-tab-size: 4; |
|---|
| 326 | -o-tab-size: 4; |
|---|
| 327 | tab-size: 4; |
|---|
| 328 | |
|---|
| 329 | -webkit-hyphens: none; |
|---|
| 330 | -moz-hyphens: none; |
|---|
| 331 | -ms-hyphens: none; |
|---|
| 332 | hyphens: none; |
|---|
| 333 | } |
|---|
| 334 | |
|---|
| 335 | pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, |
|---|
| 336 | code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { |
|---|
| 337 | text-shadow: none; |
|---|
| 338 | background: #b3d4fc; |
|---|
| 339 | } |
|---|
| 340 | |
|---|
| 341 | pre[class*="language-"]::selection, pre[class*="language-"] ::selection, |
|---|
| 342 | code[class*="language-"]::selection, code[class*="language-"] ::selection { |
|---|
| 343 | text-shadow: none; |
|---|
| 344 | background: #b3d4fc; |
|---|
| 345 | } |
|---|
| 346 | |
|---|
| 347 | @media print { |
|---|
| 348 | code[class*="language-"], |
|---|
| 349 | pre[class*="language-"] { |
|---|
| 350 | text-shadow: none; |
|---|
| 351 | } |
|---|
| 352 | } |
|---|
| 353 | |
|---|
| 354 | /* Code blocks */ |
|---|
| 355 | pre[class*="language-"] { |
|---|
| 356 | padding: 1em; |
|---|
| 357 | margin: .5em 0; |
|---|
| 358 | overflow: auto; |
|---|
| 359 | } |
|---|
| 360 | |
|---|
| 361 | :not(pre) > code[class*="language-"], |
|---|
| 362 | pre[class*="language-"] { |
|---|
| 363 | background: #f5f2f0; |
|---|
| 364 | } |
|---|
| 365 | |
|---|
| 366 | /* Inline code */ |
|---|
| 367 | :not(pre) > code[class*="language-"] { |
|---|
| 368 | padding: .1em; |
|---|
| 369 | border-radius: .3em; |
|---|
| 370 | } |
|---|
| 371 | |
|---|
| 372 | .token.comment, |
|---|
| 373 | .token.prolog, |
|---|
| 374 | .token.doctype, |
|---|
| 375 | .token.cdata { |
|---|
| 376 | color: slategray; |
|---|
| 377 | } |
|---|
| 378 | |
|---|
| 379 | .token.punctuation { |
|---|
| 380 | color: #999; |
|---|
| 381 | } |
|---|
| 382 | |
|---|
| 383 | .namespace { |
|---|
| 384 | opacity: .7; |
|---|
| 385 | } |
|---|
| 386 | |
|---|
| 387 | .token.property, |
|---|
| 388 | .token.tag, |
|---|
| 389 | .token.boolean, |
|---|
| 390 | .token.number, |
|---|
| 391 | .token.constant, |
|---|
| 392 | .token.symbol, |
|---|
| 393 | .token.deleted { |
|---|
| 394 | color: #905; |
|---|
| 395 | } |
|---|
| 396 | |
|---|
| 397 | .token.selector, |
|---|
| 398 | .token.attr-name, |
|---|
| 399 | .token.string, |
|---|
| 400 | .token.char, |
|---|
| 401 | .token.builtin, |
|---|
| 402 | .token.inserted { |
|---|
| 403 | color: #690; |
|---|
| 404 | } |
|---|
| 405 | |
|---|
| 406 | .token.operator, |
|---|
| 407 | .token.entity, |
|---|
| 408 | .token.url, |
|---|
| 409 | .language-css .token.string, |
|---|
| 410 | .style .token.string { |
|---|
| 411 | color: #a67f59; |
|---|
| 412 | background: hsla(0, 0%, 100%, .5); |
|---|
| 413 | } |
|---|
| 414 | |
|---|
| 415 | .token.atrule, |
|---|
| 416 | .token.attr-value, |
|---|
| 417 | .token.keyword { |
|---|
| 418 | color: #07a; |
|---|
| 419 | } |
|---|
| 420 | |
|---|
| 421 | .token.function { |
|---|
| 422 | color: #DD4A68; |
|---|
| 423 | } |
|---|
| 424 | |
|---|
| 425 | .token.regex, |
|---|
| 426 | .token.important, |
|---|
| 427 | .token.variable { |
|---|
| 428 | color: #e90; |
|---|
| 429 | } |
|---|
| 430 | |
|---|
| 431 | .token.important, |
|---|
| 432 | .token.bold { |
|---|
| 433 | font-weight: bold; |
|---|
| 434 | } |
|---|
| 435 | .token.italic { |
|---|
| 436 | font-style: italic; |
|---|
| 437 | } |
|---|
| 438 | |
|---|
| 439 | .token.entity { |
|---|
| 440 | cursor: help; |
|---|
| 441 | } |
|---|
| 442 | </style> |
|---|
| 443 | </head> |
|---|
| 444 | <body> |
|---|
| 445 | <h1 id="toc_0">ç»åæ¡æ¶åå°æéåŒå诎æ</h1> |
|---|
| 446 | |
|---|
| 447 | <p>éå°èïŒå€ªå¹³æŽçœç»ïŒ2015幎10æ</p> |
|---|
| 448 | |
|---|
| 449 | <h2 id="toc_1">1 讟计æè·¯</h2> |
|---|
| 450 | |
|---|
| 451 | <h3 id="toc_2">1.1 ç°ç¶</h3> |
|---|
| 452 | |
|---|
| 453 | <p>äœäžºäžäžªå¿«éåŒåçæ¡æ¶åå·¥å
·ïŒç»å对äºå®äœå¯¹è±¡èªåšçæäºå¢å æ¹æ¥çåºæ¬UIåèœïŒåžæèœå°œå¯èœçåå°åŒåçéå€å·¥äœïŒååŸäºäžéçææã</p> |
|---|
| 454 | |
|---|
| 455 | <p>æå讟计çæè·¯åŸç®åïŒå¯¹äºå®äœå¯¹è±¡ïŒæäŸåºæ¬çåèœïŒåœè¿äºåèœäžå€çšæ¶ïŒåŒåå¯ä»¥éè¿ä»£ç çæå·¥å
·çæä»£ç ïŒç»è¿æ¹è¿åèŠçåºæ¬åèœãå¯¹äºæééšåïŒå 䞺äžå¡çåå·®äžå«ïŒäžå¥œæäŸç®åçæ¹æ³ïŒæä»¥éèŠæ¯äžªåºçšèªå·±å€çïŒä»£ç çæå·¥å
·åšåºçšéé¢çæäºAuthFilterè¿äžªè¿æ»€åšïŒå¹¶å®ç°äºå¯¹äºå尿鿥å¿çåºæ¬åèœçæééå¶ä»£ç ïŒåžæåŒå人åèœå€èªå·±æ·»å 代ç ïŒå€çå
¶ä»éšåçæéé®é¢ã</p> |
|---|
| 456 | |
|---|
| 457 | <p>éæŸçæ¯ç¢°å°äºäž€äžªé®é¢ïŒéŠå
ïŒç±äºè®Ÿè®¡çç応ïŒAuthFilterç代ç 讟计æäºé»ååæš¡åŒïŒå°±æ¯è¯Žå¯¹äºäžäžªåèœïŒé€éå äºéå¶ïŒåŠåè°éœèœè®¿é®ïŒå
¶æ¬¡ïŒå¯¹äºæ¡æ¶çå¹è®åå¹è®ç»æç确讀äžå€åœ»åºïŒå¯ŒèŽæäºåŒåäžæž
æ¥è¿éšåç讟计ã以è³äºæ°å äºå®äœå¯èœå¿è®°å æééå¶ã</p> |
|---|
| 458 | |
|---|
| 459 | <p>åºäºä»¥äžåå ïŒéèŠå¯¹è¿éšåéæ°è®Ÿè®¡å¹¶å 区å¹è®æ¥è§£å³è¿äžªé®é¢ïŒå æ€ä¹å°±æäºæ¬æã</p> |
|---|
| 460 | |
|---|
| 461 | <h3 id="toc_3">1.2 æ¹è¿</h3> |
|---|
| 462 | |
|---|
| 463 | <p>éŠå
ïŒå¯¹äºAuthFilterç讟计æ¹äžºçœååæ¹åŒïŒåœç¶è¿éæäºæäžïŒå°±æ¯çŒºçæ
åµïŒææçä¿®æ¹æéïŒå¿
é¡»æ¯ç³»ç»çè¶
级管çåæèœäœ¿çšïŒææçæ¥çæéïŒå¿
é¡»æ¯æ¬åºçšçåå°ç»éçšæ·æèœäœ¿çšãçžä¿¡è¿ç§è®Ÿå®å¯¹å€§éšåæ
åµéœæ¯åççã</p> |
|---|
| 464 | |
|---|
| 465 | <p>å
¶æ¬¡ïŒå¯¹äºéèŠç¹æ®å€ççæ
åµïŒå¯ä»¥éè¿AuthFilteréé¢çhasRightæ¹æ³æ¥è¿è¡å€çïŒå¯ä»¥æå®ïŒ0 - äžå€ç(éçšçŒºçå€çïŒïŒ1 - 没ææéïŒ2 - ææé è¿äžç§æ
嵿¥ç®åäºæ
ãçšçœååäžºäž»çæ¹åŒæ¥è§£å³é®é¢ïŒé¿å
æ æçéæŒæéã</p> |
|---|
| 466 | |
|---|
| 467 | <p>æåïŒåŠæè¿å¥æ¹æ¡å®å
šäžèœæ»¡è¶³ïŒè¿å¯ä»¥èªå·±Overrideè¿æ»€å𿹿³ïŒå®å
šå®å¶ïŒåœç¶è¿ç§æ
åµåºè¯¥æ¯èŸå°è§ã</p> |
|---|
| 468 | |
|---|
| 469 | <h3 id="toc_4">1.3 代ç 诎æ</h3> |
|---|
| 470 | |
|---|
| 471 | <p>ç°åšçæ
嵿¯èªåšçæç代ç AuthFilteréé¢äŒæŒäºå¢å æééå¶ãä»£ç æš¡æ¿åŠäž:</p> |
|---|
| 472 | |
|---|
| 473 | <pre><code class="language-java"> |
|---|
| 474 | /// 泚æïŒïŒè¿ç§æ¹æ³æé£é©ïŒéèŠæ¹è¿äžºæ°æš¡åŒïŒïŒïŒ |
|---|
| 475 | /// 泚æïŒïŒè¿ç§æ¹æ³æé£é©ïŒéèŠæ¹è¿äžºæ°æš¡åŒïŒïŒïŒ |
|---|
| 476 | /// 泚æïŒïŒè¿ç§æ¹æ³æé£é©ïŒéèŠæ¹è¿äžºæ°æš¡åŒïŒïŒïŒ |
|---|
| 477 | @Override |
|---|
| 478 | public void doFilter(ServletRequest request, ServletResponse response, |
|---|
| 479 | FilterChain chain) throws IOException, ServletException { |
|---|
| 480 | |
|---|
| 481 | HttpServletRequest req = (HttpServletRequest)request; |
|---|
| 482 | HttpServletResponse resp = (HttpServletResponse)response; |
|---|
| 483 | String uri = req.getRequestURI(); |
|---|
| 484 | Env env = EnvUtils.getEnv(); |
|---|
| 485 | |
|---|
| 486 | if (LOG.isDebugEnabled()) { |
|---|
| 487 | LOG.debug("AuthFilter process: " + uri); |
|---|
| 488 | } |
|---|
| 489 | |
|---|
| 490 | HttpMethod method = env.getHttpMethod(); |
|---|
| 491 | GeliAuthFacade authFacade = env.getBean(GeliAuthFacade.class); |
|---|
| 492 | |
|---|
| 493 | String adminPrefix = env.getServletContext().getContextPath() + "/admin"; |
|---|
| 494 | if (uri.startsWith(adminPrefix + "/geli") && !uri.endsWith("geliuser/select.do")) { |
|---|
| 495 | if (! authFacade.isAdmin()) { |
|---|
| 496 | if (method == HttpMethod.POST) { |
|---|
| 497 | sendAuthFail(resp, true); |
|---|
| 498 | } else { |
|---|
| 499 | sendAuthFail(resp, false); |
|---|
| 500 | } |
|---|
| 501 | return; |
|---|
| 502 | } |
|---|
| 503 | } |
|---|
| 504 | |
|---|
| 505 | // Please process application auth here: |
|---|
| 506 | // ... |
|---|
| 507 | // ... |
|---|
| 508 | |
|---|
| 509 | chain.doFilter(request, response); |
|---|
| 510 | |
|---|
| 511 | } |
|---|
| 512 | </code></pre> |
|---|
| 513 | |
|---|
| 514 | <p>ç±äºåªå¯¹ /admin/geli*** çurlåäºéå¶ïŒçšæ·èªå·±å¢å çå®äœéèŠèªå·±å®¶éå¶ïŒäœæ¯ç€ºäŸä»£ç 页æ¯èŸéº»çŠïŒæä»¥åŸéŸè®©å€§å®¶æå¥œã</p> |
|---|
| 515 | |
|---|
| 516 | <p>æ¹è¿åçæš¡æ¿ç®æ æŽæç¡®ïŒå°±æ¯äžæ³šäºéå¶åå°èªåšæäŸçåèœãæš¡æ¿åŠäžïŒ</p> |
|---|
| 517 | |
|---|
| 518 | <pre><code class="language-java"> |
|---|
| 519 | static final String CREATE_DO = "create.do"; |
|---|
| 520 | static final String UPDATE_DO = "update.do"; |
|---|
| 521 | static final String DELETE_DO = "delete.do"; |
|---|
| 522 | |
|---|
| 523 | @Override |
|---|
| 524 | public int hasRight(HttpServletRequest req) { |
|---|
| 525 | Env env = EnvUtils.getEnv(); |
|---|
| 526 | GeliAuthFacade authFacade = env.getBean(GeliAuthFacade.class); |
|---|
| 527 | |
|---|
| 528 | // examples... |
|---|
| 529 | if (matchActions("sales", req, CREATE_DO, UPDATE_DO, DELETE_DO)) { |
|---|
| 530 | return authFacade.hasRight(GeliFunction.read("sales_maint")) ? HAS_RIGHT : HAS_NOT_RIGHT; |
|---|
| 531 | } |
|---|
| 532 | |
|---|
| 533 | return DEFAULT_RIGHT; |
|---|
| 534 | } |
|---|
| 535 | |
|---|
| 536 | // check request uri match ${contextPath}/admin/${entityName}/${one of actions} |
|---|
| 537 | boolean matchActions(String entityName, HttpServletRequest req, String ... actions) { |
|---|
| 538 | String uri = req.getRequestURI(); |
|---|
| 539 | Env env = EnvUtils.getEnv(); |
|---|
| 540 | String uriPrefix = env.getServletContext().getContextPath() + "/admin/" + entityName.toLowerCase() + '/'; |
|---|
| 541 | for (String action : actions) { |
|---|
| 542 | if (uri.startsWith(uriPrefix + action)) { |
|---|
| 543 | return true; |
|---|
| 544 | } |
|---|
| 545 | } |
|---|
| 546 | return false; |
|---|
| 547 | } |
|---|
| 548 | </code></pre> |
|---|
| 549 | |
|---|
| 550 | <p>倧éšåæ
åµåªèŠæç
§exampleçæš¡åŒå°±å¯éå¶äºïŒå
¶ä»æ
åµå¯ä»¥èªå·±ç¹æ®å€çã</p> |
|---|
| 551 | |
|---|
| 552 | <p>exampleæäŸçäŸå衚瀺对äºå®äœSalesïŒçžå
³ç create.do | update.do | delete.do åŠææ¥æsales_maintïŒéå®ç»Žæ€ïŒæéïŒå¯ä»¥äœ¿çšïŒåŠåæç
§ç³»ç»ççŒºçæš¡åŒïŒåªæç³»ç»è¶
级管çåæèœäœ¿çšïŒã</p> |
|---|
| 553 | |
|---|
| 554 | <h2 id="toc_5">2 äžç§æ
åµ</h2> |
|---|
| 555 | |
|---|
| 556 | <h3 id="toc_6">2.1 æç®åæ
åµ</h3> |
|---|
| 557 | |
|---|
| 558 | <p>åºçšéåžžç®åïŒèäžå°±å°æ°å äžªçšæ·äœ¿çšãçŽæ¥å°çšæ·è®Ÿçœ®äžºè¶
级管çåïŒäžçšèèæéé®é¢ïŒç³»ç»çŒºçæ¹æ¡äŒçŽæ¥æ»¡è¶³éæ±ã</p> |
|---|
| 559 | |
|---|
| 560 | <p>ç®åïŒäœæ¯åªéçšäºç¹å®çæ
åµã</p> |
|---|
| 561 | |
|---|
| 562 | <blockquote> |
|---|
| 563 | <p>æè§äžéïŒå¥éœäžçšååïŒäœæ¯äžäŒæ¯æ¬¡è¿ä¹å¥œè¿æ°:)</p> |
|---|
| 564 | </blockquote> |
|---|
| 565 | |
|---|
| 566 | <h3 id="toc_7">2.2 æå¯èœæ
åµ</h3> |
|---|
| 567 | |
|---|
| 568 | <p>对äºå€§éšåæ
åµïŒåºè¯¥äŒæè¶
级管çå以å€ççšæ·è§è²ïŒäœæ¯è¿æ¯æåŸå€çæéåªç»è¶
级管çåçšïŒå¯¹äºæ®éçšæ·èŠäœ¿çšçåèœïŒåš hasRight æ¹æ³éé¢è¿è¡ç¹å«å
讞就å¯ä»¥äºã1.3èçexampleåŸå¥œç诎æäºè¿ç§æ
åµã</p> |
|---|
| 569 | |
|---|
| 570 | <h3 id="toc_8">2.3 倿æ
åµ</h3> |
|---|
| 571 | |
|---|
| 572 | <p>对äºå€æç倧ååºçšïŒåœåå°æéç³»ç»åŸå€ææ¶ïŒæå¥œèªå·±è¿è¡å®å¶åŒåïŒè¿éåªæäŸäž€ç§æè·¯ïŒäžç§å°±æ¯å°åªäºurlçåªäºhttpæ¹æ³ïŒGETãPOSTçïŒå¯¹åºåªäºåèœåäžäžªæš¡åïŒè¿è¡é
眮ã</p> |
|---|
| 573 | |
|---|
| 574 | <p>æŽå€æçå°±èŠå®å
šå®å¶äºãå äžºåŸæéåæ°æ®è¿æå
³ç³»ïŒå°±èŠäœ¿çšèµæºçæŠå¿µäºã</p> |
|---|
| 575 | |
|---|
| 576 | <h2 id="toc_9">3 å®å
šå级</h2> |
|---|
| 577 | |
|---|
| 578 | <p>ææäœ¿çš geli-2.x çåºçšéœéèŠå级ïŒå级æ¹åŒåŠäžïŒ</p> |
|---|
| 579 | |
|---|
| 580 | <ol> |
|---|
| 581 | <li>å级å°geli-2.0.8çæ¬ïŒè¯·æ³šæäŸèµå
ççæ¬</li> |
|---|
| 582 | <li>ä¿®æ¹æ¬åºçšçAuthFilter代ç ïŒæ°çä»£ç æš¡æ¿äžèœœïŒ<a href="http://trac.pc.com.cn/geli/attachment/wiki/QuickStart/AuthFilter.java">AuthFilter.java</a></li> |
|---|
| 583 | <li>ä¿®æ¹web.xmläžAuthFilterç<code>url-pattern</code>ä» <code>*.do</code> å° <code>/admin/*</code> 以æé«åå°çæç</li> |
|---|
| 584 | </ol> |
|---|
| 585 | |
|---|
| 586 | <script type="text/javascript"> |
|---|
| 587 | var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=_self.Prism={util:{encode:function(e){return e instanceof n?new n(e.type,t.util.encode(e.content),e.alias):"Array"===t.util.type(e)?e.map(t.util.encode):e.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},clone:function(e){var n=t.util.type(e);switch(n){case"Object":var a={};for(var r in e)e.hasOwnProperty(r)&&(a[r]=t.util.clone(e[r]));return a;case"Array":return e.map&&e.map(function(e){return t.util.clone(e)})}return e}},languages:{extend:function(e,n){var a=t.util.clone(t.languages[e]);for(var r in n)a[r]=n[r];return a},insertBefore:function(e,n,a,r){r=r||t.languages;var l=r[e];if(2==arguments.length){a=arguments[1];for(var i in a)a.hasOwnProperty(i)&&(l[i]=a[i]);return l}var o={};for(var s in l)if(l.hasOwnProperty(s)){if(s==n)for(var i in a)a.hasOwnProperty(i)&&(o[i]=a[i]);o[s]=l[s]}return t.languages.DFS(t.languages,function(t,n){n===r[e]&&t!=e&&(this[t]=o)}),r[e]=o},DFS:function(e,n,a){for(var r in e)e.hasOwnProperty(r)&&(n.call(e,r,e[r],a||r),"Object"===t.util.type(e[r])?t.languages.DFS(e[r],n):"Array"===t.util.type(e[r])&&t.languages.DFS(e[r],n,r))}},plugins:{},highlightAll:function(e,n){for(var a,r=document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'),l=0;a=r[l++];)t.highlightElement(a,e===!0,n)},highlightElement:function(n,a,r){for(var l,i,o=n;o&&!e.test(o.className);)o=o.parentNode;o&&(l=(o.className.match(e)||[,""])[1],i=t.languages[l]),n.className=n.className.replace(e,"").replace(/\s+/g," ")+" language-"+l,o=n.parentNode,/pre/i.test(o.nodeName)&&(o.className=o.className.replace(e,"").replace(/\s+/g," ")+" language-"+l);var s=n.textContent,u={element:n,language:l,grammar:i,code:s};if(!s||!i)return t.hooks.run("complete",u),void 0;if(t.hooks.run("before-highlight",u),a&&_self.Worker){var g=new Worker(t.filename);g.onmessage=function(e){u.highlightedCode=e.data,t.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,r&&r.call(u.element),t.hooks.run("after-highlight",u),t.hooks.run("complete",u)},g.postMessage(JSON.stringify({language:u.language,code:u.code,immediateClose:!0}))}else u.highlightedCode=t.highlight(u.code,u.grammar,u.language),t.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,r&&r.call(n),t.hooks.run("after-highlight",u),t.hooks.run("complete",u)},highlight:function(e,a,r){var l=t.tokenize(e,a);return n.stringify(t.util.encode(l),r)},tokenize:function(e,n){var a=t.Token,r=[e],l=n.rest;if(l){for(var i in l)n[i]=l[i];delete n.rest}e:for(var i in n)if(n.hasOwnProperty(i)&&n[i]){var o=n[i];o="Array"===t.util.type(o)?o:[o];for(var s=0;s<o.length;++s){var u=o[s],g=u.inside,c=!!u.lookbehind,f=0,h=u.alias;u=u.pattern||u;for(var p=0;p<r.length;p++){var d=r[p];if(r.length>e.length)break e;if(!(d instanceof a)){u.lastIndex=0;var m=u.exec(d);if(m){c&&(f=m[1].length);var y=m.index-1+f,m=m[0].slice(f),v=m.length,k=y+v,b=d.slice(0,y+1),w=d.slice(k+1),P=[p,1];b&&P.push(b);var A=new a(i,g?t.tokenize(m,g):m,h);P.push(A),w&&P.push(w),Array.prototype.splice.apply(r,P)}}}}}return r},hooks:{all:{},add:function(e,n){var a=t.hooks.all;a[e]=a[e]||[],a[e].push(n)},run:function(e,n){var a=t.hooks.all[e];if(a&&a.length)for(var r,l=0;r=a[l++];)r(n)}}},n=t.Token=function(e,t,n){this.type=e,this.content=t,this.alias=n};if(n.stringify=function(e,a,r){if("string"==typeof e)return e;if("Array"===t.util.type(e))return e.map(function(t){return n.stringify(t,a,e)}).join("");var l={type:e.type,content:n.stringify(e.content,a,r),tag:"span",classes:["token",e.type],attributes:{},language:a,parent:r};if("comment"==l.type&&(l.attributes.spellcheck="true"),e.alias){var i="Array"===t.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}t.hooks.run("wrap",l);var o="";for(var s in l.attributes)o+=(o?" ":"")+s+'="'+(l.attributes[s]||"")+'"';return"<"+l.tag+' class="'+l.classes.join(" ")+'" '+o+">"+l.content+"</"+l.tag+">"},!_self.document)return _self.addEventListener?(_self.addEventListener("message",function(e){var n=JSON.parse(e.data),a=n.language,r=n.code,l=n.immediateClose;_self.postMessage(t.highlight(r,t.languages[a],a)),l&&_self.close()},!1),_self.Prism):_self.Prism;var a=document.getElementsByTagName("script");return a=a[a.length-1],a&&(t.filename=a.src,document.addEventListener&&!a.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); |
|---|
| 588 | </script> |
|---|
| 589 | <script type="text/javascript"> |
|---|
| 590 | Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:/(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/}; |
|---|
| 591 | </script> |
|---|
| 592 | <script type="text/javascript"> |
|---|
| 593 | Prism.languages.java=Prism.languages.extend("clike",{keyword:/\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/,number:/\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp\-]+\b|\b\d*\.?\d+(?:e[+-]?\d+)?[df]?\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|!=?|<<?=?|>>?>?=?|==?|&[&=]?|\|[|=]?|\*=?|\/=?|%=?|\^=?|[?:~])/m,lookbehind:!0}}); |
|---|
| 594 | </script> |
|---|
| 595 | </body> |
|---|
| 596 | |
|---|
| 597 | </html> |
|---|