`

Spring Security 3应用的11个步骤

阅读更多
   1. Spring Security
      11个步骤为应用程序添加安全防护
   2. 历史与现状
      自2003年出现的Spring扩展插件Acegi Security发展而来。
      目前最新版本为3.x,已成为Spring的一部分。
      为J2EE企业应用程序提供可靠的安全性服务。
   3. Authentication vs. Authorization
      区分概念验证与授权
      验证
      这个用户是谁?
      用户身份可靠吗?
      授权
      某用户A是否可以访问资源R
      某用户A是否可以执行M操作
      某用户A是否可以对资源R执行M操作
   4. SS中的验证特点
      支持多种验证方式
      支持多种加密格式
      支持组件的扩展和替换
      可以本地化输出信息
   5. SS中的授权特点
      支持多种仲裁方式
      支持组件的扩展和替换
      支持对页面访问、方法访问、对象访问的授权。
   6. SS核心安全实现
      Web安全
      通过配置Servlet Filter激活SS中的过滤器链
      实现 Session一致性验证
      实现免登陆验证(Remember-Me验证)
      提供一系列标签库进行页面元素的安全控制
      方法安全
      通过AOP模式实现安全代理
      Web安全与方法安全均可以使用表达式语言定义访问规则
   7. 配置SS
      配置Web.xml,应用安全过滤器
      配置Spring,验证与授权部分
      在web页面中获取用户身份
      在web页面中应用安全标签库
      实现方法级安全
   8. 1:配置web.xml
      Java代码
         1. <filter> 
         2. <filter-name>springSecurityFilterChain</filter-name> 
         3. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
         4. </filter> 
         5. <filter-mapping> 
         6. <filter-name>springSecurityFilterChain</filter-name> 
         7. <url-pattern>/*</url-pattern> 
         8. </filter-mapping> 
         9. <context-param> 
        10. <param-name>contextConfigLocation</param-name> 
        11. <param-value>classpath:spring.xml</param-value> 
        12. </context-param> 
        13. <listener> 
        14. <listener-class> 
        15. org.springframework.web.context.ContextLoaderListener 
        16. </listener-class> 
        17. </listener> 

      <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>
      <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring.xml</param-value>
      </context-param>
      <listener>
      <listener-class>
      org.springframework.web.context.ContextLoaderListener
      </listener-class>
      </listener>

      
   9. 2:Spring配置文件中设置命名空间
      Java代码
         1. <?xml version="1.0" encoding="UTF-8"?> 
         2. <beans:beansxmlns="http://www.springframework.org/schema/security" 
         3. xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         4. xsi:schemaLocation="http://www.springframework.org/schema/beans 
         5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
         6. http://www.springframework.org/schema/security 
         7. http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 
         8. </beans:beans> 

      <?xml version="1.0" encoding="UTF-8"?>
      <beans:beansxmlns="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">
      </beans:beans>

      
  10. 3:配置最基本的验证与授权
      Java代码
         1. <http auto-config="true"> 
         2. <intercept-url pattern="/**" access="ROLE_USER" /> 
         3. </http> 
         4. <authentication-manager> 
         5. <authentication-provider> 
         6. <user-service> 
         7. <user name="tom" password="123" authorities="ROLE_USER, ROLE_A" /> 
         8. <user name="jerry" password="123" authorities="ROLE_USER, ROLE_B" /> 
         9. </user-service> 
        10. </authentication-provider> 
        11. </authentication-manager> 

      <http auto-config="true">
      <intercept-url pattern="/**" access="ROLE_USER" />
      </http>
      <authentication-manager>
      <authentication-provider>
      <user-service>
      <user name="tom" password="123" authorities="ROLE_USER, ROLE_A" />
      <user name="jerry" password="123" authorities="ROLE_USER, ROLE_B" />
      </user-service>
      </authentication-provider>
      </authentication-manager>

      
  11. 4:通过数据库验证用户身份
      Java代码
         1. <authentication-manager> 
         2. <authentication-provider> 
         3. <password-encoder hash=“md5”/> 
         4. <jdbc-user-service data-source-ref="dataSource"/> 
         5. </authentication-provider> 
         6. </authentication-manager> 
         7. 数据表结构见SS说明手册附录A 

      <authentication-manager>
      <authentication-provider>
      <password-encoder hash=“md5”/>
      <jdbc-user-service data-source-ref="dataSource"/>
      </authentication-provider>
      </authentication-manager>
      数据表结构见SS说明手册附录A

      
  12. 5:完善web页面验证规则
      Java代码
         1. <http auto-config="true"> 
         2. <intercept-url pattern="/js/**" filters="none"/> 
         3. <intercept-url pattern="/css/**" filters="none"/> 
         4. <intercept-url pattern="/images/**" filters="none"/> 
         5. <intercept-url pattern="/a.jsp" access="ROLE_A" /> 
         6. <intercept-url pattern="/b.jsp" access="ROLE_B" /> 
         7. <intercept-url pattern="/c.jsp" access="ROLE_A, ROLE_B" /> 
         8. <intercept-url pattern="/**" access="ROLE_USER" /> 
         9. </http> 

      <http auto-config="true">
      <intercept-url pattern="/js/**" filters="none"/>
      <intercept-url pattern="/css/**" filters="none"/>
      <intercept-url pattern="/images/**" filters="none"/>
      <intercept-url pattern="/a.jsp" access="ROLE_A" />
      <intercept-url pattern="/b.jsp" access="ROLE_B" />
      <intercept-url pattern="/c.jsp" access="ROLE_A, ROLE_B" />
      <intercept-url pattern="/**" access="ROLE_USER" />
      </http>

      
  13. 6:自定义验证配置
      Java代码
         1. <http auto-config="true"> 
         2. <!-- 指定登陆页面、成功页面、失败页面--> 
         3. <form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp" /> 
         4. <!-- 尝试访问没有权限的页面时跳转的页面 --> 
         5. <access-denied-handler error-page="/accessDenied.jsp"/> 
         6. <!-- 使用记住用户名、密码功能,指定数据源和加密的key --> 
         7. <remember-me data-source-ref="dataSource" /> 
         8. <!-- logout 页面,logout后清除session --> 
         9. <logout invalidate-session="true" logout-success-url="/login.jsp" /> 
        10. <!-- session 失效后跳转的页面,最大登陆次数 --> 
        11. <session-management invalid-session-url="/sessionTimeout.htm"> 
        12. <concurrency-control max-sessions="1" expired-url="/sessionTimeout.htm" /> 
        13. </session-management> 
        14. </http> 
        15. 可以使用SS自带的登陆页面作为login.jsp的模板 

      <http auto-config="true">
      <!-- 指定登陆页面、成功页面、失败页面-->
      <form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp" />
      <!-- 尝试访问没有权限的页面时跳转的页面 -->
      <access-denied-handler error-page="/accessDenied.jsp"/>
      <!-- 使用记住用户名、密码功能,指定数据源和加密的key -->
      <remember-me data-source-ref="dataSource" />
      <!-- logout页面,logout后清除session -->
      <logout invalidate-session="true" logout-success-url="/login.jsp" />
      <!-- session 失效后跳转的页面,最大登陆次数 -->
      <session-management invalid-session-url="/sessionTimeout.htm">
      <concurrency-control max-sessions="1" expired-url="/sessionTimeout.htm" />
      </session-management>
      </http>
      可以使用SS自带的登陆页面作为login.jsp的模板

  14. 7:本地化消息输出
      拷贝本地化资源文件后,在配置文件中加载该文件:
      Java代码
         1. <!-- 加载错误信息资源文件 --> 
         2. <beans:bean id="messageSource"  
         3. class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
         4. <beans:property name="basename" value="classpath:messages"/> 
         5. </beans:bean> 
         6. 资源文件在SS核心包:spring-security-core-3.0.2.RELEASE.jar的orgspringframeworksecurity目录中 

      <!-- 加载错误信息资源文件 -->
      <beans:bean id="messageSource"
      class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
      <beans:property name="basename" value="classpath:messages"/>
      </beans:bean>
      资源文件在SS核心包:spring-security-core-3.0.2.RELEASE.jar的orgspringframeworksecurity目录中

      
  15. 8:在web页面中获取用户信息
      Java代码
         1. 方式一:Java代码 
         2. Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
         3. Collection<GrantedAuthority> col = auth.getAuthorities(); 
         4. 方式二:标签库 
         5. <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> 
         6. <sec:authentication property="name“/> 
         7. <sec:authentication property="authorities“/> 

      方式一:Java代码
      Authentication auth = SecurityContextHolder.getContext().getAuthentication();
      Collection<GrantedAuthority> col = auth.getAuthorities();
      方式二:标签库
      <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
      <sec:authentication property="name“/>
      <sec:authentication property="authorities“/>

      
  16. 9:在web页面进行元素安全控制
      Java代码
         1. 方式一 
         2. <sec:authorizeifAnyGranted="ROLE_A"> 
         3. <a href="a.jsp">你可以访问a.jsp</a> 
         4. </sec:authorize> 
         5. <sec:authorizeifNotGranted="ROLE_A"> 
         6. 你不可以访问a.jsp 
         7. </sec:authorize> 
         8. 方式二 
         9. <sec:authorizeurl="/a.jsp"> 
        10. <a href="a.jsp">你可以访问a.jsp</a> 
        11. </sec:authorize> 

      方式一
      <sec:authorizeifAnyGranted="ROLE_A">
      <a href="a.jsp">你可以访问a.jsp</a>
      </sec:authorize>
      <sec:authorizeifNotGranted="ROLE_A">
      你不可以访问a.jsp
      </sec:authorize>
      方式二
      <sec:authorizeurl="/a.jsp">
      <a href="a.jsp">你可以访问a.jsp</a>
      </sec:authorize>

      
  17. 10:全局方法安全控制
      Java代码
         1. <global-method-security pre-post-annotations="enabled"> 
         2. <protect-pointcut expression="execution(* com.xasxt.*Service.add*(..))" access="ROLE_A"/> 
         3. <protect-pointcut expression="execution(* com.xasxt.*Service.delete*(..))" access="ROLE_B"/> 
         4. </global-method-security> 
         5. 此处使用了AspectJ中常用的切入点表达式(百度:AspectJ execution) 

      <global-method-security pre-post-annotations="enabled">
      <protect-pointcut expression="execution(* com.xasxt.*Service.add*(..))" access="ROLE_A"/>
      <protect-pointcut expression="execution(* com.xasxt.*Service.delete*(..))" access="ROLE_B"/>
      </global-method-security>
      此处使用了AspectJ中常用的切入点表达式(百度:AspectJ execution)

      
  18. 11:使用注解进行方法安全控制
      Java代码
         1. public class DemoService { 
         2. @PreAuthorize("hasRole(&apos;ROLE_A&apos;)") 
         3. public void methodA() { 
         4. } 
         5. @PreAuthorize("hasAnyRole(&apos;ROLE_A, ROLE_B&apos;)") 
         6. public void methodB() { 
         7. } 
         8. } 
         9. hasRole 与hasAnyRole为SS通用内置表达式(google : spring security Common Built- In Expressions) 

      public class DemoService {
      @PreAuthorize("hasRole(&apos;ROLE_A&apos;)")
      public void methodA() {
      }
      @PreAuthorize("hasAnyRole(&apos;ROLE_A, ROLE_B&apos;)")
      public void methodB() {
      }
      }
      hasRole与hasAnyRole为SS通用内置表达式(google : spring security Common Built-In Expressions)

      
  19. 12:下一步做什么???
      采用更安全的验证方式
      采用安全的数据传输方式
      实现动态授权
      自定义验证与授权部件
      实现数据级安全
分享到:
评论

相关推荐

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

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

    spring Security3中文教程,经典的

    Spring Security是Spring框架中的一个重要组成部分,主要用于为Web应用提供安全防护。它不仅提供了强大的认证和授权功能,还支持各种加密机制和安全策略,使得开发者能够轻松地为自己的应用添加安全功能。 - **安全...

    springsecurity3.0.5应用

    Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于Java应用程序。在Spring Security 3.0.5版本中,它提供了许多关键的安全特性,包括用户认证、权限控制、CSRF防护、会话管理等。这个版本是...

    spring security 3 源代码 不包含书,pets应用

    Spring Security 是一个强大的Java安全框架,用于保护基于Spring的应用程序。它提供了全面的身份验证、授权和访问控制功能,使得开发者可以轻松地实现安全控制。在Spring Security 3版本中,这个框架已经相当成熟,...

    Spring Security3 安全 个人总结

    Spring Security3 是一个基于 Java 的安全框架,提供了一个灵活的安全机制来保护基于 Spring 的应用程序。在这个总结中,我们将详细介绍 Spring Security3 的安全机制、原理和核心组件。 认证管理器 认证管理器是...

    Spring Security 3多用户登录实现一

    Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架,广泛应用于Java EE平台上的安全解决方案。在本文中,我们将深入探讨如何在Spring Security 3中实现多用户登录功能。首先,我们需要理解Spring ...

    springSecurity 实现传参

    Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于Java应用程序。在这个场景中,我们关注的是如何使用Spring Security实现登录验证以及在登录过程中传递参数,特别是记录并返回用户登录前的...

    基于 Spring Boot 3Spring Security 6Vue.js 3 的前后端分离式论坛系统

    Spring Security 是一个全面的安全框架,用于保护基于Spring的应用。Spring Security 6 可能包括改进的身份验证和授权机制、支持最新的OAuth2标准以及增强的加密和安全配置选项。在这个论坛系统中,它扮演着核心角色...

    精彩:Spring Security 演讲PPT

    Spring Security 是一个功能强大的安全框架,可以为基于Java的应用程序提供认证(Authentication)、授权(Authorization)等功能,同时提供了丰富的配置选项来满足不同的应用场景需求。 #### 二、传统Web应用安全开发...

    Spring_Security_3应用的11个步骤.docx

    Spring_Security_3应用的11个步骤.docx

    spring-security3 配置和使用

    Spring Security 3 配置和使用 Spring Security 是一个强大且灵活的安全框架,旨在保护基于 Java 的 Web 应用程序。...通过以上步骤,我们便可以成功地配置和使用 Spring Security 3 来保护我们的 Web 应用程序。

    spring boot3.x结合spring security最新版实现jwt登录验证

    在现代Web应用开发中,Spring Boot和Spring Security是两个非常重要的框架。Spring Boot简化了Spring应用的初始搭建以及开发过程,而Spring Security则为应用程序提供了全面的安全管理解决方案。本教程将详细讲解...

    SpringBoot+SpringSecurity+WebSocket

    在IT行业中,SpringBoot、SpringSecurity和WebSocket是三个非常重要的技术组件,它们分别在应用程序开发、安全管理和实时通信方面发挥着关键作用。本项目结合这三个技术,构建了一个整合的示例,旨在展示如何在...

    狂神Spring Security静态资源

    Spring Security 是一个强大的安全框架,主要用于Java Web应用的安全管理,包括认证、授权和访问控制等。在Spring Boot中,Spring Security 提供了简洁的API和自动化配置,使得开发者能够快速集成安全功能。在这个名...

    Spring-Security-3应用的11个步骤.docx

    总之,Spring Security 3.x 提供了一个强大而全面的安全框架,能够帮助开发者快速、安全地实现应用程序的认证和授权。通过理解其核心概念和配置流程,可以有效地保护你的Java应用免受潜在的安全威胁。

    Spring security oauth源码

    Spring Security OAuth 是一个用于保护RESTful Web服务的框架,它为OAuth 1.0a和OAuth 2.0协议提供了全面的支持。在这个源码中,我们可能会看到如何将Spring Security与OAuth结合,以构建安全的Web应用程序和服务。...

    Spring Security3

    Spring Security 是一个强大的且高度可定制的身份验证和访问控制框架,它为基于 Java 的应用程序提供了广泛的保护机制。Spring Security 3 版本在此基础上进一步增强了其安全性功能,并优化了用户体验。 #### 二、...

    spring security实现动态授权

    Spring Security 是一个强大的安全框架,用于为Java应用提供安全控制。在传统的权限管理中,权限配置通常硬编码在应用程序中,这使得权限调整变得困难,每次变动都需要重新部署应用。然而,通过动态授权,我们可以将...

    利用spring security控制同一个用户只能一次登陆

    标题中的“利用Spring Security控制同一个用户只能一次登录”是指在基于Spring Security的Web应用程序中实现单点登录(Single Sign-On, SSO)的功能,确保同一时间只有一个设备或浏览器会话可以登录同一用户的账户。...

Global site tag (gtag.js) - Google Analytics