mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2025-07-15 14:04:41 +08:00
1、全面实现按登录用户动态加载按钮;
2、优化模块授权代码; 3、优化内部功能加载模块的权限控制,比如:拥有模块授权功能的用户给别人授权时,只能访问到自己拥有的模块;
This commit is contained in:
parent
35ef1a6e8b
commit
975632c81e
@ -50,9 +50,21 @@ namespace OpenAuth.App
|
||||
u =>
|
||||
(u.FirstId == user.Id && u.Key == "UserModule") ||
|
||||
(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>();
|
||||
|
||||
//模块菜单权限
|
||||
foreach (var module in loginVM.Modules)
|
||||
{
|
||||
module.Elements = _moduleElementRepository.Find(u => u.ModuleId == module.Id && elementIds.Contains( u.Id)).ToList();
|
||||
}
|
||||
|
||||
return loginVM;
|
||||
}
|
||||
|
||||
|
@ -106,5 +106,17 @@ namespace OpenAuth.App
|
||||
{
|
||||
_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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -107,14 +107,26 @@ namespace OpenAuth.App
|
||||
|
||||
/// <summary>
|
||||
/// 加载特定用户的模块
|
||||
/// TODO:这里会加载用户及用户角色的所有模块,“为用户分配模块”功能会给人一种混乱的感觉,但可以接受
|
||||
/// </summary>
|
||||
/// <param name="userId">The user unique identifier.</param>
|
||||
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 =
|
||||
_relevanceRepository.Find(u => u.FirstId == userId && u.Key == "UserModule")
|
||||
.Select(u => u.SecondId)
|
||||
.ToList();
|
||||
_relevanceRepository.Find(
|
||||
u =>
|
||||
(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>();
|
||||
return _repository.Find(u => moduleIds.Contains(u.Id)).ToList();
|
||||
}
|
||||
|
@ -32,14 +32,11 @@ namespace OpenAuth.Mvc.Controllers
|
||||
filterContext.Result = new RedirectResult("/Login/Index");
|
||||
return;
|
||||
}
|
||||
var controllername = Request.RequestContext.RouteData.Values["controller"].ToString().ToLower();
|
||||
|
||||
string url = Request.Url.LocalPath;
|
||||
if (url != "/"
|
||||
&& !url.Contains("Main")
|
||||
&& !url.Contains("Error")
|
||||
&& !url.Contains("Git"))
|
||||
if (controllername != "home") //主页控制器无需权限控制
|
||||
{
|
||||
var module = loginUser.Modules.FirstOrDefault(u => url.Contains(u.Url));
|
||||
var module = loginUser.Modules.FirstOrDefault(u => u.Url.ToLower().Contains(controllername));
|
||||
if (module == null)
|
||||
{
|
||||
filterContext.Result = new RedirectResult("/Login/Index");
|
||||
@ -47,9 +44,10 @@ namespace OpenAuth.Mvc.Controllers
|
||||
}
|
||||
else
|
||||
{
|
||||
ViewBag.Module = module;
|
||||
ViewBag.Module = module; //为View显示服务,主要是为了显示按钮
|
||||
}
|
||||
}
|
||||
|
||||
base.OnActionExecuting(filterContext);
|
||||
}
|
||||
}
|
||||
|
@ -15,6 +15,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Entity.Validation;
|
||||
using System.Linq;
|
||||
using System.Web.Mvc;
|
||||
using Infrastructure;
|
||||
using OpenAuth.App;
|
||||
@ -78,11 +79,55 @@ namespace OpenAuth.Mvc.Controllers
|
||||
ViewBag.RoleId = roleId;
|
||||
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));
|
||||
}
|
||||
#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
|
||||
}
|
||||
}
|
@ -4,6 +4,8 @@ using OpenAuth.Domain;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Web.Mvc;
|
||||
using Infrastructure.Helper;
|
||||
using OpenAuth.App.ViewModel;
|
||||
|
||||
namespace OpenAuth.Mvc.Controllers
|
||||
{
|
||||
@ -50,7 +52,7 @@ namespace OpenAuth.Mvc.Controllers
|
||||
/// </summary>
|
||||
public string LoadForTree()
|
||||
{
|
||||
var orgs = _app.LoadForTree();
|
||||
var orgs = SessionHelper.GetSessionUser<LoginUserVM>().Modules;
|
||||
//添加根节点
|
||||
orgs.Add(new Module
|
||||
{
|
||||
@ -70,7 +72,7 @@ namespace OpenAuth.Mvc.Controllers
|
||||
{
|
||||
Id = 0,
|
||||
ParentId = -1,
|
||||
Name = "已为用户分配的模块",
|
||||
Name = "用户可访问模块(包括角色所拥有的)",
|
||||
CascadeId = "0"
|
||||
});
|
||||
return JsonHelper.Instance.Serialize(orgs);
|
||||
|
@ -624,6 +624,7 @@
|
||||
<Content Include="Views\ModuleManager\LookupMultiForUser.cshtml" />
|
||||
<Content Include="Views\ModuleManager\LookupMultiForRole.cshtml" />
|
||||
<None Include="Views\Home\MenuHeader.cshtml" />
|
||||
<Content Include="Views\ModuleElementManager\AssignForUser.cshtml" />
|
||||
<None Include="Views\ModuleElementManager\Index.cshtml" />
|
||||
<Content Include="Views\ModuleElementManager\AssignForRole.cshtml" />
|
||||
<None Include="Views\OrgManager\AddOrg.cshtml" />
|
||||
|
@ -28,9 +28,7 @@
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
//获取勾选的值
|
||||
//column:为从0开始的列标识
|
||||
function getSelected(gridid, column) {
|
||||
function getDatagridRow(gridid) {
|
||||
var selected = $(gridid).data('selectedTrs');
|
||||
if (selected == null || selected.length == 0) {
|
||||
$(this).alertmsg('warn', '至少选择一个对象', {
|
||||
@ -39,6 +37,14 @@
|
||||
});
|
||||
return null;
|
||||
}
|
||||
return selected;
|
||||
}
|
||||
//获取勾选的值
|
||||
//column:为从0开始的列标识
|
||||
function getSelected(gridid, column) {
|
||||
|
||||
var selected = getDatagridRow(gridid);
|
||||
if (selected == null) return null;
|
||||
|
||||
//todo:下面这段只能chrome有效
|
||||
var records = new Array();
|
||||
@ -48,4 +54,17 @@
|
||||
|
||||
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>
|
@ -9,10 +9,10 @@
|
||||
<input style="display: none" id="roleId" value="@ViewBag.RoleId" />
|
||||
<div class="pull-right">
|
||||
<div class="alert alert-info search-inline">
|
||||
<i class="fa fa-info-circle"></i> 可多选统一授权
|
||||
<i class="fa fa-info-circle"></i> 点击行为单选,点击复选框可多选统一授权
|
||||
</div>
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
@ -70,7 +70,7 @@
|
||||
width: 80
|
||||
}
|
||||
],
|
||||
dataUrl: 'ModuleElementManager/Load?orgId=' + selectedId +'&roleId='+$('#roleId').val(),
|
||||
dataUrl: 'ModuleElementManager/LoadForRole?orgId=' + selectedId +'&roleId='+$('#roleId').val(),
|
||||
fullGrid: true,
|
||||
showLinenumber: true,
|
||||
showCheckboxcol: true,
|
||||
@ -102,7 +102,9 @@
|
||||
},
|
||||
callback: { onClick: zTreeOnClick }
|
||||
};
|
||||
$.getJSON('ModuleManager/LoadForTree', function (json) {
|
||||
$.getJSON('ModuleManager/LoadForRole',
|
||||
{ roleId: $('#roleId').val() },
|
||||
function (json) {
|
||||
var zTreeObj = $.fn.zTree.init($('#@_treeId'), setting, json);
|
||||
zTreeObj.expandAll(true);
|
||||
});
|
||||
@ -110,18 +112,17 @@
|
||||
|
||||
//授权选中的
|
||||
function assign() {
|
||||
var selected = getSelected(gridid, 2);
|
||||
var selected = getSelectedMany(gridid, 2);
|
||||
if (selected == null) return;
|
||||
|
||||
$(this).dialog({
|
||||
id: 'assign',
|
||||
url: '/ModuleManager/Add?id=' + selected,
|
||||
title: '编辑',
|
||||
onClose: function () {
|
||||
$.post("ModuleElementManager/AssignForRole",
|
||||
{
|
||||
roleId:$('#roleId').val(),
|
||||
menuIds: selected
|
||||
},
|
||||
function (data) {
|
||||
refreshGrid();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function refreshGrid() {
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var gridid = '#@_gridId';
|
||||
var selectedId = 0;
|
||||
$(document).ready(function () {
|
||||
initZtree();
|
||||
@ -31,7 +30,7 @@
|
||||
$('#@_treeDetail').empty()
|
||||
.append('<table id="@_gridId" class="table table-bordered table-hover table-striped table-top"></table>');
|
||||
|
||||
$(gridid).datagrid({
|
||||
$('#@_gridId').datagrid({
|
||||
showToolbar: false,
|
||||
filterThead: false,
|
||||
columns: [
|
||||
@ -129,7 +128,7 @@
|
||||
|
||||
//删除
|
||||
function del() {
|
||||
var selected = getSelected(gridid,2);
|
||||
var selected = getSelected('#@_gridId',2);
|
||||
if (selected == null) return;
|
||||
|
||||
$.get('ModuleManager/Delete?Id=' + selected, function (data) {
|
||||
@ -143,7 +142,7 @@
|
||||
|
||||
//自定义的编辑按钮
|
||||
function editModule() {
|
||||
var selected = getSelected(gridid,2);
|
||||
var selected = getSelected('#@_gridId',2);
|
||||
if (selected == null) return;
|
||||
|
||||
$(this).dialog({
|
||||
@ -159,13 +158,13 @@
|
||||
|
||||
//为模块分配按钮
|
||||
function assignButton() {
|
||||
var selected = getSelected(gridid,2);
|
||||
var selected = getSelected('#@_gridId',2);
|
||||
if (selected == null) return;
|
||||
|
||||
$(this).dialog({
|
||||
id: 'editDialog',
|
||||
width: 1000,
|
||||
height: 700,
|
||||
height: 500,
|
||||
mask:true,
|
||||
url: '/ModuleElementManager/Index?id=' + selected,
|
||||
title: '为模块分配按钮'
|
||||
|
@ -18,7 +18,6 @@
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
var gridid = '#@_gridId';
|
||||
var selectedId = 0;
|
||||
var grid;
|
||||
$(document).ready(function () {
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var gridid = '#@_gridId';
|
||||
var selectedId = 0;
|
||||
$(document).ready(function () {
|
||||
initZtree();
|
||||
@ -31,7 +30,7 @@
|
||||
$('#@_treeDetail').empty()
|
||||
.append('<table id="@_gridId" class="table table-bordered table-hover table-striped table-top"></table>');
|
||||
|
||||
$(gridid).datagrid({
|
||||
$('#@_gridId').datagrid({
|
||||
showToolbar:false,
|
||||
filterThead: false,
|
||||
columns: [
|
||||
@ -122,7 +121,7 @@
|
||||
|
||||
//删除
|
||||
function del() {
|
||||
var selected = getSelected(gridid, 2);
|
||||
var selected = getSelected('#@_gridId', 2);
|
||||
if (selected == null) return;
|
||||
|
||||
$.getJSON('RoleManager/Delete?Id=' + selected, function (data) {
|
||||
@ -136,7 +135,7 @@
|
||||
|
||||
//自定义的编辑按钮
|
||||
function editRole() {
|
||||
var selected = getSelected(gridid,2);
|
||||
var selected = getSelected('#@_gridId',2);
|
||||
if (selected == null) return;
|
||||
|
||||
$(this).dialog({
|
||||
@ -157,7 +156,7 @@
|
||||
//角色模块授权按钮
|
||||
function openModuleAccess(obj) {
|
||||
|
||||
var selected = getSelected(gridid,2);
|
||||
var selected = getSelected('#@_gridId',2);
|
||||
if (selected == null) return;
|
||||
|
||||
$(obj).dialog({
|
||||
@ -172,7 +171,7 @@
|
||||
|
||||
//为角色分配菜单
|
||||
function openAssignElement(obj) {
|
||||
var selected = getSelected(gridid, 2);
|
||||
var selected = getSelected('#@_gridId', 2);
|
||||
if (selected == null) return;
|
||||
|
||||
$(obj).dialog({
|
||||
|
@ -20,7 +20,6 @@
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
var gridid = '#@_gridId';
|
||||
var selectedId = 0;
|
||||
var grid;
|
||||
$(document).ready(function () {
|
||||
@ -33,7 +32,7 @@
|
||||
$('#@_treeDetail').empty()
|
||||
.append('<table id="@_gridId" class="table table-bordered table-hover table-striped table-top"></table>');
|
||||
|
||||
grid = $(gridid).datagrid({
|
||||
$('#@_gridId').datagrid({
|
||||
showToolbar: false,
|
||||
filterThead: false,
|
||||
columns: [
|
||||
@ -126,7 +125,7 @@
|
||||
|
||||
//删除
|
||||
function del() {
|
||||
var selected = getSelected(gridid,2);
|
||||
var selected = getSelected('#@_gridId', 2);
|
||||
if (selected == null) return;
|
||||
|
||||
$.getJSON('UserManager/Delete?Id=' + selected, function (data) {
|
||||
@ -140,7 +139,7 @@
|
||||
|
||||
//自定义的编辑按钮
|
||||
function editOrg() {
|
||||
var selected = getSelected(gridid,2);
|
||||
var selected = getSelected('#@_gridId', 2);
|
||||
if (selected == null) return;
|
||||
|
||||
$(this).dialog({
|
||||
@ -161,7 +160,7 @@
|
||||
//用户模块授权按钮
|
||||
function openModuleAccess(obj) {
|
||||
|
||||
var selected = getSelected(gridid,2);
|
||||
var selected = getSelected('#@_gridId', 2);
|
||||
if (selected == null) return;
|
||||
|
||||
$(obj).dialog({
|
||||
@ -176,7 +175,7 @@
|
||||
|
||||
//用户角色授权
|
||||
function openRoleAccess(obj) {
|
||||
var selected = getSelected(gridid,2);
|
||||
var selected = getSelected('#@_gridId', 2);
|
||||
if (selected == null) return;
|
||||
|
||||
$(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
|
||||
</script>
|
BIN
建表&初始化数据.sql
BIN
建表&初始化数据.sql
Binary file not shown.
Loading…
Reference in New Issue
Block a user