用过了Spring Security,一般都不会采用这种简单的自定义方式.自定义当然灵活自由,越要完善,也就意味做的工作越多.使用框架,别人考虑得相对周到,比如spring security的防止攻击就有session fixation, clickjacking, cross site request forgery.以下的简单实现的权限控制虽然可以去实现这样的功能,但就没必要了.当然这个模型是包含认证和授权.
1.写一个自定义注解(功能类似于spring security的@PreAuthorize)
- package org.exam.auth;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface Auth {
- String value() default "";
- String name() default "";
- }
2.写一个拦截器.
- package org.exam.auth;
- import org.springframework.http.HttpStatus;
- import org.springframework.web.method.HandlerMethod;
- import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.PrintWriter;
- import java.util.Set;
- public class AuthInterceptor extends HandlerInterceptorAdapter {
- public static final String SESSION_USERID = "kUSERID";
- public static final String SESSION_AUTHS = "kAUTHS";
- @Override
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- boolean flag = true;
- if (handler instanceof HandlerMethod) {
- Auth auth = ((HandlerMethod) handler).getMethod().getAnnotation(Auth.class);
- if (auth != null) {// 有权限控制的就要检查
- if (request.getSession().getAttribute(SESSION_USERID) == null) {// 没登录就要求登录
- response.setStatus(HttpStatus.FORBIDDEN.value());
- response.setContentType("text/html; charset=UTF-8");
- PrintWriter out=response.getWriter();
- out.write("{\"type\":\"nosignin\",\"msg\":\"请您先登录!\"}");
- out.flush();
- out.close();
- flag = false;
- } else {// 登录了检查,方法上只是@Auth,表示只要求登录就能通过.@Auth("authority")这类型,验证用户权限
- if (!"".equals(auth.value())) {
- Set<String> auths = (Set<String>) request.getSession().getAttribute(SESSION_AUTHS);
- if (!auths.contains(auth.value())) {// 提示用户没权限
- response.setStatus(HttpStatus.FORBIDDEN.value());
- response.setContentType("text/html; charset=UTF-8");
- PrintWriter out=response.getWriter();
- out.write("{\"type\":\"noauth\",\"msg\":\"您没有"+auth.name()+"权限!\"}");
- out.flush();
- out.close();
- flag = false;
- }
- }
- }
- }
- }
- return flag;
- }
- }
处理controller的@RequestMapping方法(这里的处理直接通过response处理,spring security先抛异常,然后再统一处理异常):
a.如果这个方法没有使用Auth注解,会认为没有作权限控制,任何人可以访问.
b.如果这个方法只标注了@Auth,如果用户没登录,会返回一个403,并提示用户登录.
c.如果这个方法标注了具体需要某种权限,如@Auth("authority"),就要求用户必须有这种权限,否则返回403,并提示用户没有权限,这里相当于实现授权,并且授权之前先认证.
3.让拦截器起作用.重写org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter#addInterceptors方法
- @Configuration
- @ComponentScan(basePackages={"org.exam.web"})
- @EnableWebMvc
- public class MvcConfig extends WebMvcConfigurerAdapter{
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- registry.addInterceptor(new AuthInterceptor());
- }
- //其它略...
- }
4.用户登录(只做了一个模拟登录)和具体使用,剩下的就可以测试了.
- @Controller
- @RequestMapping("/user")
- public class UserController {
- @RequestMapping("/login")
- @ResponseBody
- public boolean login(HttpSession session,User user){
- boolean result=false;
- //模拟从数据库查出存在这样的用户
- Long userId=user.getId();
- if(userId!=null&&userId>0){
- session.setAttribute(AuthInterceptor.SESSION_USERID, userId);
- session.setAttribute(AuthInterceptor.SESSION_AUTHS, new HashSet<String>(Arrays.asList("user_list", "user_query", "user_save")));
- result=true;
- }
- return result;
- }
- @Auth("user_queryXXXX")
- @RequestMapping("/query")
- @ResponseBody
- public String query(){
- System.out.println("query");
- return getClass().toString();
- }
- @Auth("user_list")
- @RequestMapping("/list")
- @ResponseBody
- public String list(){
- System.out.println("list");
- return getClass().toString();
- }
- @Auth("user_save")
- @RequestMapping("/add")
- public String add(User user){
- System.out.println("add:"+user);
- return "user/add";
- }
- }
相关推荐
10. **安全框架集成**:为了更高效地实现权限控制,可以考虑集成Spring Security或Shiro等安全框架,它们提供了更全面的权限管理和认证机制。 通过以上步骤,我们可以构建一个基本的SpringMVC+Mybatis整合的权限...
在本项目中,"panda-springmvc"是一个简易版的SpringMVC框架实现,旨在帮助理解其核心概念和工作流程。 首先,让我们深入了解一下SpringMVC的核心组件: 1. **DispatcherServlet**:这是SpringMVC的前端控制器,...
**SpringMVC+Shiro权限管理** 在现代Web应用程序开发中,权限管理和用户认证是至关重要的组成部分。...通过深入学习和实践这个项目,开发者可以掌握如何在实际项目中实现复杂的权限控制和用户管理。
综上所述,"基于SpringMVC+EasyUI+权限控制的后台管理系统"整合了强大的后端处理能力与直观的前端展示效果,结合数据库,可快速搭建出功能完备的管理平台。在实际应用中,开发者通常还需要考虑权限控制,例如基于...
本实验报告将探讨如何利用 SpringMVC 的拦截器(Interceptor)来实现用户登录权限验证,确保只有已登录的用户才能访问特定的受保护资源。 首先,我们来看一下实验的基本步骤: 1. 创建 `User` 类:这是表示用户...
在这个实例中,可能包括了用户登录验证、角色权限控制等,使得只有拥有特定权限的用户才能访问特定资源。这通常通过拦截器实现,比如SpringMVC中的HandlerInterceptor,可以在请求处理前进行预处理,如检查用户权限...
**SpringMVC 拦截器实现登录退出功能** 在SpringMVC框架中,拦截器(Interceptor)是一种非常...在实际应用中,拦截器常用于权限控制、性能监控、日志记录等多种场景,是构建高效、安全的Web应用不可或缺的一部分。
在本文中,我们将深入探讨如何在SpringMVC框架中实现注解式的权限验证。SpringMVC是Java领域中广泛使用的Web开发框架,它为开发者提供了强大的功能,包括模型-视图-控制器(MVC)架构、依赖注入以及丰富的注解支持。...
在"springmvc入门简单实现"这个主题中,你可以按照以下步骤进行学习: 1. **环境搭建**:首先确保安装了Java和Apache Tomcat服务器,然后配置Spring MVC的开发环境,包括添加Spring MVC的依赖到项目中。 2. **创建...
在IT行业中,SSH(Spring、Struts、Hibernate)是一个经典的Java Web开发框架组合,而Shiro则是一个强大的安全框架,用于实现用户权限控制。本文将深入探讨如何将这些技术结合在一起,构建一个功能完善的Web应用。 ...
这个"springMVC简单demo"压缩包很可能是包含了一个简单的SpringMVC应用,包括了配置文件、控制器类、视图文件等。你可以解压并运行这个项目,观察它如何响应HTTP请求,以及如何处理请求和返回响应。这对于学习...
3. **权限控制**:实现基于角色的权限控制,限制未登录用户访问敏感资源。 **测试** 项目完成后,需要编写单元测试和集成测试,确保每个功能模块都能正常工作。使用JUnit测试服务层和DAO层,模拟HTTP请求测试...
综上所述,SpringMVC通过提供丰富的API和注解,使得文件的上传和下载变得简单易行。在实际应用中,我们还需要结合前端技术(如HTML5的`<input type="file">`,Ajax异步提交等)以及安全策略来实现完整的文件管理功能...
本系统采用Spring、SpringMvc、MiniJdbc和Shiro四大核心技术构建,形成了一套高效、灵活的权限控制框架。 首先,Spring作为核心的依赖注入框架,为系统提供了强大的组件管理和事务处理能力。Spring的IoC(Inversion...
- 可以通过AOP(面向切面编程)实现日志记录、权限控制等功能。 - 使用ModelAndView对象传递数据到视图。 - 引入视图技术如Thymeleaf或Freemarker,以替代JSP。 - 使用@RequestMapping注解的其他属性进行更复杂...
control`:这些可能是项目中的模块划分,`springmvc-utils`可能包含了一些通用工具类,`springmvc-dao`处理数据库操作,`springmvc-service`实现了业务逻辑,而`springmvc-control`则包含了控制器类,负责处理HTTP...
在这个"springMVC简单登陆例子"中,我们将深入探讨如何利用SpringMVC实现用户登录功能,并结合MySQL数据库进行数据存储。 首先,SpringMVC是Spring框架的一部分,它通过Model-View-Controller(MVC)设计模式来分离...
在这个"springMVC配置连接数据库实现登录功能的小demo"中,我们将探讨如何使用Spring MVC与Hibernate集成来处理用户登录功能。Hibernate是一个流行的ORM(对象关系映射)框架,它简化了与数据库的交互。 首先,我们...
SpringMVC是Spring框架的一部分,专门用于处理Web应用程序的...在实际开发中,还可以结合其他Spring特性,如AOP(面向切面编程)进行事务管理,或使用Spring Security实现权限控制,进一步提升应用的健壮性和安全性。
5. **权限控制**:利用 Shiro 的注解或 Filter 进行 URL 访问权限控制,比如 @RequiresAuthentication 或自定义过滤器。 6. **会话管理**:可能实现了会话超时、会话同步等功能,确保用户在多设备登录时的安全。 7. ...