访问控制模型浅析
前言在一个系统之中,对于权限的把控以及用户的认证可以说是非常的重要。笔者在以前开发的系统中也接触到了各种的对用户访问的控制模型,偶然刷到大佬的文章,特记下此文来进行探讨。
认证与授权认证在一个系统中,尤其是企业系统中,对用户的认证很重要。在企业系统中,用户通常分为外部用户和内部用户。这两者的认证通常也不相同,
外部用户可能更多使用的手机号、微信等方式来进行登录。登录进入之后,直接使用企业提供的应用即可,提供的也通常是统一权限。
内部用户使用诸如企业微信、企业邮箱、域账号等方式来进行登录。因为企业内部通常有许多的内部系统,比如OA、hr等系统。所以每个员工可能拥有着不同系统的使用权,同时各个系统内部可能还拥有自己的权限,比如经典的管理员以及普通用户。
授权/访问控制授权,也叫做访问控制,就是授予用户访问某个实体(资源,数据)的权限。因此一个好的访问控制模型就至关重要了。
访问控制模型访问控制列表ACL (Access Control Lists),访问控制列表。需要管理员为每个资源(客体)显式分配权限。
这是一种比较古老的权限控制机制,它是面向资源的访问控制模型。管理员为每个资源( ...
Markdown入门
Markdown的起源Markdown最早诞生于2004年,美国科技博主约翰·格鲁伯(John Gruber)希望「**用一种易读易写的纯文本格式写作,并可将其转换为有效的 XHTML (或HTML)**」,于是在 2004 年 3 月 19 日推出初代 Markdown,而在主要语法上其实有很大一部分是由格鲁伯和亚伦·斯沃茨(Aaron Swartz)共同合作制定。
Markdown的特点Markdown是一种轻量级的标记语言,完全由标点符号标签组成的纯文本。因此它并不复杂,通用的语法一共只有十多种,其目的是希望大家使用它撰写,并以纯文本形式原样发布,从而方便阅读、方便创作。其中,Markdown最重要的设计是可读性,也就是说这个语言可以直接在字面上的被阅读,而不用担心格式化指令标记的影响。
熟悉Markdown之后,写作效率能得到极大提升,而且它显然更适合阅读,不仅对于读者,对作者本人来说,也便于头脑清醒地进行持续的协作和修改。它的主要特点:
只需关注内容本身,无需操心样式,思路几乎不受影响,给写作带来极大便利
实时可视化展现,逻辑性更强,对作者和读者都有很大帮助
显示效果统一, ...
初识类图
前言UML可以算是软件开发人员的必修课了,其主要用来帮助我们阐明、展示、构建和记录软件系统。今天我们就来讲讲UML中的类图。
类图简介类图描述了系统中对象的类型(即类)以及它们之间存在的各种静态关系。
主要关系类图中存在六大关系,分别是依赖、泛化(继承)、实现、关联、聚合与组合。
依赖依赖关系,定义:只要在类中用到了对方,那么它们之间就存在依赖关系。如果没有对方,则编译不能通过。
依赖在类图中的表示如下图所示。
属于依赖关系的几种情况(以A类和B类举例说明):
A类中用到了B类
B类是A类的成员属性
B类作为A类的方法的返回类型
B类是A类方法中的参数类型
A类方法中用到B类
泛化泛化其实就是面向对象中的继承关系,它是依赖关系的特例。
泛化在类图中的表示如下图所示。
实现实现其实就是面向对象中的实现(类实现接口)关系,它是依赖关系的特例。
实现在类图中的表示如下图所示。
关联关联其实就是类与类之间的联系,它是依赖关系的特例。更细分可以分为一对一、一对多、多对多的关系,读者可以自行去深入了解。
关联在类图中的表示如下图所示。
聚合聚合关系是整体和部分之间的关系,特点是整体和部 ...
初识Markdown
引入Markdown是一种轻量级标记语言,创始人为约翰·格鲁伯(英语:John Gruber)。 它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档。这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。
由于Markdown的轻量化、易读易写特性,并且对于图片,图表、数学式都有支持,目前许多网站都广泛使用Markdown来撰写帮助文档或是用于论坛上发表消息。 如GitHub、Reddit、Diaspora、Stack Exchange、OpenStreetMap 、SourceForge、简书等,甚至还能被使用来撰写电子书。
推荐本地文本编辑器:Typora
下载地址:
Typora官网
PS:请读者在本地新建一个文件,将后缀名改为xxx.md,再用Typora打开
PS:以下皆为代码效果加实现语法
标题1# 标题
二级标题1## 二级标题
三级标题1### 三级标题
四级标题1#### 四级标题
PS:最多支持六级标题
字体Hello,World! 粗体
1**Hello,World! 粗体**
Hello,W ...
Linux上的springboot+vue项目部署
引言因为笔者最近编写的一个SpringBoot+Vue前后端分离项目需要上线,所以记下这篇文章。除了下面的SpringBoot和Vue的部分,项目设计的数据库例如MySQL、Redis都应该预先配置好,数据库的配置不在本文的讨论范围中。
SpringBoot部分JDK安装笔者这里采用的是JDK的简易安装,安装路径会在默认的/usr/lib/jvm中
1234567891011121314151617181920212223# 查询要安装jdk的版本:yum -y list java*# 这里选择1.8的x86_64,列表中的各版本差别读者可以自行查阅资料yum install -y java-1.8.0-openjdk.x86_64# 运行完成之后可以运行java命令看是否安装成功java -version# 查看环境是否配置,没有出现对应的路径就进行下面的配置echo $JAVA_HOME# 在安装成功之后还需要将java配置到环境中vi /etc/profile# 在文件最后加上如下的语句(不懂的读者建议直接原封不动复制加入末尾即可)JAVA_HOME=/usr/lib/jvmCL ...
Linux上的MySQL操作
引言Linux上的操作可以说是后台程序员的基本功之一,这次我们来讨论在Linux上的MySQL常用操作。
安装安装之前可以启动服务看本机是否已经安装过MySQL
1service mysqld start
删除操作不在本文的讨论内容中,如果服务启动成功或者提示服务已经启动,可以停止服务然后跳到下一步配置操作
1service mysqld stop
安装(yum命令自动从网上寻找mysql服务资源,下载至本地并完成安装,安装过程中无脑yes就行)
1yum -y install mysql-server
同时也可以采用自己下载安装包安装的方式,但是比较繁琐,本文不再讨论
配置my.cnf是linux系统中MySQL的配置文档,使用mysql --help | grep 'my.cnf'命令即可查看MySQL启动时读取配置文件的默认目录
123mysql --help | grep 'my.cnf' order of preference, my.cnf, $MYSQL_TCP_PORT,/etc/mys ...
敏感词替换
引入在笔者的项目中有一个对敏感词检测并替换的需求,这个需求应该算很常见的,而且也有很多的方式可以解决,主要的解决方式有这几种:
暴力匹配
KMP算法
Trie(字典树)
AC自动机
正则匹配
……
在本文及笔者的项目中采用了Trie的方式,其他的实现方式笔者感兴趣可以自行了解。采用Trie的优缺点如下:
优点:
节省了大量的字符存储空间和字符匹配时间
随着字典树不断完善,新增的分支会越来越少
缺点:
需要一段时间来构建字典树
效率还不是最优
下面我们来看看如何实现
TrieTrie也就是字典树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
在一般的设计中,要求Trie在结构设计中:
根节点不包含字符,除根节点外每一个节点都只包含一个字符
从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串
每个节点的所有子节点包含的字符都不相同。
...
模板方法模式
引入在之前的文章中我们介绍了常见的设计模式,今天我们来使用 Java 语言对模板方法模式进行具体实现举例。
实例在下面的例子中,我们使用模板方法模式来对子类共有的方法或者方法逻辑进行抽象,就像预先设计一个模板一样,下面采用抽象类来举例,但是采用接口也可以做到类似的效果(JDK8之后接口支持default方法),我们以游戏来作为例子(手动狗头):
模板抽象类1234567891011121314151617181920212223242526272829303132333435363738394041/** * 游戏模板 * * @author marx * @date 2022/03/21 */ static abstract class GameTemplate { /** * 开始 */ abstract void init(); /** * 玩 */ abstract void start(); ...
策略模式
引入在之前的文章中我们介绍了常见的设计模式,今天我们来使用 Java 语言对策略模式进行具体实现举例。
实例策略模式就像为各种情况设计对应的锦囊一样,锦囊可以任意使用,“军师”(编码者)也可以随时替换锦囊的内容。在下面的例子中,我们使用策略模式来对多个if-else的情况来进行优化。
原来的if-else此处用两数运算来举例,可以看到在原来的设计中,我们需要设立多个if-else分支。
12345678910111213141516171819202122232425262728293031private final static String ADD = "+";private final static String SUBTRACT = "-";private final static String MULTIPLY = "*";private final static String DIVIDE = "/";/** * 原来的解决流程 * * @param a 一个 ...
代理模式
引入在之前的文章中我们介绍了常见的设计模式,今天我们来使用 Java 语言对代理模式进行具体实现举例。
原理代理模式在不同语言的实现以及对应机制不太一样,所以在此对代理模式原理进行阐述。
实现目的:
代理模式意图提供一种代理以控制对这个对象的访问,在Spring当中的典型应用是AOP,在调用目标对象方法时,做前置、后置、异常等处理。
在Spring当中,代理模式的实现主要分为JDK动态代理和CGLIB动态代理。下面我们对他们分别来实验并比较。
被代理的接口及类123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263/** * 学生 * * @author marx * @date 2022/03/15 */interface Student { /** * 研究 */ void study(); /** * 打个招呼 */ default ...






