`

springmvc简单实现权限控制

 
阅读更多

用过了Spring Security,一般都不会采用这种简单的自定义方式.自定义当然灵活自由,越要完善,也就意味做的工作越多.使用框架,别人考虑得相对周到,比如spring security的防止攻击就有session fixation, clickjacking, cross site request forgery.以下的简单实现的权限控制虽然可以去实现这样的功能,但就没必要了.当然这个模型是包含认证和授权.

 

1.写一个自定义注解(功能类似于spring security的@PreAuthorize)

 

[java] view plain
  1. package org.exam.auth;  
  2. import java.lang.annotation.ElementType;  
  3. import java.lang.annotation.Retention;  
  4. import java.lang.annotation.RetentionPolicy;  
  5. import java.lang.annotation.Target;  
  6. @Retention(RetentionPolicy.RUNTIME)  
  7. @Target(ElementType.METHOD)  
  8. public @interface Auth {  
  9.     String value() default "";  
  10.     String name() default "";  
  11. }  

2.写一个拦截器.

[java] view plain
  1. package org.exam.auth;  
  2. import org.springframework.http.HttpStatus;  
  3. import org.springframework.web.method.HandlerMethod;  
  4. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletResponse;  
  7. import java.io.PrintWriter;  
  8. import java.util.Set;  
  9. public class AuthInterceptor extends HandlerInterceptorAdapter {  
  10.     public static final String SESSION_USERID = "kUSERID";  
  11.     public static final String SESSION_AUTHS = "kAUTHS";  
  12.     @Override  
  13.     public boolean preHandle(HttpServletRequest request,  
  14.             HttpServletResponse response, Object handler) throws Exception {  
  15.         boolean flag = true;  
  16.         if (handler instanceof HandlerMethod) {  
  17.             Auth auth = ((HandlerMethod) handler).getMethod().getAnnotation(Auth.class);  
  18.             if (auth != null) {// 有权限控制的就要检查  
  19.                 if (request.getSession().getAttribute(SESSION_USERID) == null) {// 没登录就要求登录  
  20.                     response.setStatus(HttpStatus.FORBIDDEN.value());  
  21.                     response.setContentType("text/html; charset=UTF-8");  
  22.                     PrintWriter out=response.getWriter();  
  23.                     out.write("{\"type\":\"nosignin\",\"msg\":\"请您先登录!\"}");  
  24.                     out.flush();  
  25.                     out.close();  
  26.                     flag = false;  
  27.                 } else {// 登录了检查,方法上只是@Auth,表示只要求登录就能通过.@Auth("authority")这类型,验证用户权限  
  28.                     if (!"".equals(auth.value())) {  
  29.                         Set<String> auths = (Set<String>) request.getSession().getAttribute(SESSION_AUTHS);  
  30.                         if (!auths.contains(auth.value())) {// 提示用户没权限  
  31.                             response.setStatus(HttpStatus.FORBIDDEN.value());  
  32.                             response.setContentType("text/html; charset=UTF-8");  
  33.                             PrintWriter out=response.getWriter();  
  34.                             out.write("{\"type\":\"noauth\",\"msg\":\"您没有"+auth.name()+"权限!\"}");  
  35.                             out.flush();  
  36.                             out.close();  
  37.                             flag = false;  
  38.                         }  
  39.                     }  
  40.                 }  
  41.             }  
  42.         }  
  43.         return flag;  
  44.     }  
  45. }  

处理controller的@RequestMapping方法(这里的处理直接通过response处理,spring security先抛异常,然后再统一处理异常):
a.如果这个方法没有使用Auth注解,会认为没有作权限控制,任何人可以访问.
b.如果这个方法只标注了@Auth,如果用户没登录,会返回一个403,并提示用户登录.
c.如果这个方法标注了具体需要某种权限,如@Auth("authority"),就要求用户必须有这种权限,否则返回403,并提示用户没有权限,这里相当于实现授权,并且授权之前先认证.


3.让拦截器起作用.重写org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter#addInterceptors方法

[java] view plain
  1. @Configuration  
  2. @ComponentScan(basePackages={"org.exam.web"})  
  3. @EnableWebMvc  
  4. public class MvcConfig extends WebMvcConfigurerAdapter{  
  5.     @Override  
  6.     public void addInterceptors(InterceptorRegistry registry) {  
  7.         registry.addInterceptor(new AuthInterceptor());  
  8.     }  
  9.     //其它略...  
  10. }  

4.用户登录(只做了一个模拟登录)和具体使用,剩下的就可以测试了.

[java] view plain
  1. @Controller  
  2. @RequestMapping("/user")  
  3. public class UserController {  
  4.     @RequestMapping("/login")  
  5.     @ResponseBody  
  6.     public boolean login(HttpSession session,User user){  
  7.         boolean result=false;  
  8.         //模拟从数据库查出存在这样的用户  
  9.         Long userId=user.getId();  
  10.         if(userId!=null&&userId>0){  
  11.             session.setAttribute(AuthInterceptor.SESSION_USERID, userId);  
  12.             session.setAttribute(AuthInterceptor.SESSION_AUTHS, new HashSet<String>(Arrays.asList("user_list""user_query""user_save")));  
  13.             result=true;  
  14.         }  
  15.         return result;  
  16.     }  
  17.     @Auth("user_queryXXXX")  
  18.     @RequestMapping("/query")  
  19.     @ResponseBody  
  20.     public String query(){  
  21.         System.out.println("query");  
  22.         return getClass().toString();  
  23.     }  
  24.     @Auth("user_list")  
  25.     @RequestMapping("/list")  
  26.     @ResponseBody  
  27.     public String list(){  
  28.         System.out.println("list");  
  29.         return getClass().toString();  
  30.     }  
  31.     @Auth("user_save")  
  32.     @RequestMapping("/add")  
  33.     public String add(User user){  
  34.         System.out.println("add:"+user);  
  35.         return "user/add";  
  36.     }  
  37. }  
分享到:
评论

相关推荐

    SpringMVC+Mybatis整合实现简单权限控制系统代码

    10. **安全框架集成**:为了更高效地实现权限控制,可以考虑集成Spring Security或Shiro等安全框架,它们提供了更全面的权限管理和认证机制。 通过以上步骤,我们可以构建一个基本的SpringMVC+Mybatis整合的权限...

    SpringMVC框架简单实现

    在本项目中,"panda-springmvc"是一个简易版的SpringMVC框架实现,旨在帮助理解其核心概念和工作流程。 首先,让我们深入了解一下SpringMVC的核心组件: 1. **DispatcherServlet**:这是SpringMVC的前端控制器,...

    SpringMVC+shiro权限管理

    **SpringMVC+Shiro权限管理** 在现代Web应用程序开发中,权限管理和用户认证是至关重要的组成部分。...通过深入学习和实践这个项目,开发者可以掌握如何在实际项目中实现复杂的权限控制和用户管理。

    基于springmvc+easyui+权限控制的后台管理系统带数据库文件可直接运行

    综上所述,"基于SpringMVC+EasyUI+权限控制的后台管理系统"整合了强大的后端处理能力与直观的前端展示效果,结合数据库,可快速搭建出功能完备的管理平台。在实际应用中,开发者通常还需要考虑权限控制,例如基于...

    企业级开发-SpringMVC使用拦截器实现用户登录权限验证实验报告.docx

    本实验报告将探讨如何利用 SpringMVC 的拦截器(Interceptor)来实现用户登录权限验证,确保只有已登录的用户才能访问特定的受保护资源。 首先,我们来看一下实验的基本步骤: 1. 创建 `User` 类:这是表示用户...

    SpringMVC+Mybatis+Mysql+权限+拦截器的整合实例 源码程序

    在这个实例中,可能包括了用户登录验证、角色权限控制等,使得只有拥有特定权限的用户才能访问特定资源。这通常通过拦截器实现,比如SpringMVC中的HandlerInterceptor,可以在请求处理前进行预处理,如检查用户权限...

    SpringMVC 拦截器 实现 登录退出功能

    **SpringMVC 拦截器实现登录退出功能** 在SpringMVC框架中,拦截器(Interceptor)是一种非常...在实际应用中,拦截器常用于权限控制、性能监控、日志记录等多种场景,是构建高效、安全的Web应用不可或缺的一部分。

    SpringMVC入门很简单之实现注解式权限验证

    在本文中,我们将深入探讨如何在SpringMVC框架中实现注解式的权限验证。SpringMVC是Java领域中广泛使用的Web开发框架,它为开发者提供了强大的功能,包括模型-视图-控制器(MVC)架构、依赖注入以及丰富的注解支持。...

    springmvc入门简单实现

    在"springmvc入门简单实现"这个主题中,你可以按照以下步骤进行学习: 1. **环境搭建**:首先确保安装了Java和Apache Tomcat服务器,然后配置Spring MVC的开发环境,包括添加Spring MVC的依赖到项目中。 2. **创建...

    maven+springmvc+hibernate+shiro权限控制

    在IT行业中,SSH(Spring、Struts、Hibernate)是一个经典的Java Web开发框架组合,而Shiro则是一个强大的安全框架,用于实现用户权限控制。本文将深入探讨如何将这些技术结合在一起,构建一个功能完善的Web应用。 ...

    springMVC简单demo

    这个"springMVC简单demo"压缩包很可能是包含了一个简单的SpringMVC应用,包括了配置文件、控制器类、视图文件等。你可以解压并运行这个项目,观察它如何响应HTTP请求,以及如何处理请求和返回响应。这对于学习...

    简单的SpringMVC小项目(适合刚刚学的)

    3. **权限控制**:实现基于角色的权限控制,限制未登录用户访问敏感资源。 **测试** 项目完成后,需要编写单元测试和集成测试,确保每个功能模块都能正常工作。使用JUnit测试服务层和DAO层,模拟HTTP请求测试...

    SpringMVC框架实现文件的上传和下载

    综上所述,SpringMVC通过提供丰富的API和注解,使得文件的上传和下载变得简单易行。在实际应用中,我们还需要结合前端技术(如HTML5的`&lt;input type="file"&gt;`,Ajax异步提交等)以及安全策略来实现完整的文件管理功能...

    权限管理系统,基于Spring+SpringMvc+MiniJdbc+Shiro为架构的权限管理系统

    本系统采用Spring、SpringMvc、MiniJdbc和Shiro四大核心技术构建,形成了一套高效、灵活的权限控制框架。 首先,Spring作为核心的依赖注入框架,为系统提供了强大的组件管理和事务处理能力。Spring的IoC(Inversion...

    SpringMVC最简单例子

    - 可以通过AOP(面向切面编程)实现日志记录、权限控制等功能。 - 使用ModelAndView对象传递数据到视图。 - 引入视图技术如Thymeleaf或Freemarker,以替代JSP。 - 使用@RequestMapping注解的其他属性进行更复杂...

    基于maven做的一个权限 SpringMVC+Spring + hibernate

    control`:这些可能是项目中的模块划分,`springmvc-utils`可能包含了一些通用工具类,`springmvc-dao`处理数据库操作,`springmvc-service`实现了业务逻辑,而`springmvc-control`则包含了控制器类,负责处理HTTP...

    springMVC简单登陆例子

    在这个"springMVC简单登陆例子"中,我们将深入探讨如何利用SpringMVC实现用户登录功能,并结合MySQL数据库进行数据存储。 首先,SpringMVC是Spring框架的一部分,它通过Model-View-Controller(MVC)设计模式来分离...

    springMVC配置连接数据库实现登录功能的一个小demo

    在这个"springMVC配置连接数据库实现登录功能的小demo"中,我们将探讨如何使用Spring MVC与Hibernate集成来处理用户登录功能。Hibernate是一个流行的ORM(对象关系映射)框架,它简化了与数据库的交互。 首先,我们...

    springMVC实现简单的增删改差操作

    SpringMVC是Spring框架的一部分,专门用于处理Web应用程序的...在实际开发中,还可以结合其他Spring特性,如AOP(面向切面编程)进行事务管理,或使用Spring Security实现权限控制,进一步提升应用的健壮性和安全性。

    springMVC+shiro简单demo

    5. **权限控制**:利用 Shiro 的注解或 Filter 进行 URL 访问权限控制,比如 @RequiresAuthentication 或自定义过滤器。 6. **会话管理**:可能实现了会话超时、会话同步等功能,确保用户在多设备登录时的安全。 7. ...

Global site tag (gtag.js) - Google Analytics