在几乎所有的web应用中都需要对访问者(用户)进行权限管理, 因为我们希望某些页面只对特定的用户开放, 以及某些操作只有符合身份的用户才能进行。这之中涉及到了身份验证和权限管理. 只有单用户系统和多用户单权限系统才不需要权限管理。
在本文中, 使用了基于组的权限管理, 并在Spring框架下利用HandlerInterceptorAdapter和Hibernate进行实现。
User的结构是: public class User {
private int id;
private String name;
private String password;
private Set<String> groups = new HashSet<String>();
}
UserGroup表:
user:intgroup:String使用联合主键, 在Java中没有对应的类。
Hibernate映射文件是:
<hibernate-mapping auto-import="true" default-lazy="false">
<class name="net.ideawu.User" table="User">
<cache usage="read-write" />
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="name" column="name"/>
<property name="password" column="password"/>
<set name="groups" table="UserGroup" cascade="save-update" lazy="false">
<key column="user" />
<element column="`group`" type="string" />
</set>
</class>
</hibernate-mapping>
一切的身份验证交给一个继承HandlerInterceptorAdapter的类来做:
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.util.UrlPathHelper;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
...
public class AuthorizeInterceptor extends HandlerInterceptorAdapter {
private UrlPathHelper urlPathHelper = new UrlPathHelper();
private PathMatcher pathMatcher = new AntPathMatcher();
private Properties groupMappings;
/** * Attach URL paths to group. */
public void setGroupMappings(Properties groupMappings) {
this.groupMappings = groupMappings;
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = urlPathHelper.getLookupPathForRequest(request);
String group = lookupGroup(url);
// 找出资源所需要的权限, 即组名
if(group == null){
// 所请求的资源不需要保护.
return true;
}
// 如果已经登录, 一个User实例被保存在session中.
User loginUser = (User)request.getSession().getAttribute("loginUser");
ModelAndView mav = new ModelAndView("system/authorizeError");
if(loginUser == null){
mav.addObject("errorMsg", "你还没有登录!");
throw new ModelAndViewDefiningException(mav);
}else{
if(!loginUser.getGroups().contains(group)){
mav.addObject("errorMsg", "授权失败! 你不在 <b>" + group + "</b> 组!");
throw new ModelAndViewDefiningException(mav);
} return true;
}
}
/* * 查看
org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.lookupHandler()
* Ant模式的最长子串匹配法.
*/
private String lookupGroup(String url){
String group = groupMappings.getProperty(url);
if (group == null) {
String bestPathMatch = null;
for (Iterator it = this.groupMappings.keySet().iterator();it.hasNext();) {
String registeredPath = (String) it.next();
if (this.pathMatcher.match(registeredPath, url) && (bestPathMatch == null || bestPathMatch.length() <= registeredPath.length())) {
group = this.groupMappings.getProperty(registeredPath);
bestPathMatch = registeredPath;
}
}
}
return group;
}
}
下面我们需要在Spring的应用上下文配置文件中设置:
<bean id="authorizeInterceptor" class="net.ideawu.AuthorizeInterceptor">
<property name="groupMappings">
<value>
<!-- Attach URL paths to group -->
/admin/*=admin
</value>
</property>
</bean>
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="authorizeInterceptor" /> </list>
</property>
<property name="mappings">
<value>
/index.do=indexController /browse.do=browseController /admin/removeArticle.do=removeArticleController
</value>
</property>
</bean>
注意到"/admin/*=admin", 所以/admin目录下的所有资源只有在admin组的用户才能访问, 这样就不用担心普通访客删除文章了。使用这种方法, 你不需要在removeArticleController中作身份验证和权限管理, 一切都交给AuthorizeInterceptor。
分享到:
相关推荐
在IT行业中,权限管理系统是构建复杂应用不可或缺的一部分,它确保了不同用户对系统资源的访问控制,保护数据安全。本项目基于SpringCloud框架,提供了一套完整的前后端代码,包括权限管理和数据库设计,旨在帮助...
本文主要讨论的是如何在基于Spring框架的应用中实现权限控制系统,特别提到了Acegi安全框架的使用。Spring框架是一个流行的多层J2EE应用框架,它提供了IoC(控制反转)和AOP(面向切面编程)功能,但本身并不包含...
用户管理模块基于Spring Security的用户登录、退出操作,以及用户查询、添加、详情等操作;角色管理模块,通过权限关联与控制给用户赋予角色(管理员角色和普通用户角色);资源权限管理模块给不同的角色关联不同的...
SpringBoot+SpringSecurity+JWT+MybatisPlus实现基于注解的权限验证,可根据注解的格式不同,做到角色权限控制,角色加资源权限控制等,粒度比较细化。 @PreAuthorize("hasAnyRole('ADMIN','USER')"):具有admin或...
【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--服务定位器和IoC容器(九) 【SSH进阶之路】一步步重构容器实现Spring框架——配置文件+反射实现IoC容器(十) 【SSH进阶之...
基于Spring Boot框架的权限管理系统 项目简介 本项目是一个基于Spring Boot框架的权限管理系统,旨在提供一个高效、灵活的用户权限管理解决方案。系统涵盖了用户管理、角色管理、菜单管理等多个模块,支持用户...
【标题】:“基于Spring,Spring MVC,MyBatis权限管理系统”是一个使用Java技术栈实现的权限管理解决方案。这个系统利用了Spring框架的核心功能,Spring MVC的MVC设计模式,以及MyBatis作为持久层框架,旨在提供...
后端使用SpringBoot框架进行业务逻辑开发,利用Spring Security实现权限控制。数据库采用MySQL进行数据存储,使用MyBatis进行数据访问。 权限控制模块设计包括用户、角色和权限三个主要模块。用户模块用于管理用户...
综上所述,本项目通过SSM框架和RBAC模型,构建了一个用户权限管理系统,不仅能够实现基础的用户管理和权限分配,还能通过Spring Security进行精细的权限拦截,确保系统安全。这种设计模式在现代企业级应用中非常常见...
该项目旨在提供一套高效、安全的后端服务框架,用于实现用户权限的精细化管理。 首先,Spring Boot 2.7是Spring框架的一个轻量级版本,它简化了Java应用的开发过程,通过内嵌的Tomcat服务器和自动配置功能,使得...
SSM(Spring+SpringMVC+Mybatis)权限管理系统是一个基于Java Web技术的全面权限管理解决方案,它结合了Spring框架的 IoC(Inversion of Control)容器、SpringMVC作为 MVC(Model-View-Controller)架构的实现以及...
本项目基于Spring,整合Apache Shiro框架,实现用户管理和权限控制,主要内容如下: 1.登录(带验证码),包括“记住我”的功能; 2.加密,存储的密码不采用明文,初始密码123; 3.session管理:使用shiro默认的...
- **用户管理**:创建、修改、删除用户,管理用户的角色和权限。 - **角色管理**:定义角色,分配权限,一个角色可以拥有多个权限。 - **权限管理**:定义权限,包括访问资源的权限和操作资源的权限。 - **登录认证*...
项目采用Spring Boot、MyBatis、Spring Security、Redis等技术栈,实现了用户管理、角色管理、菜单管理、部门管理等核心功能。 适用人群 后端开发人员 前端开发人员 微服务架构爱好者 权限管理系统开发者 ...
基于Spring Boot框架的用户管理系统 项目简介 本项目是一个基于Spring Boot框架的用户管理系统,旨在提供一个高效、易扩展的用户管理解决方案。系统集成了Spring Data JPA、Redis、Swagger等技术,支持复杂SQL...
本项目是一个基于Spring Boot和Shiro框架的权限管理系统,实现了前后端分离的权限控制,支持按钮和接口级别的细粒度权限管理。系统采用RBAC(基于角色的访问控制)模型,通过Shiro进行后端权限验证,前端使用Vue和...
总结来说,这个基于Shiro、Spring MVC和MyBatis的权限管理系统实现了从用户认证到资源访问控制的全过程,为企业级应用提供了安全的访问控制机制。通过学习和实践这个项目,开发者可以深入理解Java Web安全框架的应用...
4.权限管理框架-----spring-security 5.监控框架---------actuator、remote-shell 6.日志-------------logback 7.前台框架---------thymeleaf 8.生成工具---------generator(自动生成bean、mapper、SQL) 9.分页...
这个基于RBAC(Role-Based Access Control,基于角色的访问控制)的权限管理系统Java源码,是用这三个框架集成实现的一个实际项目,它展示了如何在Java应用程序中进行安全控制,确保用户只能访问他们被授权的资源。...