`
format_me
  • 浏览: 31003 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring3.x Security 简单应用

    博客分类:
  • java
 
阅读更多

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;
	}

}

 

分享到:
评论

相关推荐

    SpringSecurity项目

    springsecurity是一个专注于为Java应用程序提供身份验证和授权的框架。与所有Spring项目一样,Spring安全性的真正威力在于它可以很容易地扩展以满足定制需求。 spring security 的核心功能主要包括: 认证 (你是...

    基于SpringSecurity3.x, JasperReport5.x等技术实现仿金蝶权限管理的企业信息管理系统

    所以安全非常重要,本系统基于springSecurity3.x的安全管理,并且使用目前最新报表技术(JasperReport5.1+Ireport5.1)完成交叉表及饼图设计,还给同学们介绍了基于JAX-WS的web应用,全面展示了技术和项目结合。...

    SpringSecurity 3.0.1.RELEASE.CHM

    A.3. ACL表 A.3.1. Hypersonic SQL A.3.1.1. PostgreSQL B. 安全命名空间 B.1. Web应用安全 - 元素 B.1.1. 属性 B.1.1.1. servlet-api-provision B.1.1.2. path-type B.1.1.3. lowercase-comparisons B....

    Spring Security 3应用的11个步骤.doc

    1. Spring Security 11个步骤为应用程序添加安全防护 2. 历史与现状 自2003年出现的Spring扩展插件Acegi Security发展而来。...目前最新 版本为3.x,已成为Spring的一部分。 为J2EE企业应用程序提供可靠的安全性服务。

    Spring Security 中文教程.pdf

    19.3.3. 读取授权 19.4. 实现类 19.4.1. LdapAuthenticator实现 19.4.1.1. 常用功能 19.4.1.2. BindAuthenticator 19.4.1.3. PasswordComparisonAuthenticator 19.4.1.4. 活动目录认证 19.4.2. 链接到...

    spring5.x:spring5.x源码阅读ps

    除Java语言外,Spring还提供了您需要的所有内容,以在各种场景和体系结构中创建企业应用程序。 请阅读参考中的“ 部分以获取更完整的介绍。行为守则该项目受《。 通过参与,您将遵守此守则。 请向报告不可接受的...

    spring security 参考手册中文版

    Spring Security 参考 1 第一部分前言 15 1.入门 16 2.介绍 17 2.1什么是Spring Security? 17 2.2历史 19 2.3版本编号 20 2.4获得Spring安全 21 2.4.1使用Maven 21 Maven仓库 21 Spring框架 22 2.4.2 Gradle 23 ...

    Spring Security-3.0.1中文官方文档(翻译版)

    Spring Security-3.0.1 中文官方文档(翻译版) 这次发布的Spring Security-3.0.1 是一个bug fix 版,主要是对3.0 中存在的一些问题进 行修 正。文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行...

    spring boot 项目代码,直接启动本人编写的,里面包含PPT下载地址

    spring boot 项目代码,直接启动,第一部分 点睛Spring 4.x 第1 章 Spring 基础 ..........................................2 1.1 Spring 概述 ............................................. 2 1.2 Spring 项目...

    JavaEE开发的颠覆者 Spring Boot实战,多个地址免费下载,

    JavaEE开发的颠覆者 Spring Boot实战,多个地址免费下载,第一部分 点睛Spring 4.x 第1 章 Spring 基础 ..........................................2 1.1 Spring 概述 ................................................

    tutorial-spring-ad-security:使用Active Directory进行身份验证和授权的非常简单的Spring 4.x Webapp

    Spring 4.0安全性示例李·维特森(Lee Vettleson)概述该项目的目的是提供使用Spring Security的Web应用程序的隔离示例。 它专门利用Active Directory服务进行身份验证和角色成员身份。依存关系 入门建立: &gt; gradle...

    JavaEE开发的颠覆者+Spring+Boot实战++完整版

    而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。, 《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而...

    spring security3.2.0

    Spring Security 为基于J2EE企业应用软件提供了全面安全服务。特别是使用领先的J2EE解决方案-Spring框架开发的企业软件项目。人们使用Spring Security有很多种原因,不过通常吸引他们的是在J2EE Servlet规范或EJB...

    基于Spring Boot 2.x的一站式前后端分离快速开发平台

    基于Spring Boot 2.x的一站式前后端分离快速开发平台,XBoot 微信小程序+Uniapp 前端:Vue+iView Admin 后端:Spring Boot 2.x/Spring Security/JWT/JPA+Mybatis-Plus/Redis/Elasticsearch/Activiti 分布式限流/同步...

    基于SpringCloud架构的可生产用的新零售商城系统源码.zip

    基于Spring Boot 2.0.X、Spring Cloud Finchley和Spring Cloud Alibaba 深度定制Spring Security真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案 提供应用管理,方便第三方系统接入 引入组件化的...

    Spring攻略PDF版

     第6章 Spring 2.x AOP和AspectJ支持  第二部分 基础主题  第7章 Spring对JDBC的支持   第8章 Spring中的事务管理   第9章 Spring对ORM的支持   第10章 Spring MVC框架   第11章 整合Spring...

    Spring攻略中文版PDF

     第6章 Spring 2.x AOP和AspectJ支持  第二部分 基础主题  第7章 Spring对JDBC的支持   第8章 Spring中的事务管理   第9章 Spring对ORM的支持   第10章 Spring MVC框架   第11章 整合Spring...

    Spring攻略英文版(附带源码)

     第6章 Spring 2.x AOP和AspectJ支持  第二部分 基础主题  第7章 Spring对JDBC的支持   第8章 Spring中的事务管理   第9章 Spring对ORM的支持   第10章 Spring MVC框架   第11章 整合Spring与其他...

    核心技术采用Spring、SpringSecurity 、MyBatis 的轻量企业级开发脚手架

    基于SpringBoot2.X 的企业级开发脚手架 核心技术采用Spring、SpringSecurity 、MyBatis 的轻量企业级开发脚手架

    spring-security-saml:Spring Security项目的SAML扩展

    SpringSAML Spring SAML Extension允许在Spring应用程序中无缝包含SAML 2.0 Service Provider功能。 可以使用在身份提供者模式下支持SAML 2.0的所有产品(例如ADFS 2.0,Shibboleth,OpenAM / OpenSSO,Ping ...

Global site tag (gtag.js) - Google Analytics