
Demo已经部署到线上,地址是http://shiro.itboy.net,
管理员账号:admin,密码:sojson.com 若是密码错误,请用sojson。
PS:你能够注册本身的账号,而后用管理员赋权限给你本身的账号,可是,每20分钟会把数据初始化一次。建议本身下载源码,让Demo跑起来,而后跑的更快,有问题加群解决。
Shiro Demo 源码下载
Shiro Demo 非Maven项目依赖包下载:点我下载前端
Shiro Demo 源码下载下载:点我(云端下载)java
Github下载:https://github.com/baichengzhou/SpringMVC-Mybatis-shiromysql
Shiro Demo环境准备
开发工具:Eclipse
、MyEclipse
、Idea
等等。git
依赖第三方:Mysql 5.0
以上、Redis
。github
须要的配置:jdbc.properties
中配置Mysql的信息、spring-cache.xml
配置Redis 配置,若是是默认配置,就不用换,Redis Windows
安装:http://www.sojson.com/blog/110。ajax
注意:请不要有端口8080,设置Tomcat端口为80,而后访问不要带项目路径访问。就好像生产环节同样:http://shiro.itboy.net 。redis
Shiro 简介
Apache Shiro
是 Java 的一个安全框架。咱们常常看到它被拿来和 Spring 的 Security 来对比。大部分人认为 Shiro 比 Security 要简单。个人观点同意一半一半吧。spring
首先 Shiro 确实和 Security 是同类型的框架,主要用来作安全,也就是咱们俗称的权限校验(控制)。居多人对 Shrio 的定义为好入门。sql
我选型为 Shiro ,主要的缘由扩展太easy了,并且我要的功能它都有。数据库
本教程环境。
本教程Jar包管理是 Maven ,因此若是是 Maven 项目下载Demo后能够直接使用,若是是普通的Java Web项目,那么请在下面下载全部依赖包。
本教程开发工具是Myecilpse8.5。
本教程编码格式为UTF-8
。
本教程JDK为1.7
。
本教程Spring版本为4.2.5
。
前端页面采用Bootstarp 3.2
。
本教程包含的内容。
- SSM(SpringMVC + Spring +
Mybatis
)框架的增删改查(含分页),因此若是框架小白也是能够看看的。
View
层主要是Freemarker,可是为了考虑到好多人还使用的是JSP,也有一个页面是用JSP实现的,而且框架支持Freemarker 和 JSP
双View
展现(优先找Freemarker)。
- Shiro + Redis 的集成,也提供Ehcache的依赖Jar。
Shiro
初始权限动态加载。
Shiro
自定义权限校验Filter
定义,及功能实现。
Shiro
Ajax请求权限不知足,拦截后解决方案。
Shiro
Freemarker标签使用。
Shiro
JSP标签使用。
Shiro
登陆后跳转到最后一个访问的页面。
- 用户禁止登陆
Demo
。
- 在线显示,在线用户管理(踢出登陆)。
- 登陆注册密码加密传输
Demo
(详细请见下面讲解)。
- 密码修改。
- 用户我的中心。
- 权限的增删改查。
- 角色的增删改查。
- 权限
->
角色->
用户之间的关系维护。
- 管理员权限的自动添加(当有一个权限建立,自动添加到管理员角色下,保证管理员是最大权限)。
- Spring定时任务数据化数据。
- 集成多种验证码(包括动态的gif验证码哦)。
- 后续会陆陆续续升级... ...
1、SSM(SpringMVC + Spring + Mybatis)框架的增删改查(含分页)
本教程是SSM(SpringMVC + Spring + Mybatis + Freemarker + JSP)
+ Shiro + Redis 作的总体Demo,其余框架须要本身自行解决,因此不作其余框架的讲解,实际上是大同小异。
Controller
==> Service
(事务控制层) ==> Dao
==> SqlMapper
==> Mysql
2、View层 Freemarker,JSP
通用View
层配置在spring-mvc.xml
中的以【通用试图解析器】注释标注的区间配置。
3、Shiro + Redis 的集成,也提供Ehcache的依赖Jar。
Redis
缓存配置主要在spring-cache.xml
中。对应的全部Cache 相关 Java 代码在package:com.sojson.core.shiro.cache
中
4、Shiro 初始权限动态加载。
咱们通常是这么加载的。在spring-shiro.xml
中配置
- <property name="filterChainDefinitions" >
- <value>
- /** = anon
- /page/login.jsp = anon
- /page/register/* = anon
- /page/index.jsp = authc
- /page/addItem* = authc,roles[数据管理员]
- /page/file* = authc,roleOR[普通用户,数据管理员]
- /page/listItems* = authc,roleOR[数据管理员,普通用户]
- /page/showItem* = authc,roleOR[数据管理员,普通用户]
- /page/updateItem*=authc,roles[数据管理员]
- </value>
- </property>
本教程采用动态加载,你能够从数据库里读取而后拼接成shiro要的数据。
- <property name="filterChainDefinitions" value="#\{shiroManager.loadFilterChainDefinitions()\}"/>
配置文件方式加载详细讲解:http://www.sojson.com/blog/148
5、Shiro 自定义权限校验Filter定义,及功能实现。
Shrio Filter在package:com.sojson.core.shiro.filter
,具体配置在spring-shiro.xml
中。定义了5个拦截器,具体功能看代码以及代码注释。
- <bean id="shiroManager" class="com.sojson.core.shiro.service.impl.ShiroManagerImpl"/>
- <bean id="login" class="com.sojson.core.shiro.filter.LoginFilter"/>
- <bean id="role" class="com.sojson.core.shiro.filter.RoleFilter"/>
- <bean id="permission" class="com.sojson.core.shiro.filter.PermissionFilter"/>
- <bean id="simple" class="com.sojson.core.shiro.filter.SimpleAuthFilter"/>
- <property name="filters">
- <util:map>
- <entry key="login" value-ref="login"></entry>
- <entry key="role" value-ref="role"></entry>
- <entry key="simple" value-ref="simple"></entry>
- <entry key="permission" value-ref="permission"></entry>
- </util:map>
- </property>
6、Shiro Ajax请求权限不知足,拦截后解决方案。
这里有一个前提,咱们知道Ajax不能作页面redirect
和forward
跳转,因此Ajax请求假如没登陆,那么这个请求给用户的感受就是没有任何反应,而用户又不知道用户已经退出了。解决代码以下:
- //Java代码,判断若是是Ajax请求,而后而且没登陆,那么就给予返回JSON,login_status = 300,message = 当前用户没有登陆!
- if (ShiroFilterUtils.isAjax(request)) {// ajax请求
- Map<String,String> resultMap = new HashMap<String, String>();
- LoggerUtils.debug(getClass(), "当前用户没有登陆,而且是Ajax请求!");
- resultMap.put("login_status", "300");
- resultMap.put("message", "\u5F53\u524D\u7528\u6237\u6CA1\u6709\u767B\u5F55\uFF01");//当前用户没有登陆!
- ShiroFilterUtils.out(response, resultMap);
- }
- //前端代码
- if(result.login_status == 300){
- layer.msg(result.message);//当前用户没有登陆!
- }
7、Shiro Freemarker标签使用。
Freemarker使用Shiro 标签的介绍:http://www.sojson.com/blog/143
8、Shiro JSP标签使用。
JSP使用Shiro 标签的介绍:http://www.sojson.com/blog/144
9、Shiro 登陆后跳转到最后一个访问的页面。
在 Java 中就能够这样获取上一个地址:
- //上一个浏览的非Ajax的地址,在登陆后,取得地址,若是不为null,那么就跳转过去。
- String url = (String) request.getAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE);
- //shiro也有他的方法。详细看下面。
若是须要保存登陆以前的Request信息,那么须要在Login拦截的Filter中先保存:
- @Override
- protected boolean onAccessDenied(ServletRequest request, ServletResponse response)
- throws Exception {
- //保存Request和Response,登陆后能够取到
- saveRequestAndRedirectToLogin(request, response);
- return Boolean.FALSE ;
- }
- //登陆后,取到以前的Request中的一些信息。
- SavedRequest saveRequest = WebUtils.getSavedRequest(request);
- saveRequest.getMethod();//以前的请求方法
- saveRequest.getQueryString();//以前请求的条件
- saveRequest.getRequestURI();//以前请求的路径
- saveRequest.getRequestUrl();//以前请求的全路径
10、用户禁止登陆Demo
这个功能实际上是一个改变用户数据库表里的一个字段,本Demo中:1:有效,0:禁止登陆
而后踢出用户登陆状态。代码详细请查看CustomSessionManager.java
类的forbidUserById(Long id, Long status)
方法。
而再次登陆的话,须要再登陆,而登陆的地方限制了用户状态为(0
:禁止登陆)的用户登陆。
- /**
- * 查询要禁用的用户是否在线。
- * @param id 用户ID
- * @param status 用户状态
- */
- public void forbidUserById(Long id, Long status) {
- //获取全部在线用户
- for(UserOnlineBo bo : getAllUser()){
- Long userId = bo.getId();
- //匹配用户ID
- if(userId.equals(id)){
- //获取用户Session
- Session session = shiroSessionRepository.getSession(bo.getSessionId());
- //标记用户Session
- SessionStatus sessionStatus = (SessionStatus) session.getAttribute(SESSION_STATUS);
- //是否踢出 true:有效,false:踢出。
- sessionStatus.setOnlineStatus(status.intValue() == 1);
- //更新Session
- customShiroSessionDAO.update(session);
- }
- }
- }
11、在线显示,在线用户管理(踢出登陆)。
上面的功能依赖这个功能。从Redis中获取全部有效的Session
- /**
- * 获取全部的有效Session用户
- * @return
- */
- public List getAllUser() {
- //获取全部session
- Collection sessions = customShiroSessionDAO.getActiveSessions();
- List list = new ArrayList();
-
- for (Session session : sessions) {
- UserOnlineBo bo = getSessionBo(session);
- if(null != bo){
- list.add(bo);
- }
- }
- return list;
- }
踢出后,不能直接退出,要否则用户感受莫名其妙。全部增长了一个Filter。SimpleAuthFilter.java
若是标记为踢出,会提示用户。具体查看源码以及配合项目的使用。
12、登陆注册密码加密传输。
这个地方好多人纠结的。好比密码过于简单,即便加密后也能破解。如咱们把密码:123456
,加密后就是:e10adc3949ba59abbe56e057f20f883e
这个很容易被识别,致使不安全,如今市面上的MD5破解其实就是把经常使用的数字,字母进行先加密,而后对比,美其名曰破解MD5。
那怎么能让用户即便使用很简单的密码,也发现不了?
本Demo的实现方式是:MD5(登陆账号 + “固定值” + 密码),把这个做为密码,这样,基本是不可能猜的出来。
- //Java代码。UserManager.md5Pswd(UUser user);
- /**
- * 加工密码,和登陆一致。
- * @param user
- * @return
- */
- public static UUser md5Pswd(UUser user){
- //密码为 email + '#' + pswd,而后MD5
- user.setPswd(md5Pswd(user.getEmail(),user.getPswd()));
- return user;
- }
- /**
- * 字符串返回值
- * @param email
- * @param pswd
- * @return
- */
- public static String md5Pswd(String email ,String pswd){
- pswd = String.format("%s#%s", email,pswd);
- pswd = MathUtil.getMD5(pswd);
- return pswd;
- }
- //JS代码
- var pswd = MD5(username +"#" + password);
十3、密码修改。
不讲了,和上面原理一致,而后具体看Demo。
十4、用户我的中心。
包含的功能有[我的资料,资料修改,密码修改,个人权限],具体看Demo。
十5、权限的增删改查。
本Demo
的设计是遵循RBAC3的思想。http://www.sojson.com/blog/142
RBAC我的理解介绍:http://www.sojson.com/blog/141

具体实现看Demo。
十6、角色的增删改查。

十7、权限->角色->用户之间的关系维护。
把权限赋给角色。

把角色赋给用户。

十8、管理员权限的自动添加
这里每次添加一个权限,都会添加到“管理员”角色下,保证“管理员”角色拥有最大权限。
十9、Spring定时任务数据初始化。
这个Demo
由于是开放的,因此建立了一个定时任务。每20分钟执行一次,用Mysql存储过程从新建立表,从新插入初始化数据。
具体数据看项目中的init/sql
下的tables.sql(初始化表),init.data.sql(初始化数据)。
- //定时任务配置文件spring-timer.xml
- <task:executor id="executor" pool-size="5" />
- <task:scheduler id="scheduler" pool-size="10" />
- <task:annotation-driven executor="executor" scheduler="scheduler" />
- //Java 代码 RoleServiceImpl.java
- /**
- * 每20分钟执行一次
- */
- @Override
- @Scheduled(cron = "0 0/20 * * * ? ")
- public void initData() {
- roleMapper.initData();
- }
二10、集成验证码。

项目中package:com.sojson.common.utils.vcode
包是验证码的封装包。
而且提供了一个VerifyCodeUtils.java 的验证码工具类。
使用方法参见:CommonController.java
类中的getVCode()
方法和getGifCode()
方法。


验证码详细介绍、
Java生成验证码合集(一)简单版 、
Java生成验证码合集(二)GJF版 。
若是不是Maven项目,下载依赖包。
依赖Jar包下载:
http://pan.baidu.com/s/1c2LUumW 提取密码:3kv8
、或者请加QQ群:259217951(群文件内有,有问题能够交流。)。
备注:点击文件名下载,附件源来自云端,只能在本站下载。复制下载连接无效。
Shrio + SSM框架 Demo 源码下载。
源码下载
Shiro_SSM_0.1版本下载
备注:点击文件名下载,附件源来自云端,只能在本站下载。复制下载连接无效