spring security2.0介绍.docx_第1页
spring security2.0介绍.docx_第2页
spring security2.0介绍.docx_第3页
spring security2.0介绍.docx_第4页
spring security2.0介绍.docx_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Spring security2.0介绍 刘春来我所在市场部客户服务网站项目组,其中一个项目是客户管理系统crms,它所用到的权限控制是用的spring security工具,本文将对spring security工具做一个较全面的介绍,主要想就它的实现原理,实现步骤方面介绍清楚,至于各种运用场景和实现方式可自行去研究。注明:在写这篇文章前,在网上找了很多spring security方面的资料,包括它的官方文档,发现就其原理上的说明很少,大多只是单纯的简单介绍而已,所以想写下自己对其如何实现,怎么实现的使用方面的理解。只希望通过本文使大家对spring security有大概的了解,在以后可能用到时,有所帮助。一、spring security特点1、 高可移植性;作为spring的一个开源工具,具有同spring相同的可移植性;2、 可配置性;这点在下面的例子中可看到;3、 具有丰富灵活的验证模型,下面是列举的几个认证技术:HTTP BASIC authentication headers (一个基于IEFT RFC的标准) LDAP (一个非常常见的跨平台认证需要做法,特别是在大环境)JA-SIG Central Authentication Service (也被称为CAS,这是一 个流行的开源单点登录系统) Java Authentication and Authorization Service (JAAS) Form-based authentication (提供简单用户接口的需求)。Spring Security是一个开放的平台,可以编写自己的验证机制。 注明:我在写这篇文章之前,就一直在思考,怎么才能将security将清楚,这要涉及它的结构、原理、实现3个方面,我不想就简单的讲下它的各种实现方式,因为这些网上都有,感觉没有意义。我想就人们认识事物的过程来讲它。第一步,说它的实现步骤;第二步,说它的实现的具体方式;第三步,从原理上来解析它的实现。二、spring security的实现步骤 下面是一个典型的安全控制的例子:1你点击一个链接访问一个网页; 2浏览器发送一个请求到服务器,服务器判断出你正在访问一个受保护的资源; 3如果此时你并未通过身份认证,服务器发回一个响应提示你进行认证这个响应可能是一个HTTP响应代码,抑或重定向到一个指定页面; 4根据系统使用认证机制的不同,浏览器或者重定向到一个登录页面中,或者由浏览器通过一些其它的方式获取你的身份信息(如通过BASIC认证对话框、一个Cookie); 5浏览器再次将用户身份信息发送到服务器上(可能是一个用户登录表单的HTTP POST信息、也可能是包含认证信息的HTTP报文头); 6服务器判断用户认证信息是否有效,如果无效,一般情况下,浏览器会要求你继续尝试,这意味着返回第3步。如果有效,则到达下一步; 7服务器重新响应第2步所提交的原始请求,并判断该请求所访问的程序资源是否在你的权限范围内,如果你有权访问,请求将得到正确的执行并返回结果。否则,你将收到一个HTTP 403错误,这意味着你被禁止访问。【上面黑体部分的两个判断就是安全控制的核心部分】注明:我想大家对这个都应该知道,也可能做过类似的,但你不一定是用spring security来实现的,下面将讲述如何用spring security将上面一步步实现。三、spring security的具体实现(必须使用spring框架) 1.第一步并确保jar文件放到正确的位置(/WEB-INF/lib/) acegi-security-core-2.0.4.jar acegi-security-core-tiger-2.0.4.jar acegi-security-taglibs-2.0.4.jar2.在web.xml文件里配置一个springSecurityFilterChain的代理过滤器 springSecurityFilterChainorg.springframework.web.filter.DelegatingFilterProxyspringSecurityFilterChain/*并且,导入spring security配置文件classpath:applicationContext-security.xml 3.配置spring security的配置文件 上面是一个最简单的spring security配置文件,但它也表明了spring security最基本的骨架,有第一个判断(判断用户认证信息是否有效)所需要信息name、password、authorities;它们由authenticationprovider进行认证;并通过对资源进行权限设定,它需要url和role信息。uto-config=true表示将使用spring security的默认http配置;由于在此配置文件里没有设置登入页面,spring security将会用自己的登入页面。上述配置文件只能实现,3个指定的用户,登入特定的登入页面,所有ROLE_USER权限可访问所有资源。但真正的项目中是不可能这么简单的,比如:通过自己编写的登入页面登入,通过自己写的程序得到用户信息进行认证(至于是从数据库还是怎么得的就随自己写了),通过自己写的过滤器设定验证方式;以下就是这种方式下,自己写的配置文件:/表示登入失效跳转页面和路径 /表示安全控制切入点,一般是登入页面/关联认证管理类/将自定义的过滤器代替AUTHENTICATION_PROCESSING_FILTER过滤器/验证成功出口/异常出口打开/设定认证错误出口/将/crms_login结尾url作为过滤器开始标识/表示验证决策类/认证管理器/关联决策管理器及验证决策器/将此过滤器放在FILTER_SECURITY_INTERCEPTOR过滤器前,这是实现验证的过滤器 /获取认证的用户信息,并实现认证类 !- -/认证管理器上述security配置涉及到了3个自定义的类:crmsAuthenticationProcessingFilter和crmsFilterSecurityInterceptor两个过滤器类;以及userDetailsService这个自定义的认证类;这3个类就实现了自定义的认证和授权信息的加载。注意认证和授权并不是由我们自己实现的,而是有spring security自己实现的,我们要做的只是将它们需要的信息加载进去而已;至于如何加载下面原理部分将介绍。上面说到认证和授权,那就需要说下什么是安全;安全包括认证和授权两个主要操作。 认证是为用户建立一个他所声明的主体。 主体一般是指用户,设备或可以在你系统中执行行动的其他系统。 授权指的一个用户能否在你的应用中执行某个操作。 在到达授权判断之前,身份的主体已经由身份验证过程建立了。 而Spring security的作用就是对网站安全的实现。注明:如果你看上面看的糊里糊涂,或者认为我写的糊里糊涂,都没关系;因为上面怎么实现的过程,认证、授权信息的加载都没有说到;主要是再没介绍spring security的结构和实现原理来说很难介绍清楚,我想在原理部分来具体介绍。三、spring security的原理Spring security的体系结构:Spring security通过两个组件对象完成安全问题的处理:AuthenticationManager(认证管理器)AccessDecisionManager(访问控制管理器或者叫授权管理器) 注明:Acegi即spring security1.0版本;spring security的3个版本在原理和结构上都没区别;只是后面版本在实现上减少了人的工作量。在security框架中,SecurityContextHolder处于非常核心的位置,它是存放认证管理器用户安全信息SecurityContext的容器, SecurityContext保存着用户安全访问控制所需的信息,直接被访问决策管理器使用。 HttpSessionContextIntegrationFilter通过在SecurityContextHolder和HttpSession中摆渡SecurityContext,使多个请求线程可以共享同一个SecurityContext。Spring security的实现原理:从上述原理图可看出spring security也是通过servlet过滤器来实现安全控制的;如果要实现自定义认证和授权,就必须用自定义的过滤器代替或插入spring security完成相应功能的特定过滤器中;下面就来说下spring security的特定过滤器:1.HttpSessionContextIntegrationFilter位于过滤器顶端,第一个起作用的过滤器。用途一,在执行其他过滤器之前,率先判断用户的session中是否已经存在一个SecurityContext了。如果存在,就把 SecurityContext拿出来,放到SecurityContextHolder中,供Spring Security的其他部分使用。如果不存在,就创建一个SecurityContext出来,还是放到SecurityContextHolder中,供Spring Security的其他部分使用。用途二,在所有过滤器执行完毕后,清空SecurityContextHolder,因为SecurityContextHolder是基于ThreadLocal的,如果在操作完成后清空ThreadLocal,会受到服务器的线程池机制的影响。2.LogoutFilter只处理注销请求,默认为/j_spring_security_logout。用途是在用户发送注销请求时,销毁用户session,清空SecurityContextHolder,然后重定向到注销成功页面。可以与rememberMe之类的机制结合,在注销的同时清空用户cookie。3.AuthenticationProcessingFilter处理form登陆的过滤器,与form登陆有关的所有操作都是在此进行的。默认情况下只处理/j_spring_security_check请求,这个请求应该是用户使用form登陆后的提交地址 。此过滤器执行的基本操作时,通过用户名和密码判断用户是否有效,如果登录成功就跳转到成功页面(可能是登陆之前访问的受保护页面,也可能是默认的成功页面),如果登录失败,就跳转到失败页面。4.DefaultLoginPageGeneratingFilter此过滤器用来生成一个默认的登录页面,默认的访问地址为/spring_security_login,这个默认的登录页面虽然支持用户输入用户名,密码,也支持rememberMe功能,但是因为太难看了,只能是在演示时做个样子,不可能直接用在实际项目中。5.BasicProcessingFilter此过滤器用于进行basic验证,功能与AuthenticationProcessingFilter类似,只是验证的方式不同。有关basic验证的详细情况,我们会在后面的章节中详细介绍。6.SecurityContextHolderAwareRequestFilter此过滤器用来包装客户的请求。目的是在原始请求的基础上,为后续程序提供一些额外的数据。比如getRemoteUser()时直接返回当前登陆的用户名之类的。7.RememberMeProcessingFilter此过滤器实现RememberMe功能,当用户cookie中存在rememberMe的标记,此过滤器会根据标记自动实现用户登陆,并创建SecurityContext,授予对应的权限。8.AnonymousProcessingFilter为了保证操作统一性,当用户没有登陆时,默认为用户分配匿名用户的权限。9.ExceptionTranslationFilter此过滤器的作用是处理中FilterSecurityInterceptor抛出的异常,然后将请求重定向到对应页面,或返回对应的响应错误代码。10.SessionFixationProtectionFilter防御session固化攻击。11.FilterSecurityInterceptor用户的权限控制都包含在这个过滤器中。功能一:如果用户尚未登陆,则抛出AuthenticationCredentialsNotFoundException“尚未认证异常”。功能二:如果用户已登录,但是没有访问当前资源的权限,则抛出AccessDeniedException“拒绝访问异常”。功能三:如果用户已登录,也具有访问当前资源的权限,则放行。【上面的结构图和原理图,包括过滤器的介绍均是转载,如有雷同,不必大惊小怪;黑体部分是希望着重注意的】好,结构和原理都介绍到了,尽管你还是不清楚,那没关系;下面就具体分析下上面spring security的实现过程:第一步:在web.xml中配置的代理过滤器,它的作用从原理图上可看出等同于FilterToBeanProxy用来调用spring security的特定过滤器。第二步:自定义登入页面;entry-point-ref=crmsEntryPoint/表示安全控制切入点,一般是登入页面/表示安全控制切入点,一般是登入页面,这里是index.jsp,里面是表单登入第三步:对于登入页面传来的用户信息进行认证; 【这里你可以回头看看第3个过滤器的说明】/转入TestAction类的Ea方法判断验证码正确与否,正确返回success/crms_login/验证完验证码后重定向路径/crms_login根据/crms_login启动认证过滤器;具体说明可参考上面spring security配置文件说明。上述过滤器代替了AUTHENTICATION_PROCESSING_FILTER特定过滤器;它加载了authenticationManager认证管理类,启动authenticationprovider接口加载认证信息;接下来,我们可以看一下UserAuthorizeImpl类如何加载认证信息;public class UserAuthorizeImpl implements UserDetailsServicepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException UserAuthorized userAuthorized = new UserAuthorized(); 。 userAuthorized.setUser(user); userAuthorized.setRolelist(rolelist); return userAuthorized;从上面可以看出认证的信息的加载就是通过loadUserByUsername方法返回一个UserDetails实例,来实现UserDetailsService接口,进一步实现authenticationprovider接口;上面涉及到了UserDetails实例userAuthorized,我们可以看下他的结构;public class UserAuthorized implements UserDetails private static final long serialVersionUID = -1520448892955710512L;private User user;private List rolelist;public List getRolelist() return rolelist;public void setRolelist(List rolelist) this.rolelist = rolelist;public User getUser() return user;public void setUser(User user) this.user = user;public GrantedAuthority getAuthorities() if (rolelist!=null & rolelist.size()0) int size = rolelist.size();GrantedAuthority grantedAuthorities = new GrantedAuthoritysize;for (int i = 0; i size; i+) String rolename = (String) rolelist.get(i);grantedAuthoritiesi = new GrantedAuthorityImpl(rolename);return grantedAuthorities;elsereturn null;public String getPassword() return this.user.getPassword();public String getUsername() return this.user.getUsername();/可以判断是否到期,暂没判断public boolean isAccountNonExpired() return true;public boolean isAccountNonLocked() return true;public boolean isCredentialsNonExpired() return true;/是否禁用public boolean isEnabled() return true;这个类里提到了public GrantedAuthority getAuthorities()方法,这是spring security用来得到用户权限并保持到GrantedAuthority里;通过上面这些操作,已经加载了认证信息,并封装;接下来要用第3个过滤器,这里是代替了第3过滤器的类来完成认证;public class CrmsAuthenticationProcessingFilter extends AuthenticationProcessingFilter public Authentication attemptAuthentication(HttpServletRequest request) throws AuthenticationException 。UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);。return this.getAuthenticationManager().authenticate(authRequest); 从这个类可以看出,这个类是通过spring security的UsernamePasswordAuthenticationToken方法来实现认证的;以上就完成了认证及用户信息的封装。第四步:在每次url跳转时,判断用户是否有权限;【这里你可以回头看看第11个过滤器的说明】第11个过滤器是验证权限的过滤器,所以资源授权信息的加载必须是在这个过滤器之前;具体说明可以看前面的spring security配置文件说明;接下来,我们看下CrmsFilterSecurityInterceptor类是如何加载授权信息的;public class CrmsFilterSecurityInterceptor extends FilterSecurityInterceptor private static DefaultFilterInvocationDefinitionSource filterSource = null;public static Map buttonRoleMap = null;public ObjectDefinitionSource obtainObjectDefinitionSource() if (filterSource = null) definitionSource1(); return filterSource; private void definitionSource1()UrlMatcher urlMatcher = new AntUrlPathMatcher(false);LinkedHashMap requestMap = new LinkedHashMap();MapStri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论