CONAN ZONE

你越挣扎我就越兴奋

BlogJava 首页 新随笔 联系 聚合 管理
  0 Posts :: 282 Stories :: 0 Comments :: 0 Trackbacks
  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>  
     
  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>  
     
  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>  
     
  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  
     
  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>  
     
  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的模板  
  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目录中  
     
  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“/>  
     
  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>  
     
  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)  
     
  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)  
     
  19. 12:下一步做什么???
    采用更安全的验证方式
    采用安全的数据传输方式
    实现动态授权
    自定义验证与授权部件
    实现数据级安全
posted on 2010-04-12 13:36 CONAN 阅读(1085) 评论(0)  编辑  收藏 所属分类: Spring