万丈高楼平地起。
权限管理对于管理系统而言已经是标配中的标配了吧,对于我等俗人更是不能免俗。同时就目前的项目状况而言,我们还不需要那么高大上的开源的解决方案,如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>
相关推荐
在SpringMVC-Activiti项目中,Shiro负责用户的身份验证和权限控制,确保只有经过授权的用户才能访问特定资源。开发者可以通过Shiro的API来定制登录、注销、权限校验等逻辑,实现灵活的安全策略。 EasyUI则是一个...
综合来看,这个压缩包可能包含了一个集成了SpringMVC负责后台业务逻辑处理,Activiti5.16进行流程管理,Shiro进行权限控制,EasyUI构建前端界面的完整Java Web项目。这样的组合常见于企业级应用,尤其是那些需要流程...
【Java-SpringMVC-毕业设计-源代码】是一个典型的基于Java技术栈的Web应用程序,主要应用于餐馆点餐系统的开发。这个项目展示了如何利用SpringMVC框架构建一个完整的业务流程,包括用户界面、后端服务以及数据库交互...
SpringMVC是Spring框架的一部分,专为构建Web应用而设计。它采用了Model-View-Controller(MVC)模式,将业务逻辑、数据处理和用户界面分离,提高了代码的可维护性和可测试性。SpringMVC通过DispatcherServlet接收...
4. **拦截器(Interceptor)**:SpringMVC提供了Interceptor机制,允许在请求处理前或后执行自定义逻辑,如权限检查、日志记录等。通过创建自定义Interceptor并注册到DispatcherServlet,我们可以实现高效且灵活的...
6. **拦截器(Interceptor)**:SpringMVC允许定义拦截器,可以在请求处理前后执行一些通用操作,如权限验证、日志记录等。 7. **数据绑定和类型转换**:SpringMVC自动处理请求参数与模型属性之间的绑定和类型转换...
毕业设计javajsp胡萝卜种植咨询管理系统springmvc-qkrp源码含文档工具包 后台是springmvc,页面是jsp,数据库mysql,jdk1.8,开发工具用ecplise、myecplise、sts、idea都可以 通过本胡萝卜种植咨询管理系统,可满足...
9. **拦截器(Interceptor)**:Spring MVC 允许自定义拦截器,可以在请求处理前后进行预处理和后处理,如权限检查、日志记录等。 10. **转换器和格式化器(Converter & Formatter)**:这些组件用于将请求参数转换...
毕业设计javajsp申通物流车辆调度系统springmvc-qrp源码含文档工具包 后台是springmvc,页面是jsp,数据库mysql,jdk1.8,开发工具用ecplise、myecplise、sts、idea都可以 通过本系统,满足了不同权限用户的需求,...
在项目实践中,开发者需要熟悉SpringMVC的配置和使用,理解MVC设计模式,掌握数据库设计和SQL操作,同时具备一定的AI知识,能够运用到系统中。此外,良好的代码组织和测试也是保证项目质量的关键。 通过对“minMIS_...
毕业设计javajsp绿色植物养护管理系统springmvc-qp源码含文档工具包 页面是jsp,数据库mysql,jdk1.8,开发工具用ecplise、myecplise、sts、idea都可以 通过本绿色植物养护管理系统,可满足不同权限用户的需求,管理...
毕业设计javajsp疫苗接种管理系统springmvc-qkp源码含文档工具包 后台是springmvc,页面是jsp,数据库mysql,jdk1.8,开发工具用ecplise、myecplise、sts、idea都可以 通过本疫苗接种管理系统,可满足不同权限用户的...
2. **Model-View-Controller(MVC)模式**:Spring MVC遵循这一设计模式,模型负责业务逻辑,视图负责展示,而控制器负责接收请求并处理,将模型数据传递给视图。 3. **@Controller**:这是Spring MVC中的一个注解...
毕业设计javajsp机械企业管理系统springmvc-qkrp源码含文档工具包 后台是springmvc,页面是jsp,数据库mysql,jdk1.8,开发工具用ecplise、myecplise、sts、idea都可以 通过本机械企业管理系统,可满足不同权限用户...
毕业设计javajsp医院人事管理系统springmvc-qkrp源码含文档工具包 页面是jsp,数据库mysql,jdk1.8,开发工具用ecplise、myecplise、sts、idea都可以 通过本医院人事管理系统,可满足不同权限用户的需求,管理员可以...
毕业设计javajsp图书借阅系统springmvc-qlkrp源码工具包 后台是springmvc,页面是jsp,数据库mysql,jdk1.8,开发工具用ecplise、myecplise、sts、idea都可以 本课题的设计主要根据图书馆的业务范围和特点,根据需求...
**SpringMVC**是Spring框架的一部分,专为构建Web应用程序而设计。它遵循模型-视图-控制器(MVC)设计模式,分离了展示层、业务逻辑层和数据访问层。SpringMVC处理HTTP请求,将它们转发给相应的控制器,控制器调用...
毕业设计javajsp保护隐私的远程医疗查询系统springmvc-qkrp源码含文档工具包 页面是jsp,数据库mysql,jdk1.8,开发工具用ecplise、myecplise、sts、idea都可以 通过本保护隐私的远程医疗查询系统,可满足不同权限...
一旦用户登录成功,Spring的安全框架可以提供角色和权限管理,确保用户只能访问其被授权的页面和功能。 发送和接收消息是聊天室的核心功能。在后端,SpringMVC接收到发送消息的请求后,通过MyBatis将消息保存到...
它遵循Model-View-Controller(MVC)设计模式,将业务逻辑、数据和用户界面分离,提高了代码的可维护性和可测试性。在SpringMVC中,Controller负责接收HTTP请求,调用Service层处理业务,Service层又会调用DAO层与...