1、全面实现按登录用户动态加载按钮;

2、优化模块授权代码;
3、优化内部功能加载模块的权限控制,比如:拥有模块授权功能的用户给别人授权时,只能访问到自己拥有的模块;
This commit is contained in:
yubaolee 2015-12-07 15:22:01 +08:00
parent 35ef1a6e8b
commit 975632c81e
14 changed files with 165 additions and 53 deletions

View File

@ -50,9 +50,21 @@ namespace OpenAuth.App
u => u =>
(u.FirstId == user.Id && u.Key == "UserModule") || (u.FirstId == user.Id && u.Key == "UserModule") ||
(u.Key == "RoleModule" && userRoleIds.Contains(u.FirstId))).Select(u =>u.SecondId).ToList(); (u.Key == "RoleModule" && userRoleIds.Contains(u.FirstId))).Select(u =>u.SecondId).ToList();
//用户角色与自己分配到的菜单ID
var elementIds =
_relevanceRepository.Find(
u =>
(u.FirstId == user.Id && u.Key == "UserElement") ||
(u.Key == "RoleElement" && userRoleIds.Contains(u.FirstId))).Select(u => u.SecondId).ToList();
//得出最终用户拥有的模块 //得出最终用户拥有的模块
loginVM.Modules = _moduleRepository.Find(u => moduleIds.Contains(u.Id)).MapToList<ModuleView>(); loginVM.Modules = _moduleRepository.Find(u => moduleIds.Contains(u.Id)).MapToList<ModuleView>();
//模块菜单权限
foreach (var module in loginVM.Modules)
{
module.Elements = _moduleElementRepository.Find(u => u.ModuleId == module.Id && elementIds.Contains( u.Id)).ToList();
}
return loginVM; return loginVM;
} }

View File

@ -106,5 +106,17 @@ namespace OpenAuth.App
{ {
_repository.Delete(u =>u.Id ==id); _repository.Delete(u =>u.Id ==id);
} }
public void AssignForRole(int roleId, int[] menuIds)
{
_relevanceRepository.DeleteBy("RoleElement", roleId);
_relevanceRepository.AddRelevance("RoleElement", menuIds.ToLookup(u => roleId));
}
public void AssignForUser(int userId, int[] ids)
{
_relevanceRepository.DeleteBy("UserElement", userId);
_relevanceRepository.AddRelevance("UserElement", ids.ToLookup(u => userId));
}
} }
} }

View File

@ -107,14 +107,26 @@ namespace OpenAuth.App
/// <summary> /// <summary>
/// 加载特定用户的模块 /// 加载特定用户的模块
/// TODO:这里会加载用户及用户角色的所有模块,“为用户分配模块”功能会给人一种混乱的感觉,但可以接受
/// </summary> /// </summary>
/// <param name="userId">The user unique identifier.</param> /// <param name="userId">The user unique identifier.</param>
public List<Module> LoadForUser(int userId) public List<Module> LoadForUser(int userId)
{ {
//用户角色
var userRoleIds =
_relevanceRepository.Find(u => u.FirstId == userId && u.Key == "UserRole").Select(u => u.SecondId).ToList();
//用户角色与自己分配到的模块ID
var moduleIds = var moduleIds =
_relevanceRepository.Find(u => u.FirstId == userId && u.Key == "UserModule") _relevanceRepository.Find(
.Select(u => u.SecondId) u =>
.ToList(); (u.FirstId == userId && u.Key == "UserModule") ||
(u.Key == "RoleModule" && userRoleIds.Contains(u.FirstId))).Select(u => u.SecondId).ToList();
//var moduleIds =
// _relevanceRepository.Find(u => u.FirstId == userId && u.Key == "UserModule")
// .Select(u => u.SecondId)
// .ToList();
if (!moduleIds.Any()) return new List<Module>(); if (!moduleIds.Any()) return new List<Module>();
return _repository.Find(u => moduleIds.Contains(u.Id)).ToList(); return _repository.Find(u => moduleIds.Contains(u.Id)).ToList();
} }

View File

@ -32,14 +32,11 @@ namespace OpenAuth.Mvc.Controllers
filterContext.Result = new RedirectResult("/Login/Index"); filterContext.Result = new RedirectResult("/Login/Index");
return; return;
} }
var controllername = Request.RequestContext.RouteData.Values["controller"].ToString().ToLower();
string url = Request.Url.LocalPath; if (controllername != "home") //主页控制器无需权限控制
if (url != "/"
&& !url.Contains("Main")
&& !url.Contains("Error")
&& !url.Contains("Git"))
{ {
var module = loginUser.Modules.FirstOrDefault(u => url.Contains(u.Url)); var module = loginUser.Modules.FirstOrDefault(u => u.Url.ToLower().Contains(controllername));
if (module == null) if (module == null)
{ {
filterContext.Result = new RedirectResult("/Login/Index"); filterContext.Result = new RedirectResult("/Login/Index");
@ -47,9 +44,10 @@ namespace OpenAuth.Mvc.Controllers
} }
else else
{ {
ViewBag.Module = module; ViewBag.Module = module; //为View显示服务主要是为了显示按钮
} }
} }
base.OnActionExecuting(filterContext); base.OnActionExecuting(filterContext);
} }
} }

View File

@ -15,6 +15,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.Entity.Validation; using System.Data.Entity.Validation;
using System.Linq;
using System.Web.Mvc; using System.Web.Mvc;
using Infrastructure; using Infrastructure;
using OpenAuth.App; using OpenAuth.App;
@ -78,11 +79,55 @@ namespace OpenAuth.Mvc.Controllers
ViewBag.RoleId = roleId; ViewBag.RoleId = roleId;
return View(); return View();
} }
[HttpPost]
public string AssignForRole(int roleId, string menuIds)
{
try
{
var ids = menuIds.Split(',').Select(id => int.Parse(id)).ToArray();
_app.AssignForRole(roleId, ids);
}
catch (Exception e)
{
_bjuiResponse.statusCode = "300";
_bjuiResponse.message = e.Message;
}
return JsonHelper.Instance.Serialize(_bjuiResponse);
}
public string Load(int roleId, int orgId) public string LoadForRole(int roleId, int orgId)
{ {
return JsonHelper.Instance.Serialize(_app.LoadWithAccess("RoleElement", roleId, orgId)); return JsonHelper.Instance.Serialize(_app.LoadWithAccess("RoleElement", roleId, orgId));
} }
#endregion #endregion
#region
public ActionResult AssignForUser(int userId)
{
ViewBag.UserId = userId;
return View();
}
[HttpPost]
public string AssignForUser(int userId, string menuIds)
{
try
{
var ids = menuIds.Split(',').Select(id => int.Parse(id)).ToArray();
_app.AssignForUser(userId, ids);
}
catch (Exception e)
{
_bjuiResponse.statusCode = "300";
_bjuiResponse.message = e.Message;
}
return JsonHelper.Instance.Serialize(_bjuiResponse);
}
public string LoadForUser(int userId, int orgId)
{
return JsonHelper.Instance.Serialize(_app.LoadWithAccess("UserElement", userId, orgId));
}
#endregion
} }
} }

View File

@ -4,6 +4,8 @@ using OpenAuth.Domain;
using System; using System;
using System.Linq; using System.Linq;
using System.Web.Mvc; using System.Web.Mvc;
using Infrastructure.Helper;
using OpenAuth.App.ViewModel;
namespace OpenAuth.Mvc.Controllers namespace OpenAuth.Mvc.Controllers
{ {
@ -50,7 +52,7 @@ namespace OpenAuth.Mvc.Controllers
/// </summary> /// </summary>
public string LoadForTree() public string LoadForTree()
{ {
var orgs = _app.LoadForTree(); var orgs = SessionHelper.GetSessionUser<LoginUserVM>().Modules;
//添加根节点 //添加根节点
orgs.Add(new Module orgs.Add(new Module
{ {
@ -70,7 +72,7 @@ namespace OpenAuth.Mvc.Controllers
{ {
Id = 0, Id = 0,
ParentId = -1, ParentId = -1,
Name = "已为用户分配的模块", Name = "用户可访问模块(包括角色所拥有的)",
CascadeId = "0" CascadeId = "0"
}); });
return JsonHelper.Instance.Serialize(orgs); return JsonHelper.Instance.Serialize(orgs);

View File

@ -624,6 +624,7 @@
<Content Include="Views\ModuleManager\LookupMultiForUser.cshtml" /> <Content Include="Views\ModuleManager\LookupMultiForUser.cshtml" />
<Content Include="Views\ModuleManager\LookupMultiForRole.cshtml" /> <Content Include="Views\ModuleManager\LookupMultiForRole.cshtml" />
<None Include="Views\Home\MenuHeader.cshtml" /> <None Include="Views\Home\MenuHeader.cshtml" />
<Content Include="Views\ModuleElementManager\AssignForUser.cshtml" />
<None Include="Views\ModuleElementManager\Index.cshtml" /> <None Include="Views\ModuleElementManager\Index.cshtml" />
<Content Include="Views\ModuleElementManager\AssignForRole.cshtml" /> <Content Include="Views\ModuleElementManager\AssignForRole.cshtml" />
<None Include="Views\OrgManager\AddOrg.cshtml" /> <None Include="Views\OrgManager\AddOrg.cshtml" />

View File

@ -28,9 +28,7 @@
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
//获取勾选的值 function getDatagridRow(gridid) {
//column:为从0开始的列标识
function getSelected(gridid, column) {
var selected = $(gridid).data('selectedTrs'); var selected = $(gridid).data('selectedTrs');
if (selected == null || selected.length == 0) { if (selected == null || selected.length == 0) {
$(this).alertmsg('warn', '至少选择一个对象', { $(this).alertmsg('warn', '至少选择一个对象', {
@ -39,6 +37,14 @@
}); });
return null; return null;
} }
return selected;
}
//获取勾选的值
//column:为从0开始的列标识
function getSelected(gridid, column) {
var selected = getDatagridRow(gridid);
if (selected == null) return null;
//todo下面这段只能chrome有效 //todo下面这段只能chrome有效
var records = new Array(); var records = new Array();
@ -48,4 +54,17 @@
return records[0]; return records[0];
} }
//返回选择的多条记录,用逗号隔开
function getSelectedMany(gridid, column) {
var selected = getDatagridRow(gridid);
if (selected == null) return null;
//todo下面这段只能chrome有效
var results = '';
selected.each(function () {
results += ',' + this.children[column].innerText;
});
results = results.substr(1); //去掉第一个逗号
return results;
}
</script> </script>

View File

@ -9,10 +9,10 @@
<input style="display: none" id="roleId" value="@ViewBag.RoleId" /> <input style="display: none" id="roleId" value="@ViewBag.RoleId" />
<div class="pull-right"> <div class="pull-right">
<div class="alert alert-info search-inline"> <div class="alert alert-info search-inline">
<i class="fa fa-info-circle"></i> 可多选统一授权 <i class="fa fa-info-circle"></i> 点击行为单选,点击复选框可多选统一授权
</div>&nbsp; </div>&nbsp;
<button type="button" class="btn-green" data-num="1" data-icon="plus" data-toggle="assign"> <button type="button" class="btn-green" data-num="1" data-icon="plus" onclick="assign()">
授权选中 授权选中项目
</button>&nbsp; </button>&nbsp;
</div> </div>
</div> </div>
@ -70,7 +70,7 @@
width: 80 width: 80
} }
], ],
dataUrl: 'ModuleElementManager/Load?orgId=' + selectedId +'&roleId='+$('#roleId').val(), dataUrl: 'ModuleElementManager/LoadForRole?orgId=' + selectedId +'&roleId='+$('#roleId').val(),
fullGrid: true, fullGrid: true,
showLinenumber: true, showLinenumber: true,
showCheckboxcol: true, showCheckboxcol: true,
@ -102,7 +102,9 @@
}, },
callback: { onClick: zTreeOnClick } callback: { onClick: zTreeOnClick }
}; };
$.getJSON('ModuleManager/LoadForTree', function (json) { $.getJSON('ModuleManager/LoadForRole',
{ roleId: $('#roleId').val() },
function (json) {
var zTreeObj = $.fn.zTree.init($('#@_treeId'), setting, json); var zTreeObj = $.fn.zTree.init($('#@_treeId'), setting, json);
zTreeObj.expandAll(true); zTreeObj.expandAll(true);
}); });
@ -110,18 +112,17 @@
//授权选中的 //授权选中的
function assign() { function assign() {
var selected = getSelected(gridid, 2); var selected = getSelectedMany(gridid, 2);
if (selected == null) return; if (selected == null) return;
$(this).dialog({ $.post("ModuleElementManager/AssignForRole",
id: 'assign', {
url: '/ModuleManager/Add?id=' + selected, roleId:$('#roleId').val(),
title: '编辑', menuIds: selected
onClose: function () { },
refreshGrid(); function (data) {
} refreshGrid();
}); });
} }
function refreshGrid() { function refreshGrid() {

View File

@ -19,7 +19,6 @@
<script type="text/javascript"> <script type="text/javascript">
var gridid = '#@_gridId';
var selectedId = 0; var selectedId = 0;
$(document).ready(function () { $(document).ready(function () {
initZtree(); initZtree();
@ -31,7 +30,7 @@
$('#@_treeDetail').empty() $('#@_treeDetail').empty()
.append('<table id="@_gridId" class="table table-bordered table-hover table-striped table-top"></table>'); .append('<table id="@_gridId" class="table table-bordered table-hover table-striped table-top"></table>');
$(gridid).datagrid({ $('#@_gridId').datagrid({
showToolbar: false, showToolbar: false,
filterThead: false, filterThead: false,
columns: [ columns: [
@ -129,7 +128,7 @@
//删除 //删除
function del() { function del() {
var selected = getSelected(gridid,2); var selected = getSelected('#@_gridId',2);
if (selected == null) return; if (selected == null) return;
$.get('ModuleManager/Delete?Id=' + selected, function (data) { $.get('ModuleManager/Delete?Id=' + selected, function (data) {
@ -143,7 +142,7 @@
//自定义的编辑按钮 //自定义的编辑按钮
function editModule() { function editModule() {
var selected = getSelected(gridid,2); var selected = getSelected('#@_gridId',2);
if (selected == null) return; if (selected == null) return;
$(this).dialog({ $(this).dialog({
@ -159,13 +158,13 @@
//为模块分配按钮 //为模块分配按钮
function assignButton() { function assignButton() {
var selected = getSelected(gridid,2); var selected = getSelected('#@_gridId',2);
if (selected == null) return; if (selected == null) return;
$(this).dialog({ $(this).dialog({
id: 'editDialog', id: 'editDialog',
width: 1000, width: 1000,
height: 700, height: 500,
mask:true, mask:true,
url: '/ModuleElementManager/Index?id=' + selected, url: '/ModuleElementManager/Index?id=' + selected,
title: '为模块分配按钮' title: '为模块分配按钮'

View File

@ -18,7 +18,6 @@
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var gridid = '#@_gridId';
var selectedId = 0; var selectedId = 0;
var grid; var grid;
$(document).ready(function () { $(document).ready(function () {

View File

@ -19,7 +19,6 @@
<script type="text/javascript"> <script type="text/javascript">
var gridid = '#@_gridId';
var selectedId = 0; var selectedId = 0;
$(document).ready(function () { $(document).ready(function () {
initZtree(); initZtree();
@ -31,7 +30,7 @@
$('#@_treeDetail').empty() $('#@_treeDetail').empty()
.append('<table id="@_gridId" class="table table-bordered table-hover table-striped table-top"></table>'); .append('<table id="@_gridId" class="table table-bordered table-hover table-striped table-top"></table>');
$(gridid).datagrid({ $('#@_gridId').datagrid({
showToolbar:false, showToolbar:false,
filterThead: false, filterThead: false,
columns: [ columns: [
@ -122,7 +121,7 @@
//删除 //删除
function del() { function del() {
var selected = getSelected(gridid, 2); var selected = getSelected('#@_gridId', 2);
if (selected == null) return; if (selected == null) return;
$.getJSON('RoleManager/Delete?Id=' + selected, function (data) { $.getJSON('RoleManager/Delete?Id=' + selected, function (data) {
@ -136,7 +135,7 @@
//自定义的编辑按钮 //自定义的编辑按钮
function editRole() { function editRole() {
var selected = getSelected(gridid,2); var selected = getSelected('#@_gridId',2);
if (selected == null) return; if (selected == null) return;
$(this).dialog({ $(this).dialog({
@ -157,7 +156,7 @@
//角色模块授权按钮 //角色模块授权按钮
function openModuleAccess(obj) { function openModuleAccess(obj) {
var selected = getSelected(gridid,2); var selected = getSelected('#@_gridId',2);
if (selected == null) return; if (selected == null) return;
$(obj).dialog({ $(obj).dialog({
@ -172,7 +171,7 @@
//为角色分配菜单 //为角色分配菜单
function openAssignElement(obj) { function openAssignElement(obj) {
var selected = getSelected(gridid, 2); var selected = getSelected('#@_gridId', 2);
if (selected == null) return; if (selected == null) return;
$(obj).dialog({ $(obj).dialog({

View File

@ -20,7 +20,6 @@
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var gridid = '#@_gridId';
var selectedId = 0; var selectedId = 0;
var grid; var grid;
$(document).ready(function () { $(document).ready(function () {
@ -33,7 +32,7 @@
$('#@_treeDetail').empty() $('#@_treeDetail').empty()
.append('<table id="@_gridId" class="table table-bordered table-hover table-striped table-top"></table>'); .append('<table id="@_gridId" class="table table-bordered table-hover table-striped table-top"></table>');
grid = $(gridid).datagrid({ $('#@_gridId').datagrid({
showToolbar: false, showToolbar: false,
filterThead: false, filterThead: false,
columns: [ columns: [
@ -126,7 +125,7 @@
//删除 //删除
function del() { function del() {
var selected = getSelected(gridid,2); var selected = getSelected('#@_gridId', 2);
if (selected == null) return; if (selected == null) return;
$.getJSON('UserManager/Delete?Id=' + selected, function (data) { $.getJSON('UserManager/Delete?Id=' + selected, function (data) {
@ -140,7 +139,7 @@
//自定义的编辑按钮 //自定义的编辑按钮
function editOrg() { function editOrg() {
var selected = getSelected(gridid,2); var selected = getSelected('#@_gridId', 2);
if (selected == null) return; if (selected == null) return;
$(this).dialog({ $(this).dialog({
@ -161,7 +160,7 @@
//用户模块授权按钮 //用户模块授权按钮
function openModuleAccess(obj) { function openModuleAccess(obj) {
var selected = getSelected(gridid,2); var selected = getSelected('#@_gridId', 2);
if (selected == null) return; if (selected == null) return;
$(obj).dialog({ $(obj).dialog({
@ -176,7 +175,7 @@
//用户角色授权 //用户角色授权
function openRoleAccess(obj) { function openRoleAccess(obj) {
var selected = getSelected(gridid,2); var selected = getSelected('#@_gridId', 2);
if (selected == null) return; if (selected == null) return;
$(obj).dialog({ $(obj).dialog({
@ -188,5 +187,19 @@
} }
}); });
} }
//为角色分配菜单
function openAssignElement(obj) {
var selected = getSelected('#@_gridId', 2);
if (selected == null) return;
$(obj).dialog({
id: 'assignElement',
url: '/ModuleElementManager/AssignForUser?userId=' + selected,
title: '为用户分配菜单',
width: 700,
height: 380
});
}
//@@ sourceURL=userManagerIndex.js //@@ sourceURL=userManagerIndex.js
</script> </script>

Binary file not shown.