Shiro系列之Shiro+Spring MVC整合
第一步,Shiro Filter
在web.xml文件中增加以下代码,确保Web项目中需要权限管理的URL都可以被Shiro拦截过滤。
<!-- Shiro Filter --> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
通常将这段代码中的filter-mapping放在所有filter-mapping之前,以达到shiro是第一个对web请求进行拦截过滤之目的。这里的fileter-name应该要和第二步中配置的java bean的id一致。
第二步,配置各种Java Bean
在root-context.xml文件中配置Shiro
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Root Context: defines shared resources visible to all other web components --> <!-- dataSource --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:3306/etao_java" /> <property name="username" value="root" /> <property name="password" value="cope9020" /> </bean> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"></bean> <!-- 数据库保存的密码是使用MD5算法加密的,所以这里需要配置一个密码匹配对象 --> <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.Md5CredentialsMatcher"></bean> <!-- 缓存管理 --> <bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager"></bean> <!-- 使用Shiro自带的JdbcRealm类 指定密码匹配所需要用到的加密对象 指定存储用户、角色、权限许可的数据源及相关查询语句 --> <bean id="jdbcRealm" class="org.apache.shiro.realm.jdbc.JdbcRealm"> <property name="credentialsMatcher" ref="credentialsMatcher"></property> <property name="permissionsLookupEnabled" value="true"></property> <property name="dataSource" ref="dataSource"></property> <property name="authenticationQuery" value="SELECT password FROM sec_user WHERE user_name = ?"></property> <property name="userRolesQuery" value="SELECT role_name from sec_user_role left join sec_role using(role_id) left join sec_user using(user_id) WHERE user_name = ?"></property> <property name="permissionsQuery" value="SELECT permission_name FROM sec_role_permission left join sec_role using(role_id) left join sec_permission using(permission_id) WHERE role_name = ?"></property> </bean> <!-- Shiro安全管理器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="jdbcRealm"></property> <property name="cacheManager" ref="cacheManager"></property> </bean> <!-- Shiro主过滤器本身功能十分强大,其强大之处就在于它支持任何基于URL路径表达式的、自定义的过滤器的执行 Web应用中,Shiro可控制的Web请求必须经过Shiro主过滤器的拦截,Shiro对基于Spring的Web应用提供了完美的支持 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- Shiro的核心安全接口,这个属性是必须的 --> <property name="securityManager" ref="securityManager"></property> <!-- 要求登录时的链接(登录页面地址),非必须的属性,默认会自动寻找Web工程根目录下的"/login.jsp"页面 --> <property name="loginUrl" value="/security/login"></property> <!-- 登录成功后要跳转的连接(本例中此属性用不到,因为登录成功后的处理逻辑在LoginController里硬编码) --> <!-- <property name="successUrl" value="/" ></property> --> <!-- 用户访问未对其授权的资源时,所显示的连接 --> <property name="unauthorizedUrl" value="/"></property> <property name="filterChainDefinitions"> <value> /security/*=anon /tag=authc </value> </property> </bean> <!-- 开启Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP扫描使用Shiro注解的类, 并在必要时进行安全逻辑验证 --> <!-- <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"></property> </bean> --> </beans>
上述代码中已经对每个java bean的用途做了详细的注释说明,这里仅对FilterChain过滤链的定义详细阐述一下:
- 测试用例中对/security/*的访问是不需要认证控制的,这主要是用于用户登录和退出的
- 测试用例中对/tag的访问是需要认证控制的,就是说只有通过认证的用户才可以访问该资源。如果用户直接在地址栏中访问http://localhost:8880/learning/tag,系统会自动跳转至登录页面,要求用户先进行身份认证。
完成这两步之后,我们可以Run一下程序,如果可以看到以下页面,就表明我们的配置文件没有错误,Shiro和Spring MVC的整合已经完成了。后继的步骤可以视为是对整合后的框进行的一个测试。
第三步,编写登录页面和后台代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Login Page</title> </head> <body> <h1>login page</h1> <form id="" action="dologin" method="post"> <label>User Name</label> <input tyep="text" name="userName" maxLength="40" /> <label>Password</label><input type="password" name="password" /> <input type="submit" value="login" /> </form> <%--用于输入后台返回的验证错误信息 --%> <P><c:out value="${message }" /></P> </body> </html>
后台登录代码
/** * 实际的登录代码 * 如果登录成功,跳转至首页;登录失败,则将失败信息反馈对用户 * * @param request * @param model * @return */ @RequestMapping(value = "/dologin") public String doLogin(HttpServletRequest request, Model model) { String msg = ""; String userName = request.getParameter("userName"); String password = request.getParameter("password"); System.out.println(userName); System.out.println(password); UsernamePasswordToken token = new UsernamePasswordToken(userName, password); token.setRememberMe(true); Subject subject = SecurityUtils.getSubject(); try { subject.login(token); if (subject.isAuthenticated()) { return "redirect:/"; } else { return "login"; } } catch (IncorrectCredentialsException e) { msg = "登录密码错误. Password for account " + token.getPrincipal() + " was incorrect."; model.addAttribute("message", msg); System.out.println(msg); } catch (ExcessiveAttemptsException e) { msg = "登录失败次数过多"; model.addAttribute("message", msg); System.out.println(msg); } catch (LockedAccountException e) { msg = "帐号已被锁定. The account for username " + token.getPrincipal() + " was locked."; model.addAttribute("message", msg); System.out.println(msg); } catch (DisabledAccountException e) { msg = "帐号已被禁用. The account for username " + token.getPrincipal() + " was disabled."; model.addAttribute("message", msg); System.out.println(msg); } catch (ExpiredCredentialsException e) { msg = "帐号已过期. the account for username " + token.getPrincipal() + " was expired."; model.addAttribute("message", msg); System.out.println(msg); } catch (UnknownAccountException e) { msg = "帐号不存在. There is no user with username of " + token.getPrincipal(); model.addAttribute("message", msg); System.out.println(msg); } catch (UnauthorizedException e) { msg = "您没有得到相应的授权!" + e.getMessage(); model.addAttribute("message", msg); System.out.println(msg); } return "login"; }
如果输入不存在的用户名或是错误的密码界面上会有相应的提示信息。
登录成功后,会转至首页,并显示出当前用户名。
相关推荐
同时,Spring MVC 集成了其他 Spring 模块,如 AOP、Data Access/Integration,使得整个系统的集成度更高。 四、后台管理系统构建实践 在实际项目中,结合 Spring3、Hibernate4 和 Spring MVC3 可以构建出一套高效...
6. **Web支持(Web Integration)**:Shiro可以轻松地与Spring MVC等Web框架集成,提供基于HTTP Session的会话管理和Web安全控制。 7. **测试支持(Testing)**:Shiro提供了测试类,方便开发者在单元测试中模拟...
Apache Shiro 和 SSM(Spring MVC、Spring、MyBatis)是Java开发中常见的两个框架。Shiro 是一个强大且易用的安全管理框架,而SSM则是常用的后端开发组合,用于构建基于Java的Web应用。这个压缩包包含了这两个框架在...
本文将深入探讨Spring与Shiro的集成,以及"shirospring"源码中的关键知识点。 首先,我们要理解Spring如何集成Shiro。Spring通过其强大的依赖注入(DI)和AOP(面向切面编程)特性,可以轻松地将Shiro的功能整合到...
7. **安全考虑**:整合Spring Security或Apache Shiro等安全框架,为Flex应用提供身份验证和授权功能。 8. **优化性能**:通过缓存、异步请求、合理设计数据传输结构等方式优化Spring和Flex之间的通信,提高用户...
9. `spring-integration-core-4.0.5.RELEASE.jar`: 这是Spring Integration库,用于在不同系统之间实现低耦合的消息传递。结合Shiro,可以实现安全控制的自动化流程,如基于事件的安全决策。 这些依赖包组合起来,...
这种集成通常涉及到Spring MVC或Spring Boot的应用。 #### 12.3 Shiro权限注解 Shiro提供了与Spring框架兼容的权限注解,可以方便地在控制器或服务层方法上声明所需的权限。 ### 第十三章:RememberMe #### 13.1...
SSM指的是Spring、Spring MVC和MyBatis这三个框架的组合,而Shiro则是Apache组织提供的一个安全框架。下面将详细阐述这些组件以及它们在权限管理中的作用。 1. **Spring**:Spring是一个开源的应用框架,提供IOC...
《Spring与Struts2整合构建图书管理系统》 在IT领域,Spring框架以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)能力,以及丰富的模块支持,成为了Java企业级...
Spring、Spring Boot、Spring MVC 持久层 MyBatis、MyBatis-Plus 数据源 Druid 权限框架 Shiro 模板引擎 thymeleaf SAP访问 sapjco3 定时任务调度 Quartz 前端 描述 框架 核心框架 、 路由框架 (纯js轻量级路由...
【Spring+SpringMVC+MyBatis 会议管理系统】是一个基于JavaWeb开发的典型应用,它结合了Spring框架的核心功能、SpringMVC的MVC设计模式以及MyBatis的持久层处理,为实现高效的会议管理提供了强大的技术支撑。...
8. **单元测试与集成测试**:学习如何编写JUnit测试用例,使用Mockito等工具进行模拟测试,以及如何进行Spring MVC的Integration Testing。 9. **异常处理**:理解全局异常处理机制,如何自定义异常并优雅地显示...
同时,Spring Security可以轻松地与其他Spring项目集成,比如与Spring MVC和Spring Boot无缝集成。 7. 密码存储(Password Storage): 出于安全考虑,Spring Security不存储明文密码。它支持密码的散列存储,可以...
- 可能使用Spring Security或Apache Shiro进行权限管理,实现用户登录、角色分配、访问控制等功能。 7. **WebSocket**: - 实时通信可能通过WebSocket实现,如陪诊状态的实时更新,保证信息即时传递。 8. **前后...
- 安全框架:Spring Security或Apache Shiro,用于用户认证和授权,保护系统资源不被非法访问。 - 缓存技术:如Redis,用于提高数据读取速度和减轻数据库压力。 - 日志管理:Log4j或Logback,记录系统运行日志,便于...
6. **安全性**:Spring Security或者Shiro可能被用来处理用户的登录、权限控制等问题,确保只有授权的用户才能访问特定功能。 7. **前端技术**:项目的前端可能使用HTML、CSS和JavaScript,配合jQuery或Vue.js等库...
2. **Spring框架**: Spring是目前最流行的Java Web框架之一,以其依赖注入(DI)和面向切面编程(AOP)为核心,提供了完整的MVC(Model-View-Controller)架构。Spring Boot简化了Spring应用的初始化和配置,而...
在呼叫中心系统中,Spring MVC可用来处理HTTP请求,而Spring Integration可以实现不同系统间的集成,如CRM系统、数据库等。 3. **Web服务**:RESTful API和SOAP协议可用于呼叫中心与外部系统的交互,例如CRM系统、...
SSI可能是指Spring Security和Spring Integration,用于安全管理和系统集成。 - **Eclipse、MyEclipse**:这是两款常用的Java开发IDE,提供了便捷的代码编写、调试和项目管理功能。 - **MySQL、Oracle**:是两种...
13. **安全机制**:Spring Security或Apache Shiro可能被用来处理认证和授权,保护应用的安全。 为了全面理解这个项目,你需要解压文件并查看源代码,了解具体的目录结构、配置文件以及代码实现。同时,阅读README...