一、Shiro简介
Apache Shiro 是 Java 的一个安全框架。我们经常看到它被拿来和 Spring 的 Security 来对比。大部分人认为 Shiro 比 Security 要简单。我的观点赞成一半一半吧。
首先 Shiro 确实和 Security 是同类型的框架,主要用来做安全,也就是我们俗称的权限校验(控制)。居多人对 Shrio 的定义为好入门。
我选型为 Shiro ,主要的原因扩展太easy了,而且我要的功能它都有。
二、概述
前段时间出了一个基于SSM(SpringMVC + Spring + Mybatis)的Shiro 教程Demo,Cache(Nosql)是基于Ehcache的,但是很多同学卡在了Redis上,经常运行起来。所以现在出一版本基于 Cache 为Ehcache版本的。这样减少新入门的同学的难度,不用依赖第三方中间件。
后续会陆陆续续添加N多相关的功能。以不同版本的方式发布。
基于Redis版本地址:http://www.sojson.com/shiro
三、需要你的赞助
如果帮助到了您,请你在下载代码后,运行后,跑起来后,加群帮你解决问题后,兴奋、喜悦、愤怒、丧气、不知所措... ... 的时候,请赞助我,钱多少不重要,学生请不要赞助(富二代请忽略)。
赞助链接:http://www.sojson.com/subsidize.html
四、请遵循三要素
- 建议你看完本篇文档所有内容,再进行运行项目。
- 在没熟练之前,除了必要的配置修改,请勿改动任何配置和包路径。
- 有疑问先看文档,交流群:
259217951
即可,群里没人理你@群主即可。
五、环境准备
5.1 开发工具
Eclipse 、 MyEclipes 、Idea
等 Java 开发工具,推荐使用MyEclipes8.5以上。因为这个项目是在MyEclipes8.5和MyEclipes10.7
开发的。
如果使用Eclipse的同学,请安装好Maven环境,如果没有Maven环境,又不想安装,那么请在附件中下载依赖包,自己把项目转成Java Web项目然后进行运行。
如果使用Idea
作为开发工具的同学,注意配置resources
,还有一些其他的配置需要自己处理,不像导入 MyEclipes 直接能跑起来。
5.2 依赖第三方
因为是基于 Ehcache ,所以也没有其他第三方。
主要就是一个 Mysql 数据库。数据库的版本为 Mysql5.6
,估计Mysql5.5
,Mysql5.6
都没问题,Mysql5.7
有小小问题,因为一些默认配置导致有些语法可能不支持,这个慎用。
下面有最新,我测试可用的Mysql
安装教程:Mysql5.6下载安装,Mysql5.7下载安装 ,Windows64位,绿色安装(解压缩安装)图文安装教程 。
如果安装出现Mysql
权限问题:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 解决。
六、环境配置及要求,JDK版本,初始化配置
6.1 JDK版本要求
JDK 版本要求为JDK1.7+
,我开发的版本是1.7.0_80
,JDK1.6
有些jar
包会报错,推荐使用JDK1.7
以上。
如果出现以下类似错误,那就是JDK版本不相符。
Unsupported major.minor version 51.0
其中各个版本对应的提示如下:
JDK1.5对应为Unsupported major.minor version 49.0
JDK1.6对应为Unsupported major.minor version 50.0
JDK1.7对应为Unsupported major.minor version 51.0
JDK1.8对应为Unsupported major.minor version 52.0
6.2 初始化配置
6.2.1 Mysql数据库初始化
本教程不支持自动创建表和插入数据,在项目的init/sql
下有三个sql 文件,分别为:tables.sql
(插入表)、init.data.sql
(插入初始化数据)、init_shiro_demo.sql
(插入初始化存储过程)。
执行的过程为: tables.sql
(插入表)===> init.data.sql
(插入初始化数据)就可以了。
存储过程可以是定时任务 com.sojson.common.timer.ToTimer
中定时任务调用的存储过程。每20分钟一次。想看看效果的同学,可以把spring.xml
配置文件中的spring-timer.xml
注释打开就可以。
数据库配置:jdbc.properties
配置你的数据库链接。
jdbc.url=jdbc:mysql://localhost:3306/shiro.demo
jdbc.username=root
jdbc.password=123456
具体 druid 配置:Druid数据库配置详细介绍 。
其他配置默认的即可,先跑起来,跑起来没问题后,看看配置文件,有问题和疑问在群里交流。
PS:如果你确实要用Mysql5.7,那么在Mysql的安装目录下找到。my.ini
或者my_default.ini
里面配置sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
即可。
6.3 Maven环境说明
本教程是用 Maven 管理Jar包及运行打包,如果你发现 Maven 一直在下载jar
包,时间过久的话,建议你换成阿里的数据源。打开你的 Maven 目录的setting.xml
文件,如果没有直接添加即可,官方群里有setting.xml
文件作为参考。
主要改个本地Maven
目录,改成你自己的目录即可:
<localRepository>E:\maven\repository</localRepository>
再配置一个mirror,找到标签为mirrors,然后在里面添加或者修改为阿里的Maven库,如下图:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
Maven的Mirror和Repository 的详细讲解 ,可以详细了解下。
异常解决
常见的异常有3种。
- 如果有部分包打红
×
,可以删除这个包路径,再次项目右键Maven选项(每个工具不一样)
==>Update Maven Dependencies
更新即可。 - 如果下载好
Jar
包,也不报错,但是在运行项目的时候,报错zip
相关异常,那么删除Maven
目录下所有下好的jar
包,然后再来下载一次。因为是下载的包是损坏的。 - 还有 Maven 的 JDK 版本需要和你项目一致,有的工具默认配置是
JDK1.5
。
6.4 其他说明
编码格式:UTF-8
,换成其他编码格式可能会有瑕疵。
Spring相关Jar版本为:Spring 4.2.5
前端页面采用:Bootstarp 3.2
。
其他依赖:jQuery1.8.3
、layer
控件。
6.5 View层说明
http://www.sojson.com/shiro之前的Shiro Demo 是 JSP 和 Freemarker 混合模版,从这个Shiro Demo开始,我只用 Freemarker ,后期也会出 Freemarker 视频教程。当然为了习惯(只会)JSP的同学,我也双模版配置不修改,您想改成JSP可以直接支持,JSP是以WEB-INF下的view目录为根目录。
七、教程功能详细说明
下面各点是针对(SSM)SpringMvc + Spring + Mybatis框架说明,以及一些使用方式和基本功能介绍。
7.1.1 框架基本介绍
本教程是SSM( SpringMVC +Spring + Mybatis + Freemarker ) + Ehcache 做的整体Shiro Demo
,其他框架需要自己自行解决,所以不做框架 其他 的讲解,其实是大同小异。
7.1.2 分页介绍
本框架里的分页比较Low,分页的ServiceImpl
要继承 BaseMybatisDao<T>
,这里泛型的<T>
为当前实体对象对应的Mapper.xml
文件,其实就是Mapper.xml
的namespace
。调用父类的findPage
相关。
Service Impl Java 代码:
publicPagination<UserRoleAllocationBo> findUserAndRole(ModelMap modelMap,
Integer pageNo,Integer pageSize){
//findUserAndRole : 为查询数据(sqlID)
//findCount : 为查询符合数据的总条数(sqlID)
returnsuper.findPage("findUserAndRole","findCount", modelMap, pageNo, pageSize);
}
分页查询使用缺省的sqlId
。
publicPagination<UPermission> findPage(Map<String,Object> resultMap,Integer pageNo,
Integer pageSize){
/**
* 调用父类的分页查询,默认数据查询sqlId = findAll , count 查询sqlId = findCount
*/
returnsuper.findPage(resultMap, pageNo, pageSize);
}
Mapper.xml 文件 Sql 代码,和上面一 一对应:
<selectid="findCount"resultMap="BaseResultMap">
select count(id) from u_user
<includerefid="where_all"/>
</select>
<!-- 用户权限分配的分页查询 -->
<selectid="findUserAndRole"resultType="com.sojson.permission.bo.UserRoleAllocationBo">
select u.id,u.nickname,u.email,u.create_time,u.last_login_time,u.status ,group_concat(ur.name) roleNames,group_concat(ur.id)roleIds from
u_user u
left join u_user_role uur on uur.uid = u.id
left join u_role ur on ur.id = uur.rid
<where>
<iftest="findContent != null and findContent !='' ">
and (
LOWER(u.nickname) like LOWER(CONCAT("%",#{findContent,jdbcType=VARCHAR},"%")) or
LOWER(u.email) like LOWER(CONCAT("%",#{findContent,jdbcType=VARCHAR},"%"))
)
</if>
</where>
group by u.id
</select>
<selectid="findAll"resultMap="BaseResultMap">
select
<includerefid="Base_Column_List"/>
from u_permission
<includerefid="where_all"/>
<includerefid="limit_sql"/>
</select>
<selectid="findCount"resultMap="BaseResultMap">
select count(id) from u_permission