2023年3月

1.1
搭建环境

1.1.1
数据库

mysql5.1
数据库中创建表:用户表、角色表、权限表
(
实质上是权限和资源的结合
)
、用户角色表、角色权限表。

完成权限管理的数据模型创建。

1.1.2
开发环境

jdk1.7.0_72

eclipse 3.7 indigo

技术架构:
springmvc+mybatis+jquery easyui

1.1.3
系统工程架构

springmvc+mybatis+jquery easyui

1.1.4
系统登陆

系统
登陆相当
于用户身份认证,用户成功,要在
session
中记录用户的身份信息
.

操作流程:

用户进行登陆页面

输入用户名和密码进行登陆

进行用户名和密码校验

如果校验通过,在
session
记录用户身份信息

1.1.1.1
用户的身份信息

创建专门类用于记录用户身份信息。

1.1.1.2
mapper

mapper
接口: 根据用户账号查询用户(
sys_user
)信息(使用逆向工程生成的
mapper

使用逆向工程生成以下表的基础代码:

1.1.1.3
service
(进行用户名和密码校验)

接口功能:根据用户的身份和密码
进行认证,如果认证通过,返回用户身份信息

认证过程:

根据用户身份(账号)查询数据库,如果查询不到用户不存在

对输入的密码
和数据库密码
进行比对,如果一致,认证通过

1.1.1.4
controller
(记录
session

1.1.1
用户认证拦截器

1.1.1.1
anonymousURL.properties

配置可以匿名访问的
url

1.1.1.2
编写认证拦截器

//用于用户认证校验、用户权限校验
@Overridepublic booleanpreHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throwsException {//得到请求的url String url =request.getRequestURI();//判断是否是公开 地址//实际开发中需要公开 地址配置在配置文件中//从配置中取逆名访问url List<String> open_urls = ResourcesUtil.gekeyList("anonymousURL");//遍历公开 地址,如果是公开 地址则放行 for(String open_url:open_urls){if(url.indexOf(open_url)>=0){//如果是公开 地址则放行 return true;
}
}
//判断用户身份在session中是否存在 HttpSession session =request.getSession();
ActiveUser activeUser
= (ActiveUser) session.getAttribute("activeUser");//如果用户身份在session中存在放行 if(activeUser!=null){return true;
}
//执行到这里拦截,跳转到登陆页面,用户进行身份认证 request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);//如果返回false表示拦截不继续执行handler,如果返回true表示放行 return false;
}

1.1.1.3
配置拦截器


springmvc.xml
中配置拦截器

1.1.2
授权

1.1.2.1
commonURL.properties

在此配置文件配置公用访问地址,公用访问地址只要通过用户认证,不需要对公用访问地址分配权限即可访问。

1.1.2.2
获取用户权限范围的菜单

思路:

在用户认证时,认证通过,根据用户
id
从数据库获取用户权限范围的菜单,将菜单的集合存储在
session
中。

mapper
接口:根据用户
id
查询用户权限的菜单

service
接口:根据用户
id
查询用户权限的菜单

1.1.2.3
获取用户权限范围的
url

思路:

在用户认证时,认证通过,根据用户
id
从数据库获取用户权限范围的
url
,将
url
的集合存储在
session
中。

mapper
接口:根据用户
id
查询用户权限的
url

service
接口:根据用户
id
查询用户权限的
url

1.1.2.4
用户认证通过取出菜单和
url
放入
session

修改
service
认证代码:

1.1.2.5
菜单动态显示

修改
first.jsp
,动态从
session
中取出菜单显示:

1.1.2.6
授权拦截器

//在执行handler之前来执行的//用于用户认证校验、用户权限校验
@Overridepublic booleanpreHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throwsException {//得到请求的url String url =request.getRequestURI();//判断是否是公开 地址//实际开发中需要公开 地址配置在配置文件中//从配置中取逆名访问url List<String> open_urls = ResourcesUtil.gekeyList("anonymousURL");//遍历公开 地址,如果是公开 地址则放行 for(String open_url:open_urls){if(url.indexOf(open_url)>=0){//如果是公开 地址则放行 return true;
}
}
//从配置文件中获取公共访问地址 List<String> common_urls = ResourcesUtil.gekeyList("commonURL");//遍历公用 地址,如果是公用 地址则放行 for(String common_url:common_urls){if(url.indexOf(common_url)>=0){//如果是公开 地址则放行 return true;
}
}
//获取session HttpSession session =request.getSession();
ActiveUser activeUser
= (ActiveUser) session.getAttribute("activeUser");//从session中取权限范围的url List<SysPermission> permissions =activeUser.getPermissions();for(SysPermission sysPermission:permissions){//权限的url String permission_url =sysPermission.getUrl();if(url.indexOf(permission_url)>=0){//如果是权限的url 地址则放行 return true;
}
}
//执行到这里拦截,跳转到无权访问的提示页面 request.getRequestDispatcher("/WEB-INF/jsp/refuse.jsp").forward(request, response);//如果返回false表示拦截不继续执行handler,如果返回true表示放行 return false;
}

1.1.2.7
配置授权拦截器

注意:将授权拦截器配置在用户认证拦截的下边。

1.1
小结

只保护到菜单,页面里面的
操作没有权限管控,那么有人直接在浏览器输入这个地址即可进入这个页面。

使用基于
url
拦截的权限管理方式,实现起来比较简单,不依赖框架

不用
spring
的拦截器也可以

,使用
web
提供
filter
就可以实现。
目前也是基于资源,但是不够细。

问题:

需要将所有的
url
全部配置起来,有些繁琐,不易维护,
url(
资源
)
和权限表示方式不规范。

1.1
什么是
shiro

shiro

apache
的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权。

spring
中有
spring security (
原名
Acegi)
,是一个权限框架,它和
spring
依赖过于紧密,没有
shiro
使用简单。

shiro
不依赖于
spring

shiro
不仅可以实现
web
应用的权限管理,还可以实现
c/s
系统,分布式系统权限管理,
shiro
属于轻量框架,越来越多企业项目开始使用
shiro

使用
shiro
实现系统 的权限管理,有效提高开发效率,从而降低开发成本。

1.2
shiro
架构

subject
:主体,可以是用户也可以是程序,主体要访问系统,系统需要对主体进行认证、授权。

securityManager
:安全管理器,主体进行认证和授权都 是通过
securityManager
进行。

authenticator
:认证器,主体进行认证最终通过
authenticator
进行的。

authorizer
:授权器,主体进行授权最终通过
authorizer
进行的。

sessionManager

web
应用中一般是用
web
容器对
session
进行管理,
shiro
也提供一套
session
管理的方式。

SessionDao
:  通过
SessionDao
管理
session
数据,针对个性化的
session
数据存储需要使用
sessionDao

cache Manager
:缓存管理器,主要对
session
和授权数据进行缓存,比如将授权数据通过
cacheManager
进行缓存管理,和
ehcache
整合对缓存数据进行管理。

realm
:域,领域,相当于数据源,通过
realm
存取认证、授权相关数据。

注意:在
realm
中存储授权和认证的逻辑。

cryptography

密码管理,提供了一套加密
/
解密的组件,方便开发。比如提供常用的散列、加
/
解密等功能。

比如
md5散列算法。

1.3
jar

与其它
java
开源框架类似,将
shiro

jar
包加入项目就可以使用
shiro
提供的功能了。
shiro-core
是核心包必须选用,还提供了与
web
整合的
shiro-web


spring
整合的
shiro-spring
、与任务调度
quartz
整合的
shiro-quartz
等,下边是
shiro

jar
包的
maven
坐标。

<dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-web</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-ehcache</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-quartz</artifactId>
            <version>1.2.3</version>
        </dependency>

也可以通过引入shiro-all包括shiro所有的包:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.2.3</version>
</dependency>


参考lib目录 :

1
shiro
认证

1.1
shiro
认证流程

1.2
shiro
入门程序工程 环境

jar
包:
shiro-core.jar

工程结构:

1.3
shiro
认证入门程序

1.3.1
shiro-first.ini

通过此配置文件创建
securityManager
工厂。

需要修改
eclipse

ini
的编辑器
:

配置数据:

1.1.1
入门程序代码

//用户登陆和退出
@Testpublic voidtestLoginAndLogout() {//创建securityManager工厂,通过ini配置文件创建securityManager工厂
        Factory<SecurityManager> factory = newIniSecurityManagerFactory("classpath:shiro-first.ini");//创建SecurityManager
        SecurityManager securityManager =factory.getInstance();//将securityManager设置当前的运行环境中
SecurityUtils.setSecurityManager(securityManager);//从SecurityUtils里边创建一个subject
        Subject subject =SecurityUtils.getSubject();//在认证提交前准备token(令牌)
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "666666666666");try{//执行认证提交
subject.login(token);
}
catch(AuthenticationException e) {//TODO Auto-generated catch block e.printStackTrace();
}
//是否认证通过 boolean isAuthenticated =subject.isAuthenticated();

System.out.println(
"是否认证通过:" +isAuthenticated);//退出操作 subject.logout();//是否认证通过 isAuthenticated =subject.isAuthenticated();

System.out.println(
"是否认证通过:" +isAuthenticated);



}

1.1.1
执行流程

1
、通过
ini
配置文件创建
securityManager

2
、调用
subject.login
方法主体提交认证,提交的
token

3

securityManager进行认证,securityManager最终由ModularRealmAuthenticator进行认证。

4

ModularRealmAuthenticator调用IniRealm(

realm
传入
token)

ini
配置文件中查询用户信息

5

IniRealm
根据输入的
token

UsernamePasswordToken
)从
shiro-first.ini
查询用户信息,根据账号查询用户信息(账号和密码)

如果查询到用户信息,就给ModularRealmAuthenticator返回用户信息(账号和密码)

如果查询不到,就给ModularRealmAuthenticator
返回
null

6

ModularRealmAuthenticator接收IniRealm返回Authentication
认证信息

如果返回的认证信息是
null

ModularRealmAuthenticator抛出异常(
org.apache.shiro.authc.UnknownAccountException

如果返回的认证信息不是
null
(说明
inirealm
找到了用户),对
IniRealm
返回用户密码
(在
ini
文件中存在)和
token
中的密码 进行对比,如果不一致抛出异常(
org.apache.shiro.authc.IncorrectCredentialsException

个人解释一下上面说的:
securityManager最终由ModularRealmAuthenticator进行认证 《== 为什么是它认证

Ctrl+ T
查看
Authenticator
接口的超类型 层次结构。如下:

上图中会跑到
AuthenticatingSecurityManager
认证实现类,类里面有个属性
是由
ModularRealmAuthenticator创建的,

用接口authenticator
来引用

1.1.2
小结:

ModularRealmAuthenticator
作用进行认证,需要调用
realm
查询用户信息(在数据库中存在用户信息)

ModularRealmAuthenticator进
行密码对比
(认证过程)。

realm
:需要根据
token
中的身份信息去查询数据库(入门程序使用
ini
配置文件),如果查到用户返回认证信息,如果查询不到返回
null

1.1
自定义
realm

将来实际开发需要
realm
从数据库中查询用户信息。

1.1.1
realm
接口

1.1.1
自定义
realm

packagecn.itcast.shiro.realm;importjava.util.ArrayList;importjava.util.List;importorg.apache.shiro.authc.AuthenticationException;importorg.apache.shiro.authc.AuthenticationInfo;importorg.apache.shiro.authc.AuthenticationToken;importorg.apache.shiro.authc.SimpleAuthenticationInfo;importorg.apache.shiro.authz.AuthorizationInfo;importorg.apache.shiro.authz.SimpleAuthorizationInfo;importorg.apache.shiro.realm.AuthorizingRealm;importorg.apache.shiro.subject.PrincipalCollection;/*** 
* <p>
* Title: CustomRealm
* </p>
* <p>
* Description:自定义realm
* </p>
* <p>
* Company: www.itcast.com
* </p>
*
*
@author传智.燕青
* @date 2015-3-23下午4:54:47
*
@version1.0*/ public class CustomRealm extendsAuthorizingRealm {//设置realm的名称 @Overridepublic voidsetName(String name) {super.setName("customRealm");
}
//用于认证 @OverrideprotectedAuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token)
throwsAuthenticationException {//token是用户输入的//第一步从token中取出身份信息 String userCode =(String) token.getPrincipal();//第二步:根据用户输入的userCode从数据库查询//....//如果查询不到返回null//数据库中用户账号是zhangsansan /*if(!userCode.equals("zhangsansan")){//
return null;
}
*/ //模拟从数据库查询到密码 String password = "666666666666";//如果查询到返回认证信息AuthenticationInfo SimpleAuthenticationInfo simpleAuthenticationInfo= newSimpleAuthenticationInfo(
userCode, password,
this.getName());returnsimpleAuthenticationInfo;
}
//用于授权 @OverrideprotectedAuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
//从 principals获取主身份信息//将getPrimaryPrincipal方法返回值转为真实身份类型(在上边的doGetAuthenticationInfo认证通过填充到SimpleAuthenticationInfo中身份类型), String userCode =(String) principals.getPrimaryPrincipal();//根据身份信息获取权限信息//连接数据库...//模拟从数据库获取到数据 List<String> permissions = new ArrayList<String>();
permissions.add(
"user:create");//用户的创建 permissions.add("items:add");//商品添加权限//....//查到权限数据,返回授权信息(要包括 上边的permissions) SimpleAuthorizationInfo simpleAuthorizationInfo = newSimpleAuthorizationInfo();//将上边查询到授权信息填充到simpleAuthorizationInfo对象中 simpleAuthorizationInfo.addStringPermissions(permissions);returnsimpleAuthorizationInfo;
}

}

1.1.1
配置
realm

需要在
shiro-realm.ini
配置
realm
注入到
securityManager
中。

1.1.2
测试

同上边的入门程序,需要更改
ini
配置文件路径:

Factory<SecurityManager> factory =
new
IniSecurityManagerFactory("classpath:shiro-realm.ini");

1.1
散列算法

通常需要对密码
进行散列,常用的有
md5

sha


md5
密码,如果知道散列后的值可以通过穷举算法,得到
md5
密码对应的明文。

建议对
md5
进行散列时加
salt
(盐),进行加密相当 于对原始密码
+
盐进行散列。

正常使用时散列方法:

在程序中对原始密码
+
盐进行散列,将散列值存储到数据库中,并且还要将盐也要存储在数据库中。

如果进行密码对比时,使用相同
方法,将原始密码
+
盐进行散列,进行比对。

1.1.1
md5
散列测试程序:

1.1.1
自定义
realm
支持散列算法

需求:实际开发时
realm
要进行
md5
值(明文散列后的值)的对比。

1.1.1.1
新建
realm(CustomRealmMd5)


realm
中配置凭证匹配器

第八章 拦截器机制——《跟我学Shiro》 - 开涛的博客—公众号:kaitao-1234567,一如既往的干货分享 - ITeye博客
http://jinnianshilongnian.iteye.com/blog/2025656

jinnianshilongnian的博客 - 跟我学Shiro分类文章列表 - ITeye技术网站
http://jinnianshilongnian.iteye.com/category/305053

可以看到很多东西,比如 :Application Server 都这么类型

============

===== 2017年11月10日14:25:30

原来是这样注册的,号称最简单的

2017年11月10日14:41:34  提示到期了,

网上找:激活到2099年,牛逼--怕文章失效,摘抄在下方;jar包已经上传本博客的文件中

IntelliJ IDEA下载-破解
http://www.itmayun.com/it/files/1/article/645855999527987/1.html

1.首先,下载IDEA安装包(版本2017.1.2)
2.接着进行安装。
3.然后下载一个 JetbrainsCrack-2.6.2.jar 破解补丁。
下载链接:JetbrainsCrack-2.6.2.jar 备用地址下载
把补丁放在你的安装idea下面的bin的目录下面(如图)。
我的是F:\idea\IntelliJ IDEA 2017.1\bin
4. 在安装的idea下面的bin目录下面有2个文件 : 一个是idea64.exe.vmoptions,还有一个是idea.exe.vmoptions(如上图篮框)。
用记事本打开 分别在最下面一行增加一行:
-javaagent:F:\idea\IntelliJ IDEA 2017.1\bin\JetbrainsCrack-2.6.2.jar
"F:\idea\IntelliJ IDEA 2017.1\bin\JetbrainsCrack-2.6.2.jar"是对应的JetbrainsCrack-2.6.2.jar的位置。
5.重启一下软件,在进入出现有activation code选择界面的时候 写入下面注册代码:(到2099年到期)
查看复制打印?
ThisCrackLicenseId-
{"licenseId":"ThisCrackLicenseId",
"licenseeName":"idea",
"assigneeName":"",
"assigneeEmail":"idea@163.com",
"licenseRestriction":"For This Crack, Only Test! Please support genuine!!!",
"checkConcurrentUse":false,
"products":[
{"code":"II","paidUpTo":"2099-12-31"
},{"code":"DM","paidUpTo":"2099-12-31"},{"code":"AC","paidUpTo":"2099-12-31"},{"code":"RS0","paidUpTo":"2099-12-31"},{"code":"WS","paidUpTo":"2099-12-31"},{"code":"DPN","paidUpTo":"2099-12-31"},{"code":"RC","paidUpTo":"2099-12-31"},{"code":"PS","paidUpTo":"2099-12-31"},{"code":"DC","paidUpTo":"2099-12-31"},{"code":"RM","paidUpTo":"2099-12-31"},{"code":"CL","paidUpTo":"2099-12-31"},{"code":"PC","paidUpTo":"2099-12-31"}],
"hash":"2911276/0",
"gracePeriodDays":7,
"autoProlongated":false}
6.能够进入应用界面则表示安装破解成功。

IntelliJ IDEA 2017.1.5
构建, 建立在 July 4, 2017
Licensed: idea
Subscription is active until December 31, 2099
JRE: 1.8.0_112-release-736-b21 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0

=====拓展 台式机 激活 最后改成了下面方法

JetBrains产品永久激活(无限试用30天方式)
http://idea.npegeek.com/limitless.html

JetBrains产品永久激活(无限试用30天方式)

说明

JetBrains旗下产品提供试用30天功能,30天过后需购买或使用其他途径。该方式是通过脚本删除试用记录文件实现无限试用30天。支持任何版本的任何JetBrains旗下产品。

脚本

脚本使用

windows :执行
reset_jetbrains_eval_windows.vbs
文件。

mac:执行
reset_jetbrains_eval_mac_linux.sh
文件。

当提示Reset the success表示重置成功,此时重新idea或其他产品。点击Evaluate for free,点击Evaluate即可。30天后失效重新执行脚本即可。

IDEA--个性化配置 - 心飞扬的博客 - CSDN博客--里面很好,
http://blog.csdn.net/afzaici/article/details/71524643

IntelliJ IDEA 常用设置讲解 - IntelliJ IDEA使用教程 - PHPERZ中文资讯站-
--必看,目前发现最好的IDEA介绍网站;牛逼还有eclipse 的介绍,必看呀
http://www.phperz.com/article/15/0923/159043.html

=

==版本2017 最简单的激活:

进入ide主页面,help-register-license server,然后输入 http://idea.iteblog.com/key.
PHP
(注意:
php
要小写)即可~

==老是弹出  Can't start Git: git.exe Probably the path to Git executable is not valid. Fix it.

将通知 选项,external  executable critical  failures 的 通知选项 改成 不弹出提示。不知道是否会影响到其他,??

==