Security 配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="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-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> <!-- 不需要权限控制的资源 --> <http pattern="/favicon.ico" security="none" /> ...... <!-- 404页面 --> <http pattern="/404.html" security="none" /> <!-- 过滤器链 --> <http auto-config="true" access-decision-manager-ref="accessDecisionManager" disable-url-rewriting="true" request-matcher="ant"> <intercept-url pattern="/**" access="IS_AUTHENTICATED_REMEMBERED" /> <!-- 登录控制 --> <form-login login-page="/login/login.do" login-processing-url="/doLogin.do" authentication-success-handler-ref="loginSuccessHandler" authentication-failure-handler-ref="loginFailureHandler" /> <!-- 退出链接 --> <logout logout-url="/logout.do" /> <!-- 控制同时只能有一个相同的用户登录 --> <session-management invalid-session-url="/login/login.do"> <concurrency-control max-sessions="1" error-if-maximum-exceeded="false" expired-url="/login/login.do" /> </session-management> <!-- 记住我 --> <remember-me services-ref="rememberMeServices" key="rocks" use-secure-cookie="false" authentication-success-handler-ref="rememberMeSuccessHandler" /> <!-- 自定义Filter --> <custom-filter ref="urlAuthenticationFilter" after="LAST" /> </http> <!-- 自定义Filter实现 --> <beans:bean id="urlAuthenticationFilter" class="com.xxx.security.UrlAuthenticationFilter" /> <!-- 登录成功处理 --> <beans:bean id="loginSuccessHandler" class="com.xxx.security.LoginSuccessHandler" /> <!-- 登录失败处理 --> <beans:bean id="loginFailureHandler" class="com.xxx.security.LoginFailureHandler" /> <!-- 通过记住我登录成功处理 --> <beans:bean id="rememberMeSuccessHandler" class="com.xxx.security.RememberMeSuccessHandler" /> <!-- 密码加密方式 --> <beans:bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" /> <!-- 权限控制 --> <authentication-manager alias="authenticationManager" erase-credentials="false"> <authentication-provider user-service-ref="customerDetailsBiz"> <password-encoder ref="passwordEncoder"> </password-encoder> </authentication-provider> </authentication-manager> <!-- 记住我登录流程 --> <beans:bean id="rememberMeServices" class="com.xxx.customer.biz.CustomerRememberMeBiz"> <beans:property name="userDetailsService" ref="customerDetailsBiz" /> <beans:property name="key" value="rocks" /> </beans:bean> <!-- Spring UserDetailsService接口实现类 主要是从数据库查找准备登录的用户 --> <beans:bean id="customerDetailsBiz" class="com.xxx.customer.biz.CustomerDetailsBiz" /> <!-- 投票器 --> <beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"> <beans:property name="allowIfAllAbstainDecisions" value="false" /> <beans:property name="decisionVoters"> <beans:list> <beans:bean class="org.springframework.security.access.vote.AuthenticatedVoter" /> </beans:list> </beans:property> </beans:bean> </beans:beans>
登录成功处理:
LoginSuccessHandler
package com.xxx.security; /** * 用户登录成功后处理 * * @author Theodore * */ public class LoginSuccessHandler implements AuthenticationSuccessHandler { private static final Log log = LogFactory.getLog(LoginSuccessHandler.class); @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication auth) throws IOException, ServletException { log.debug("...LoginSuccessHandler@onAuthenticationSuccess..."); // 登录日志之类 } /** * 获取客户端IP * * @param request * @return */ public String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } log.debug("ip:::" + ip); return ip; } }
登录失败处理:
loginFailureHandler
package com.xxx.security; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 登录失败逻辑处理 * * @author Theodore * */ public class LoginFailureHandler implements AuthenticationFailureHandler { // private static final Log log = // LogFactory.getLog(LoginFailureHandler.class); @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { //登录失败处理,例如向客户端输出失败信息 } }
记住我:
RememberMeSuccessHandler
package com.xxx.security; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * 用户登录成功后处理 * * @author Theodore * */ public class RememberMeSuccessHandler implements AuthenticationSuccessHandler { private static final Log log = LogFactory .getLog(RememberMeSuccessHandler.class); @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication auth) throws IOException, ServletException { log.debug("...RememberMeSuccessHandler@onAuthenticationSuccess..."); // 登录日志 } /** * 获取客户端IP * * @param request * @return */ public String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } }
CustomerDetailsBiz
import java.util.List; /** * 查找指定用户 * @author Theodore * */ public class CustomerDetailsBiz extends BaseBiz<Customer, CustomerDao> implements UserDetailsService { private static final Log log = LogFactory.getLog(CustomerDetailsBiz.class); @Resource private CustomerBiz xxxBiz; /** * * <p> * 根据后台用户名查找用户并加载用户的详细信息 * </p> * * @param * @return UserDetails * @throws */ @Override public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException { Customer customer = xxxBiz.getCustomer(userId); if (customer != null) { //如果该用户可以登录 } else { //如果没有找到该用户,需要创建一个空对象 customer = new Customer(); } return customer; } }
相关推荐
《Spring 3.x 企业应用开发实战》lib包是一个针对Spring框架3.x版本的实践教程配套资源,其中包含了在实际项目开发中可能用到的各种库文件。这些库文件是Spring框架与其他外部组件交互的关键,它们可以帮助开发者...
《精通Spring4.x+企业应用开发实战》这本书的配套光盘包含了丰富的源码和资源,旨在帮助读者深入理解和掌握Spring4.x框架在实际企业开发中的应用。Spring4.x是Java领域中最受欢迎的轻量级开源框架之一,它以其模块化...
《Spring 3.x企业应用开发实战》是一本深入讲解Spring框架在企业级应用程序开发中的实践指南。这本书专注于Spring 3.x版本,该版本是Spring框架发展史上的一个重要里程碑,引入了许多新特性和改进,旨在提升开发效率...
《精通Spring4.x企业应用开发实战》是一本深入解析Spring框架在企业级应用中的实践指南。这本书涵盖了Spring框架的核心概念、重要特性和实际应用,旨在帮助开发者熟练掌握Spring4.x版本的各种开发技能,以提高软件...
10. **Spring Security**:Spring3.X集成了Spring Security,为应用程序提供了全面的安全管理解决方案,包括认证、授权和访问控制。 源码光盘包含的实例代码可以帮助读者更好地理解这些概念和用法,通过实际操作...
Spring 4.x 是一个重要的Java框架,专注于简化企业级应用程序开发。这个版本的Spring框架引入了许多新特性,改进和优化,以适应不断变化的开发需求和技术趋势。在本文中,我们将深入探讨Spring 4.x的核心特性、优势...
本教程将详细讲解如何在Spring Boot 3.x版本中结合Spring Security的最新版实现JWT(JSON Web Token)登录验证。 首先,让我们了解JWT。JWT是一种轻量级的身份认证和授权机制,它以JSON对象的形式在客户端和服务器...
10. **Spring Security**:Spring3.x还提供了Spring Security框架,用于实现企业级的安全管理,包括身份验证、授权等功能,保护应用程序免受未经授权的访问。 这个压缩包中的源代码涵盖了以上所有知识点的实践示例...
根据提供的文件信息,可以推断出您所询问的是关于《Spring 3.x 企业应用开发实战》这本书的内容。该书是关于Spring框架的一个实用指南,主要面向那些需要在企业级环境中使用Spring进行应用程序开发的Java开发者。...
根据提供的文件信息,本次将重点围绕“精通Spring 4.x企业应用开发实战”这一主题进行深入探讨,并结合标题、描述及部分提及的内容展开详细的讲解。 ### Spring框架简介 Spring框架是一个开源的应用框架,由Rod ...
《精通Spring 4.x 企业应用开发实战》是一本深入探讨Spring框架在企业级应用中的实践与源码解析的书籍。Spring作为Java领域最流行的开源框架之一,它为开发者提供了全面的解决方案,包括依赖注入、面向切面编程、...
《Spring 3.x企业应用开发实战》是一本深入讲解Spring框架在实际企业级项目中应用的书籍,由陈雄华撰写。这本书全面覆盖了Spring 3.x版本的关键特性和最佳实践,旨在帮助开发者掌握如何利用Spring构建高效、稳定且可...
《Spring 3.x企业应用开发实战》这本书是针对Spring框架3.x版本的详细指南,旨在帮助开发者深入理解和熟练运用Spring框架进行企业级应用的开发。Spring作为Java领域中最流行的轻量级框架之一,其强大的功能和灵活性...
《Spring 4.x:企业应用开发实战精通》是Spring框架在4.x版本时期的经典实战教程。这本书深入浅出地介绍了如何使用Spring框架构建高效、稳定的企业级应用程序。Spring作为Java领域的重要框架,以其模块化、松耦合和...
在本资源中,"Spring 3.x企业应用开发实战光盘源码part02" 提供了Spring框架3.x版本的企业级应用开发实例代码。这部分是整个教程源码的第二部分,暗示着可能存在一个第一部分,可能包含了基础的设置和初始化工作。...
《Spring 4.x 企业开发应用实战》这本书深入探讨了Spring框架在企业级应用程序开发中的应用,涵盖了Spring 4.x版本的重要特性和最佳实践。Spring作为Java生态系统中最受欢迎的轻量级框架,它提供了全面的解决方案,...
《Spring3.x企业应用开发实战》是一本深入探讨Spring框架在企业级开发中的应用书籍,其光盘源码是学习过程中宝贵的参考资料。Spring框架作为Java领域最流行的应用框架之一,以其强大的依赖注入(DI)和面向切面编程...
《精通Spring 4.X:企业应用开发实战精通》是一本由陈雄华编著的书籍,专注于Spring 4.x框架的深度解析与实践应用。Spring作为Java领域最流行的应用框架,其4.x版本在功能、性能和易用性上都有显著提升。这本书详细...
安全性方面,Spring Security 4.x.x与Spring 4.x.x紧密集成,提供了全面的身份验证和授权功能,包括OAuth2支持,保护了Web应用和RESTful API的安全。 总的来说,Spring 4.x.x中文文档将涵盖这些关键领域的详细内容...
《Spring 3.x 企业应用开发实战》一书的源码是针对Spring框架3.x版本进行深入学习和实践的重要资源。Spring是一个广泛使用的Java企业级应用程序框架,它提供了丰富的功能,包括依赖注入、面向切面编程、事务管理、...