万丈高楼平地起。
权限管理对于管理系统而言已经是标配中的标配了吧,对于我等俗人更是不能免俗。同时就目前的项目状况而言,我们还不需要那么高大上的开源的解决方案,如Spring Security,Shiro。小伙伴一致决定我们还是从基本的功能迭代起来吧。
目标:
1.实现权限的管理(CRUD)
2.实现部门管理 (CRUD)
3.实现人员的管理 (CRUD)
4.实现部门和权限的关联管理(CRUD)
5.实现人员和部门的关联关联 (CRUD)
6.实现页面的权限到具体的动作而非仅仅页面级别的控制。
一眼望去,哦哦,除了6,剩下的就是分别对应我们的权限管理的5张表了。
1.权限表
2.部门表
3.人员表
4.人员和部门关联表
5.部门权限关联表
关键实现思路
1.权限表保存所有的系统的url,通过给不同的部门分配不同的url来控制权限。
2.页面的操作(a标签或者button之类),封装自定义JSP的tag,通过判断该用户所在的部门是否关联该权限做屏蔽。
难点:
我们都知道Spring2.5后,Spring对REST风格的架构支持的是非常的好的,同时Restful风格的url简单,清晰.
通常在Spring中通过@PathVariable占位符的形式来支持这种风格。如:
@RequestMapping(value=“/user/{id}”, method=RequestMethod.GET)
public ..findUser(@PathVariable String id) {
}
这样就会对我们的权限造成很大的影响,因为如果我们的权限表保存的是:
id url
1 /user/{id}
而用户实际访问的是/user/1,这样就造成这两个URL无法匹配,那我们的权限系统不就歇菜了嘛。那我权限就配置到/user呢?
你确定?如果这样就放掉了太多url了的可能了吧。
解决思路:
public class SecurityInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// 控制访问
if (handler instanceof HandlerMethod) {
//获取请求的最佳匹配路径
String pattern = (String)request.getAttribute(
HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
//获取@PathVariable的值
Object attribute = request.getAttribute(
HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
//权限校验。
//此处略去20行代码
if (match) {
return true;
}
response.sendError(HttpStatus.FORBIDDEN.value());
return false;
}
}
1.我们设计一个安全的拦截器继承HandlerInterceptorAdapter做一个切面
2.override preHandler方法,
3.通过在request中得到现在访问的url会最佳匹配到得controller方法中requestmapping配置的路径
如果用户访问的/user/1, pattern就会返回 /usr/{id} 这样就达成了我们想要的结果
我们不直接保存用户访问的url在权限表中,而是保存请求url最后映射的controller方法的 requestmapping配置的url。
如果想得做log记录到访问的http参数,可以分两部分获取:
1.//获取@PathVariable的值
Object attribute = request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
2.各种getParameter部分:request.getParameterMap() //直接获取所有参数,返回Map
感想:
此处掌声10s!
大赞SpringMVC!
绝对业界良心啊。架构上得灵活性,给予我等码农最大的灵活性,话说在Web端我最爱的两个框架,SpringMVC,Stripes。
纳尼?你不正在学习Clojure。。,嘘。。。。!
页面安全url校验的tag: 此处一坑是,如果我们直接继承TagSupport去实现我们的功能时,发现惨了,我们的Service不能被Spring autoWeired了。 So我们还是乖乖使用Spring封装的这个RequestContextAwareTag吧。
public class SecurityUrlTag extends RequestContextAwareTag {
private String url;
/**
* 权限判断
*
* hufeng(of730)
* @return
* @throws JspException
*/
@Override
@SuppressWarnings("unchecked")
public int doStartTagInternal() throws JspTagException {
WebApplicationContext ctx = getRequestContext().getWebApplicationContext();
EmployeeService employeeService = (EmployeeService) ctx.getBean("employeeService");
DeptRightsService deptRightsService = (DeptRightsService) ctx.getBean("deptRightsService");
String empNo = (String) pageContext.getAttribute("empNo", PageContext.SESSION_SCOPE);
if (StringUtils.isNotEmpty(empNo)) {
Dept dept = employeeService.getDept(empNo);
if (dept != null) {
List<String> allRights = deptRightsService.findAllRightsUrlsByDeptId(dept.getId());
if (allRights.contains(url)) {
return EVAL_BODY_INCLUDE;
}
}
}
return SKIP_BODY;
}
//~~~~~~~~~~~~~setter&&getter~~~~~~~~~~~~~~
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
在WEB-INFO下面:SecurityUrl.tld,你懂的! <?xml version="1.0" encoding="UTF-8" ?>
<tlib-version>1.0</tlib-version>
<short-name>pc</short-name><!-- 标签库名称 -->
<uri>http://xxx/tags/pc</uri><!-- 导入标签库时会用到 -->
<!-- 定义标签 -->
<tag>
<name>securityUrl</name> <!-- 标签名称 -->
<tag-class>xxx.SecurityUrlTag</tag-class> <!-- 对应类 -->
<body-content>scriptless</body-content>
<attribute>
<name>url</name>
<required>true</required>
</attribute>
</tag>
jsp页面导入自定义标签:).
<%--自定义标签--%>
<%@taglib prefix="pc" uri="http://xx/tags/pc" %>
<pc:securityUrl url="/product/deleteProductById">
<a href="javascript:del('');" class="btn btn-default toggle-detail">
<i class="icon icon-trash-o"></i>
删除
</a>
</pc:securityUrl>
相关推荐
运用这个模板开发了一个基于粗粒度权限设计的管理后台,前端使用的是ExtJs。 ExtJs属于比较重的前端框架,基于当下流行的几种前端框架,选择了Vue + ElementUI重新实现了一个后台管理系统前端 权限管理选用了...
包含了流程设计器,表单设计器,权限管理,简单报表管理等功能; 系统后端基于SpringMVC+Spring+Hibernate框架,前端页面采用JQuery+Bootstrap等主流技术; 流程引擎基于Snaker工作流;表单设计器基于雷劈网WEB表单...
1、基于SpringBoot+ORM-Mybatis+SpringMVC和多种组件构建的企业信息化开发基础平台源码+项目说明.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、...
基于SSM框架简单的后台管理系统,整合spring + springmvc + shiro + mybatis + esayui。包含许多基础模块(用户管理、角色管理、菜单管理、角色权限管理、用户角色管理、日志管理、数据库监控)。 <项目介绍> 该资源...
这个资源是从淘宝上一买来的,当时主要看中的是界面设计,在买之前在网上找过,基本找不到下载,本人拿出来共享,这套框架对于初学者比较好,对于一般的小项目也可以用,对于大项目还有待测试.需要的资源分有点高,...
主要功能有: 班级信息管理: 本模块...权限控制管理: 新增用户功能,管理用户功能。 管理员账号密码: 123456/123456 运行环境:jdk1.8/jdk1.9 IDE环境: Eclipse,Myeclipse,IDEA都可以 tomcat环境: Tomcat8.x/9.x
云音乐网站 -数据库和源代码文件都有,是可以运行的,我自己运行之后在里面放了几张功能截图,还附带有一个课程设计说明书。比较全面,值得学习和下载。5分少了,满意请好评。 ## 配置 开发环境 Eclipse Java EE IDE...
毕业设计-基于Springmvc+jQuery+Bootstrap的校友网管理系统.zip 项目来源 校友系统不只是一套软件系统,而是一整套“互联网+校友”的解决方案。校友系统通过帮助院校搭建校友互动平台和校友管理系统,拓展院校在校友...
本项目是基于SpringMVC和Mybatis的iBase4J分布式系统设计源码,包含3332个文件,其中主要包含2042个js脚本文件,355个png图片文件,217个less样式文件等。系统采用了SpringMVC、Mybatis、mybatis-plus等技术,实现了...
本项目是基于Spring和SpringMVC开发的分布式敏捷开发系统架构设计源码,主要使用Java进行开发。项目共包含1251个文件,其中Java源代码文件379个,XML配置文件198个,Properties配置文件159个,JavaScript源代码文件...
本源码提供了一个基于Spring+SpringMVC+Mybatis的分布式框架设计。项目包含1990个文件,其中包括551个Java源文件、294个PNG图片、253个GIF图片、217个CSS样式文件、193个JavaScript文件、170个XML文件、89个HTML文件...
包含了流程设计器,表单设计器,权限管理,简单报表管理等功能; 系统后端基于SpringMVC+Spring+Hibernate框架,前端页面采用JQuery+Bootstrap等主流技术; 流程引擎基于Snaker工作流;表单设计器基于雷劈网WEB表单...
商城设置了权限验证,所有用户除了访问首页浏览商品外,均需输入账号、密码登录进入系统;商城管理员进入系统后可对用户信息、商品信息、订单信息等进行管理;普通用户注册成功并登陆系统后,可以浏览商品、加入...
1. 后台架构:SpringMVC 5.1.5、Spring 5.1.5、SpringSecurity 5.1.4、Hibernate 5.3.7 2. 前端架构:Bootstrap,兼容JQuery,AJAX 3. 页面设计:SmartAdmin,AJAX + 对话框操作风格,可换6种页面风格和颜色 4. ...
本系统采用SpringMVC+Hibernate+Spring框架整合开发,数据库使用MySQL,构建工具是Gradle。其中前台页面使用了Bootstrap中的一个模板AdminLTE进行美化,可导入IntelliJ IDEA使用。 参考了多个OA相关的项目,大概实现...
由springmvc+redis+mysql+shiro实现的权限控制及缓存
这是大四做的毕业设计,是在大二学习了JavaWeb后写了一个简单的酒店管理系统小demo的升级版,主要使用SpringMVC+Spring+Mybatis实现酒店日常的基本管理。预订查询空房、入住办理离店、系统权限管理等.zip 这是大四做...
主要功能有: 班级信息管理: 本模块...权限控制管理: 新增用户功能,管理用户功能。 管理员账号密码: 123456/123456 运行环境:jdk1.8/jdk1.9 IDE环境: Eclipse,Myeclipse,IDEA都可以 tomcat环境: Tomcat8.x/9.x
- SpringMVC - Spring - MyBaits - MyBatis Generator - MyBatis PageHelper - Druid - Lombok - JWT - Spring Security - JavaMail - Thymeleaf - HttpClient - FileUpload - Spring Scheduler - Hibernate ...