OpenAuth.net
基于DDDLite的权限管理OpenAuth.net 1.0版正式发布
距离上一篇OpenAuth.net的文章已经有5个多月了,在这段时间里项目得到了很多朋友的认可,开源中国上面的Star数接近300,于是坚定了我做下去的信心。最近稍微清闲点,正式推出1.0版,并在阿里云上部署了一个在线演示(文章结尾处给出在线演示链接)。相比刚开始时的版本,现在整个架构已经稳定,系统功能性,代码可读性维护性都有质的飞跃。
本文主要介绍系统结构及未来一段时间的开发计划。
项目简介
本项目采用经典DDD架构(用沃恩.弗农大神的话,其实这是DDD-Lite)思想进行开发的一套符合国情的基于用户和角色的RBAC系统,系统的产生原因及与众不同的地方可以参考:领域驱动设计实战—基于DDDLite的权限管理OpenAuth.net,这里就不过多介绍。项目地址:
https://git.oschina.net/yubaolee/OpenAuth.Net
演示地址在文章结尾处给出:)
当前项目功能:
- 模块权限 实现模块的自定义及权限分配;
- 菜单权限 实现菜单的自定义及权限分配;
- 资源权限 实现资源的自定义及权限分配,主要是为了给第三方应用提供服务;
- 实现用户分配角色,也可以直接给用户分配模块/菜单;
- 基于ASP.NET Identity登录;
- 实现一个简单的进出库管理的例子,在例子中使用admin,test登录或直接以“开发者账号”登录,看到的结果是不同的;
项目这一年里都发生了什么?
准确的说应该是5个月来发生了什么,因为项目正式发布刚刚5个多月的时间。最高兴的应该是入选了:开源中国2015 年度新增开源软件排名 TOP 100 在新入选的5977个项目中位列第69。也算为C#那可怜的开源份额做点贡献了!
系统架构
首先到底什么是经典DDD架构?
DDD:领域驱动设计,以领域业务为核心的设计。什么?这是屁话,很多书上都介绍过?
那我就从代码的角度来解释就是:丫就是你的XXXBLL模块不要引用诸如XXXDAL/XXXHELPER等模块并且能够实现系统的业务逻辑,基本就是了。如下图:
基于上面的结构创建本项目。所有的依赖关系在界面OpenAuth.Mvc项目中由AutoFac进行IOC控制,如下图:
OpenAuth.Domain 系统领域层,当前领域层主要有下面三部分组成:
- 领域对象:系统核心对象;
- 领域接口:当前主要是数据库访问的仓储接口,具体的实现在OpenAuth.Repository中实现;
- 领域服务:系统的多对象交互业务处理。由于当前的业务复杂度比较低,业务主要是以领域服务的形式出现。如项目中的“进出库管理服务”:
- using System;
- using System.Linq;
- using System.Linq.Expressions;
- using OpenAuth.Domain.Interface;
- namespace OpenAuth.Domain.Service
- {
- /// <summary>
- /// 领域服务
- /// <para>进出库管理服务</para>
- /// </summary>
- public class StockManagerService
- {
- private IStockRepository _repository;
- private IOrgRepository _orgRepository;
- private AuthoriseService _authoriseService;
- public StockManagerService(IStockRepository repository,
- IOrgRepository orgRepository, AuthoriseService service)
- {
- _repository = repository;
- _orgRepository = orgRepository;
- _authoriseService = service;
- }
- /// <summary>
- /// 根据部门ID得到进出库信息
- /// </summary>
- public dynamic Load(string username, int orgId, int pageindex, int pagesize)
- {
- _authoriseService.GetUserAccessed(username);
- if (_authoriseService.Orgs.Count == 0) //用户没有任何可见机构
- {
- return new
- {
- total = 0,
- pageCurrent = pageindex
- };
- }
- var orgIds = _authoriseService.Orgs.Select(u => u.Id).ToArray(); //用户可访问的机构ID
- var orgs = _orgRepository.GetSubWithOwn(orgId) //点击的节点与用户可访问的机构合并
- .Where(u => orgIds.Contains(u.Id))
- .Select(u => u.Id).ToArray();
- var keys = _authoriseService.Resources.Select(r => r.Key); //用户可访问的资源的KEY列表
- //由于库存Stock表开始没有设计资源有关的字段,暂时用User字段代替
- Expression<Func<Stock, bool>> exp = u => orgs.Contains(u.OrgId) && (u.User == "" || keys.Contains(u.User));
- var stocks = _repository.Find(pageindex, pagesize, "", exp);
- int total = _repository.GetCount(exp);
- return new
- {
- total = total,
- list = stocks,
- pageCurrent = pageindex
- };
- }
- public Stock Find(int id)
- {
- var stock = _repository.FindSingle(u => u.Id == id);
- if (stock == null) return new Stock();
- return stock;
- }
- public void Delete(int id)
- {
- _repository.Delete(id);
- }
- public void AddOrUpdate(Stock stock)
- {
- if (stock.Id == 0)
- {
- _repository.Add(stock);
- }
- else
- {
- _repository.Update(stock);
- }
- }
- }
- }
OpenAuth.Repository 系统仓储层,实现领域模型中定义的接口
OpenAuth.App 应用层,为界面提供接口
OpenAuth.Mvc 采用基于jquery与bootstrap的B-JUI界面,1.0版中全面实现HTML,javascript,MVC后端代码的分离。如进出库管理加载的执行流程如下:
OpenAuth.UnitTest 单元测试
Infrastructure 与项目无关的通用工具集合
近期规划
功能:
5月份完成权限继承机制;
6月份增加完整的自定义流程事例;
性能:
添加完成的缓存机制;
结构:
根据反馈情况,把结构向真正的DDD方向调整。实现CQRS,适当时候添加AES等机制;
在线演示
在线地址:http://115.28.10.123:1314 (为安全起见,关闭了部分POST请求,如确实有演示修改的请求请留言)
首次发布QQ群:484498493
OpenAuth.net的更多相关文章
- 基于DDDLite的权限管理OpenAuth.net 1.0版正式发布
距离上一篇OpenAuth.net的文章已经有5个多月了,在这段时间里项目得到了很多朋友的认可,开源中国上面的Star数接近300,于是坚定了我做下去的信心.最近稍微清闲点,正式推出1.0版,并在阿里 ...
- 领域驱动设计实战—基于DDDLite的权限管理OpenAuth.net
在园子里面,搜索一下“权限管理”至少能得到上千条的有效记录.记得刚开始工作的时候,写个通用的权限系统一直是自己的一个梦想.中间因为工作忙(其实就是懒!)等原因,被无限期搁置了.最近想想,自己写东西时, ...
- 关于OpenAuth.Net被攻击的感想
距离上次写博客应该是1年多以前的事情了,看过我博客的人都知道,我从来不在博客园发技术无关的贴子,除了上次离职.但这次我是实在忍不住了. 今天我个人开源项目OpenAuth.Net发布了最新版(有兴趣戳 ...
- 千星项目.Net Core 2.1移植填坑记--OpenAuth.Core诞生
背景 很早就有把OpenAuth.Net----最好用的.net权限管理工作流框架(好吧!我在吹牛
- OpenAuth.Net.landv分支之旅开始制作CRM系统
OpenAuth.Net.landv分支之旅开始制作CRM系统 这个事件的由来是因为没有一个统一的会员卡平台系统,目前需要连接三家酒店会员系统,由于三家酒店使用了三种酒店管理系统,彼此之间的耦合低.三 ...
- 细说SSO单点登录
什么是SSO? 如果你已知道,请略过本节! SSO核心意义就一句话:一处登录,处处登录:一处注销,处处注销.即:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 很多人容易把SS ...
- 基于DotNetOpenAuth的OAuth实现示例代码: 获取access token
1. 场景 根据OAuth 2.0规范,该场景发生于下面的流程图中的(D)(E)节点,根据已经得到的authorization code获取access token. 2. 实现环境 DotNetOp ...
- 新浪微博.Net SDK第三版源代码和示例【最后一次更新了】
时间过得飞快,距离上次SDK更新已经3年有余.随着官方的不断跟新,老版SDK的部分接口已经不能正常使用.因此在QQ群里来吐槽的.来谩骂的朋友也开始多了起来.随着时代的发展,微博已经彻底的被微信甩开,因 ...
- Open Auth辅助库(使用ImitateLogin实现登录)
网络上越来越多的公司进行着自己的平台化策略,其中绝大多数都已Web API的方式对外提供服务,为了方便的使用这些服务,你不得不引用许多相关的类库,但是API的本质其实仅仅是一些约定的网络请求,我们大多 ...
随机推荐
- ActiveMQ消息队列介绍(转)
ActiveMQ是一个开源兼容Java Message Service (JMS) 1.1面向消息的中件间. 来自Apache Software Foundation. ActiveMQ提供松耦合的应 ...
- Android中获取网页表单中的数据
MainActivity如下: package cn.testjavascript; import java.util.StringTokenizer; import android.os.Bundl ...
- Stack栈的三种含义
理解stack栈对于理解程序的执行至关重要.easy混淆的是,这个词事实上有三种含义,适用于不同的场合,必须加以区分. 含义一:数据结构 stack的第一种含义是一组数据的存放方式,特点为LIFO,即 ...
- asp.net下利用MVC模式实现Extjs表格增删改查
在网上看到有很多人写extjs下的表格控件的增删改查,但是大多数都是直接从后台读取数据,很少有跟数据库进行交互的模式. 今天就来写一个这样的例子.欢迎大家交流指正. 首先简单介绍一下MVC模式,MVC ...
- Google用户登录界面 Android实现
实验效果: 项目目录: Java代码(放在Src文件下) package com.bn.chap9.login; import java.io.BufferedReader; import java. ...
- Android Folding View(折叠视图、控件)
版本号:1.0 日期:2014.4.21 版权:© 2014 kince 转载注明出处 非常早之前看过有人求助以下这个效果是怎样实现的, 也就是側滑菜单的一个折叠效果,事实上关于这个效果的实现,谷 ...
- hbulider mui框架
1.webview http://www.dcloud.io/docs/api/zh_cn/webview.shtml#plus.webview.WebviewStyle http://www.dcl ...
- android在其他线程中访问UI线程的方法
1.Activity.runOnUiThread( Runnable ) 2.View.post( Runnable ) 3.View.postDelayed( Runnable, long ) 4. ...
- Java基础:泛型及其擦除性、不可协变性
转载请注明出处:jiq•钦's technical Blog 1泛型语法: 泛型类: class ClassName<T>{} 泛型方法:public <T> void f(T ...
- unity3d游戏开发学习之使用3dmax创建导弹模型
在着手研究Unity3D的游戏开发时,3D模型能够考虑从unity的assets store去获取,也能够从网上搜索下载,同一时候咱们也能够尝试下自己动手去做一些简单的模型. 这里就依据unity3d ...