shiro-5基于url的权限管理
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(
资源
)
和权限表示方式不规范。