`
hawkist
  • 浏览: 35955 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

构建基于maven的综合项目(三)--spring security

阅读更多
一、添加spring security3 简单验证
    1、添加jar;
<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-core</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>
		<dependency>
	        <groupId>org.springframework.security</groupId>
	        <artifactId>spring-security-web</artifactId>
	        <version>${org.springframework.version}</version>
	    </dependency>
	    <dependency>
	        <groupId>org.springframework.security</groupId>
	        <artifactId>spring-security-config</artifactId>
	        <version>${org.springframework.version}</version>
	    </dependency>

    2、web.xml添加过滤器和监听器
<!-- spring security过滤器 
	-->
	<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
……
<!-- 监听session是否过期 -->
	<listener>
		<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
	</listener>

    3、引入springSecuritySimple-config.xml
<?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.0.xsd">
	<!--  
		启用安全注解和安全切点
		启用spring security的@Secured和JSR-250注解
		向类和方法添加注解,限制方法或类的访问,eg.@Secured("ROLE_TELLER")
		pre-post-annotations="enabled":基于表达式的注解形式,eg.@PreAuthorize("hasAuthority('ROLE_TELLER')")
		protect-pointcut:添加安全切点
			com.cpkf.notpad.server.impl包下所有ServiceImpl结尾的类,只有ROLE_ADMIN角色才能调用其方法
	<global-method-security 
		secured-annotations="enabled" 
		jsr250-annotations="enabled" 
		pre-post-annotations="enabled" >
		<protect-pointcut 
			access="execution(* com.cpkf.notpad.server.impl.*ServiceImpl.*(..))" 
			expression="ROLE_ADMIN"/>
	</global-method-security>
	-->
	<!--  
		auto-config:包含<form-login />、<http-basic />、<logout />三项默认配置,如果自己配置则覆盖默认配置
		access-denied-page:出错(eg没有权限)后跳转的页面,没有该属性,则抛出403错误-访问指定资源被禁止
		access-decision-manager-ref="accessDecisionManager":当角色名前缀不是ROLE_时,需要自定义访问策略管理器
	-->
	<http auto-config="true" 
		access-denied-page="/403.jsp" 
		>
		<!--  
			拦截器,设定哪些路径需要哪些权限访问
			access="ROLE_USER" 我们要保护应用程序中所有的url,只有ROLE_USER角色才能访问
			filters=true 不使用过滤器
			requires-channel:信道安全,可选any、http、https
		-->
		<intercept-url pattern="/**" access="ROLE_ADMIN" requires-channel="any"/>
		<intercept-url pattern="/login.jsp" filters="none"/>
		<intercept-url pattern="/loginError.do" filters="none"/>
		<intercept-url pattern="/redirectAddUser.do" filters="none"/>
		<intercept-url pattern="/common/**" filters="none"/>
		<intercept-url pattern="/styles/**" filters="none"/>
		<!--  
			login-page:默认登陆页面
			login-processing-url:登陆系统请求,默认j_spring_security_check
			always-use-default-target:身份验证通过后,总是跳转default-target-url
			default-target-url:成功登陆后跳转的页面
			authentication-failure-url:出错(用户名或密码不正确)后跳转页面
		-->
		<form-login login-page="/login.jsp" 
			always-use-default-target="true" 
			default-target-url="/securityLogin.do" 
			authentication-failure-url="/loginError.do" />
		<!-- 
			logout-url:退出系统请求,默认/j_spring_security_logout
			logout-success-url:成功注销后跳转的页面
			invalidate-session:退出系统时候是否报销session
		-->
		<logout logout-success-url="/login.jsp" 
			invalidate-session="true" />
		<!--  
			会话管理:在web.xml中配置监听session的监听器
			invalid-session-url:会话超时跳转请求
			session-fixation-protection="migrateSession":创建新session,并复制以前session信息
				none:什么也不做,继续使用原来的session
				newSession:创建新session,不会复制原有数据
			max-sessions:每个用户在同一时间拥有的会话数
			error-if-maximum-exceeded="true":禁止两次登陆
		-->
		<session-management 
			invalid-session-url="/sessionTimeout.do" 
			session-fixation-protection="migrateSession">
			<concurrency-control max-sessions="1" 
				error-if-maximum-exceeded="true"/>
		</session-management>
		<!-- 如果应用不是标准端口,用以下配置 
		<port-mappings>
			<port-mapping http="" https=""/>
		</port-mappings>
		-->
		<!--  
			spring security提供了一个过滤器链来提供服务,我们可以将自己的过滤器添加到过滤器链中特定位置
			position属性代替过滤器链中的过滤器,但是不能替换http自己创建使用的过滤器
				SecurityContextPersistenceFilter,ExceptionTranslationFilter或FilterSecurityInterceptor
			before和before属性插入自定义过滤器
		<custom-filter ref="myFilter" before="FILTER_SECURITY_INTERCEPTOR"/>
		-->
		<!--  
			基本认证,在访问被保护的资源时提示用户登陆
		-->
		<http-basic/>
	</http>
	<!-- 注入自定义加密器 -->
	<beans:bean id="md5Encoder" class="com.cpkf.notpad.security.impl.MD5EncoderImpl"/>
	<!-- 认证管理器 -->
	<authentication-manager alias="authenticationManager">
		<authentication-provider>
			<!--  
				密码加密方式,常用的有md5和sha,此处使用自定义加密器
				salt-source:盐值,为每个用户随机生成一个盐值,防止字典攻击
				可以使用UserDetailsService读取出来UserDetails对象中的属性,比如username
			-->
			<password-encoder ref="md5Encoder">
				<salt-source user-property="username"/>
			</password-encoder>
			<!--  
				方式1,使用本地数据库进行权限管理
				自定义的表结构和security默认不一致,只能用sql语句来匹配让security识别
				users-by-username-query:系统通过用户名查询登录名、密码和是否禁用状态
				authorities-by-username-query:根据用户名查找权限,在此基础上配置intercept-url
			-->
			<jdbc-user-service data-source-ref="dataSource" 
				users-by-username-query="select email,passWord,status as enabled 
					from account 
					where email = ?" 
				authorities-by-username-query="select a.email,r.roleName as authorities 
					from account a 
					join account_role ar 
						on a.account_id = ar.account_id 
					join role r 
						on r.role_id = ar.role_id 
					where a.email = ?"/>
			<!--  
				方式二,用户名和密码都写在配置文件中
			<user-service>
				<user name="hj@163.com" password="B59C67BF196A4758191E42F76670CEBA" authorities="ROLE_ADMIN,ROLE_GUEST"/>
				<user name="guest@163.com" password="B59C67BF196A4758191E42F76670CEBA" authorities="ROLE_GUEST"/>
			</user-service>
			-->
			<!-- 方法三,用properties文件 
			<user-service properties="/WEB-INF/conf/db/users.properties" />
			-->
		</authentication-provider>
	</authentication-manager>
</beans:beans>

users.properties
hj@163.com=B59C67BF196A4758191E42F76670CEBA,ROLE_ADMIN,ROLE_GUEST
guest@163.com=B59C67BF196A4758191E42F76670CEBA,ROLE_GUEST

    4、自定义加密器
package com.cpkf.notpad.security.impl;
import org.springframework.dao.DataAccessException;
import org.springframework.security.authentication.encoding.PasswordEncoder;
import com.cpkf.notpad.commons.utils.MD5;
/**  
 * Filename:    MD5EncoderImpl.java
 * Description: 自定义加密器,需实现PasswordEncoder接口
 * Company:     
 * @author:     Jiang.hu
 * @version:    1.0
 * Create at:   May 24, 2011 4:35:56 PM
 * modified:    
 */
public class MD5EncoderImpl implements  PasswordEncoder {
	/* 
	 * method name   : encodePassword
	 * description   : 获得加密密码
	 * @author       : Jiang.Hu
	 * modified      : leo ,  May 24, 2011
	 * @see          : @see org.springframework.security.authentication.encoding.PasswordEncoder#encodePassword(java.lang.String, java.lang.Object)
	 */    
	public String encodePassword(String rawPass, Object salt) throws DataAccessException {
		return MD5.getMD5ofStr(rawPass);
	}
	/* 
	 * method name   : isPasswordValid
	 * description   : 验证密码
	 * @author       : Jiang.Hu
	 * modified      : leo ,  May 24, 2011
	 * @see          : @see org.springframework.security.authentication.encoding.PasswordEncoder#isPasswordValid(java.lang.String, java.lang.String, java.lang.Object)
	 */    
	public boolean isPasswordValid(String encPass, String rawPass, Object salt) throws DataAccessException {
		return encPass.equals(encodePassword(rawPass, salt));
	}
}

    5、login.jsp
<!--  
			/j_spring_security_check:提交到spring security验证中心
			${sessionScope['SPRING_SECURITY_LAST_USERNAME']}:使用最后一次登陆的用户名
			_spring_security_remember_me:记住我
		-->
		<div>
			<font color="red">
				login error:<br/>
				${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}
			</font>
		</div>
		<form id="form2" action="<c:url value='/j_spring_security_check' />" method="post">
			<spring:message code="message.login.email"/>
			<input type="text" id="j_username" name="j_username" value="${sessionScope['SPRING_SECURITY_LAST_USERNAME']}"/><br/>
			<spring:message code="message.login.password"/>:</label>
			<input type="password" id="j_password" name="j_password"/><br/>
			<input type="checkbox" name="_spring_security_remember_me" />
			<spring:message code="message.login.keepLogin"/><br/>
			<input type="submit" value="<spring:message code='message.login.login'/>" />
		</form>

    安全退出:
<a href="<c:url value='/j_spring_security_logout' />"><spring:message code="security.logout"/></a>

    6、这样就实现了简单的security验证授权功能,但是这种方式并不完善:
        和自定义url资源库没有绑定,我们应该将每一个请求的url和资源库比对,找出访问该url的角色有哪些,再根据用户的角色来授权该用户是否能访问
    eg.hj@163.com用户拥有ROLE_ADMIN角色,在登录访问"/securityLogin.do"url时,如果resource资源库中"/securityLogin.do"没有ROLE_ADMIN角色,该用户没有权限权限,应跳转到403页面,如果resource资源库中"/securityLogin.do"有ROLE_ADMIN角色,该用户才能访问。但是,这篇配置使用的是默认的过滤器链进行服务,是达不到这种效果的,它只能通过数据库用户验证和intercept-url配置进行简单授权,要想达到这种效果,只有自定义过滤器,下章详细讲解。

    7、附件中提供Spring Security-3.0.1 中文官方文档下载。
分享到:
评论

相关推荐

    maven-ssh-spring security

    【标题】"maven-ssh-spring security" 涉及到的是在Java开发中使用Maven构建的一个集成Spring Security的SSH(Struts2、Spring、Hibernate)项目。SSH是Java Web开发中常见的三大框架,而Spring Security则是一个...

    Maven之Spring Boot--网络商城系统基础版

    在本项目中,“Maven之Spring Boot--网络商城系统基础版”是一个基于Maven构建,利用Spring Boot框架开发的电子商务平台。这个系统的核心目标是提供一个简易但完整的商品管理和用户购买流程,它允许商家进行商品的增...

    spring security maven 例子

    Maven是一个项目管理和综合工具,它简化了构建、依赖管理和项目信息管理的过程。在本示例中,Spring Security的配置和依赖关系都是通过Maven的pom.xml文件来管理的。开发者可以通过定义依赖项来引入Spring Security...

    maven spring security框架搭建

    根据提供的文件信息,我们可以深入探讨如何使用Maven和Spring Security框架来构建一个安全的应用程序。以下将详细解析各个部分,并介绍这些配置是如何协同工作来确保应用程序的安全性的。 ### Maven依赖 在项目中...

    spring security3 中文版本

    - `Config-spring-security-config.jar`:支持基于 XML 和 Java 的安全配置。 - `LDAP-spring-security-ldap.jar`:支持 LDAP 认证和授权。 - `ACL-spring-security-acl.jar`:提供了基于 ACL 的访问控制功能。 ...

    spring-security-oauth2官网的实例sparklr2与tonr2,可运行的Java Eclipse项目文件

    通过研究Sparklr2和Tonr2的实现,开发者可以更好地理解OAuth2的工作原理,以及如何在实际项目中应用Spring Security OAuth2来保护API和实现第三方应用的授权。这对于构建现代Web应用,尤其是涉及到用户数据安全的...

    Spring Security 新手入门级maven实例

    本实例主要面向初学者,通过一个基于Maven的项目,帮助你快速上手Spring Security。 首先,让我们了解Maven。Maven是一个项目管理工具,它能够管理项目的构建、依赖关系和文档。在Spring Security实例中,Maven用于...

    spring-security-kerberos

    样本可以在spring-security-kerberos-samples 。 有关更多信息,请查阅参考文档。 从源头建造 Spring Security Kerberos使用基于的构建系统。 在下面的说明中,。/ 是从源树的根调用的,并用作构建的跨平台,自包含...

    springmvc4.1+spring4.1+mybatis3.2+spring-security3.2的maven环境搭建

    在本项目中,我们主要关注的是一个基于Spring MVC 4.1、Spring 4.1、MyBatis 3.2以及Spring Security 3.2的Maven环境的搭建过程。下面将详细介绍这些技术栈的核心概念、它们如何协同工作以及如何在实际开发环境中...

    管理系统系列--基于 Spring Boot、 Spring Data JPA、 Spring Security、V.zip

    【标题】"管理系统系列--基于 Spring Boot、 Spring Data JPA、 Spring Security、V.zip" 提供了一个关于构建管理系统的框架,这个系统利用了Spring技术栈的几个关键组件。以下是这些技术及其在系统开发中的作用: ...

    jasypt-spring-boot-starter 3.0.5依赖的pom及jar

    首先,POM(Project Object Model)文件是Maven项目的核心配置文件,用于定义项目依赖、构建过程和其他元数据。在jasypt-spring-boot-starter 3.0.5中,POM文件包含了所有必要的依赖项,使得项目能够正确编译和运行...

    官方完整包 spring-framework-5.3.7.RELEASE-dist.zip

    Spring Framework 是一个开源的应用...总的来说,“spring-framework-5.3.7.RELEASE-dist.zip”是开发者开始或升级Spring项目的重要资源,包含了所有必要的组件和文档,能够帮助开发者高效地构建和管理Java应用程序。

    maven+springmvc+springSecurity

    【标题】"maven+springmvc+springSecurity"是一个典型的Java Web开发技术栈,它将Maven作为项目构建工具,Spring MVC作为Web层框架,Spring Security作为安全控制框架。这三者结合,能够构建出一个功能强大且安全的...

    Spring-Security安全权限管理手册

    - `org.springframework.security:spring-security-core:jar:2.0.5.RELEASE:compile`:核心模块,包含了Spring Security的核心类和接口。 - `org.springframework:spring-core:jar:2.0.8:compile`:Spring框架的...

    spring-security-4.1.2.RELEASE-dist.zip

    这个"spring-security-4.1.2.RELEASE-dist.zip"压缩包包含了Spring Security 4.1.2版本的所有组件和相关文档,它是2016年8月16日发布的最新版本。 在Spring Security的核心功能中,主要包括以下几点: 1. **身份...

    togglz-spring-security-1.1.1.Final.zip

    【标题】"togglz-spring-security-1.1.1.Final.zip" 提供的是一个集成 togglz(一个功能开关库)与 Spring Security 的开源项目,版本为 1.1.1.Final。Togglz 主要用于在应用程序中实现特性开关功能,而 Spring ...

    webservice-CXF-spring+maven

    3. **Maven**:Maven是一个基于项目对象模型(POM)的项目管理工具,用于构建、依赖管理和项目信息管理。在本项目中,Maven会管理CXF、Spring和其他库的依赖,并根据预设的构建生命周期进行编译、测试、打包和部署。...

    基于Spring-plus spring springMVC的maven项目整合

    本项目基于Spring、SpringMVC和MyBatis-Plus的整合,使用Maven作为构建工具,主要关注学生成绩管理系统的技术实现。下面将详细阐述这个项目中涉及的关键知识点。 1. **Spring框架**:Spring是Java平台上的一个开源...

    spring-security-reference.pdf

    可以通过Maven、Gradle等构建工具来获取Spring Security依赖,并通过Spring框架的BOM(Bill of Materials)来管理依赖版本。 2. **Spring Security 4.0 新特性** - **新增功能** Spring Security 4.0 引入了多项...

Global site tag (gtag.js) - Google Analytics