spring_security3.2 详细配置 培训笔记.docx_第1页
spring_security3.2 详细配置 培训笔记.docx_第2页
spring_security3.2 详细配置 培训笔记.docx_第3页
spring_security3.2 详细配置 培训笔记.docx_第4页
spring_security3.2 详细配置 培训笔记.docx_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

Spring Security 3.x 出来一段时间了,跟Acegi是大不同了,与2.x的版本也有一些小小的区别,网上有一些文档,也有人翻译Spring Security 3.x的guide,但通过阅读guide,无法马上就能很容易的实现一个完整的实例。我花了点儿时间,根据以前的实战经验,整理了一份完整的入门教程,供需要的朋友们参考。1,建一个web project,并导入所有需要的lib,这步就不多讲了。2,配置web.xml,使用Spring的机制装载:contextConfigLocationclasspath:applicationContext*.xmlorg.springframework.web.context.ContextLoaderListenerspringSecurityFilterChainorg.springframework.web.filter.DelegatingFilterProxyspringSecurityFilterChain/*login.jsp这个文件中的内容我相信大家都很熟悉了,不再多说了。2,来看看applicationContext-security.xml这个配置文件,关于Spring Security的配置均在其中:!-如果用户的密码采用加密的话,可以加点“盐”-3,来看看自定义filter的实现:packagecom.robin.erp.fwk.security;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importorg.springframework.security.access.SecurityMetadataSource;ercept.AbstractSecurityInterceptor;ercept.InterceptorStatusToken;importorg.springframework.security.web.FilterInvocation;ercept.FilterInvocationSecurityMetadataSource;publicclassMyFilterSecurityInterceptorextendsAbstractSecurityInterceptorimplementsFilterprivateFilterInvocationSecurityMetadataSourcesecurityMetadataSource;/Methods/=/*Methodthatisactuallycalledbythefilterchain.Simplydelegatesto*thelink#invoke(FilterInvocation)method.*paramrequest*theservletrequest*paramresponse*theservletresponse*paramchain*thefilterchain*throwsIOException*ifthefilterchainfails*throwsServletException*ifthefilterchainfails*/publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletExceptionFilterInvocationfi=newFilterInvocation(request,response,chain);invoke(fi);publicFilterInvocationSecurityMetadataSourcegetSecurityMetadataSource()returnthis.securityMetadataSource;publicClassgetSecureObjectClass()returnFilterInvocation.class;publicvoidinvoke(FilterInvocationfi)throwsIOException,ServletExceptionInterceptorStatusTokentoken=super.beforeInvocation(fi);tryfi.getChain().doFilter(fi.getRequest(),fi.getResponse();finallysuper.afterInvocation(token,null);publicSecurityMetadataSourceobtainSecurityMetadataSource()returnthis.securityMetadataSource;publicvoidsetSecurityMetadataSource(FilterInvocationSecurityMetadataSourcenewSource)this.securityMetadataSource=newSource;Overridepublicvoiddestroy()Overridepublicvoidinit(FilterConfigarg0)throwsServletException最核心的代码就是invoke方法中的InterceptorStatusToken token = super.beforeInvocation(fi);这一句,即在执行doFilter之前,进行权限的检查,而具体的实现已经交给 accessDecisionManager了,下文中会讲述。4,来看看authentication-provider的实现:packagecom.robin.erp.fwk.security;importjava.util.ArrayList;importjava.util.Collection;importorg.springframework.dao.DataAccessException;importorg.springframework.security.core.GrantedAuthority;importorg.springframework.security.core.authority.GrantedAuthorityImpl;importorg.springframework.security.core.userdetails.User;importorg.springframework.security.core.userdetails.UserDetails;importorg.springframework.security.core.userdetails.UserDetailsService;importorg.springframework.security.core.userdetails.UsernameNotFoundException;publicclassMyUserDetailServiceimplementsUserDetailsServiceOverridepublicUserDetailsloadUserByUsername(Stringusername)throwsUsernameNotFoundException,DataAccessExceptionCollectionauths=newArrayList();GrantedAuthorityImplauth2=newGrantedAuthorityImpl(ROLE_ADMIN);auths.add(auth2);if(username.equals(robin1)auths=newArrayList();GrantedAuthorityImplauth1=newGrantedAuthorityImpl(ROLE_ROBIN);auths.add(auth1);/User(Stringusername,Stringpassword,booleanenabled,booleanaccountNonExpired,/booleancredentialsNonExpired,booleanaccountNonLocked,Collectionauthorities)Useruser=newUser(username,robin,true,true,true,true,auths);returnuser;在这个类中,你就可以从数据库中读入用户的密码,角色信息,是否锁定,账号是否过期等,我想这么简单的代码就不再多解释了。5,对于资源的访问权限的定义,我们通过实现FilterInvocationSecurityMetadataSource这个接口来初始化数据。packagecom.robin.erp.fwk.security;importjava.util.ArrayList;importjava.util.Collection;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importorg.springframework.security.access.ConfigAttribute;importorg.springframework.security.access.SecurityConfig;importorg.springframework.security.web.FilterInvocation;ercept.FilterInvocationSecurityMetadataSource;importorg.springframework.security.web.util.AntUrlPathMatcher;importorg.springframework.security.web.util.UrlMatcher;/*此类在初始化时,应该取到所有资源及其对应角色的定义*authorRobin*/publicclassMyInvocationSecurityMetadataSourceimplementsFilterInvocationSecurityMetadataSourceprivateUrlMatcherurlMatcher=newAntUrlPathMatcher();privatestaticMapString,CollectionresourceMap=null;publicMyInvocationSecurityMetadataSource()loadResourceDefine();privatevoidloadResourceDefine()resourceMap=newHashMapString,Collection();Collectionatts=newArrayList();ConfigAttributeca=newSecurityConfig(ROLE_ADMIN);atts.add(ca);resourceMap.put(/index.jsp,atts);resourceMap.put(/i.jsp,atts);/AccordingtoaURL,FindoutpermissionconfigurationofthisURL.publicCollectiongetAttributes(Objectobject)throwsIllegalArgumentException/guessobjectisaURL.Stringurl=(FilterInvocation)object).getRequestUrl();Iteratorite=resourceMap.keySet().iterator();while(ite.hasNext()StringresURL=ite.next();if(urlMatcher.pathMatchesUrl(resURL,url)returnresourceMap.get(resURL);returnnull;publicbooleansupports(Classclazz)returntrue;publicCollectiongetAllConfigAttributes()returnnull;看看loadResourceDefine方法,我在这里,假定index.jsp和i.jsp这两个资源,需要ROLE_ADMIN角色的用户才能访问。这个类中,还有一个最核心的地方,就是提供某个资源对应的权限定义,即getAttributes方法返回的结果。注意,我例子中使用的是 AntUrlPathMatcher这个path matcher来检查URL是否与资源定义匹配,事实上你还要用正则的方式来匹配,或者自己实现一个matcher。6,剩下的就是最终的决策了,make a decision,其实也很容易,呵呵。packagecom.robin.erp.fwk.security;importjava.util.Collection;importjava.util.Iterator;importorg.springframework.security.access.AccessDecisionManager;importorg.springframework.security.access.AccessDeniedException;importorg.springframework.security.access.ConfigAttribute;importorg.springframework.security.access.SecurityConfig;importorg.springframework.security.authentication.InsufficientAuthenticationException;importorg.springframework.security.core.Authentication;importorg.springframework.security.core.GrantedAuthority;publicclassMyAccessDecisionManagerimplementsAccessDecisionManager/Inthismethod,needtocompareauthenticationwithconfigAttributes./1,AobjectisaURL,afilterwasfindpermissionconfigurationbythisURL,andpasstohere./2,Checkauthenticationhasattributeinpermissionconfiguration(configAttributes)/3,Ifnotmatchcorrespondingauthentication,throwaAccessDeniedException.publicvoiddecide(Authenticationauthentication,Objectobject,CollectionconfigAttributes)throwsAccessDeniedException,InsufficientAuthenticationExceptionif(configAttributes=null)return;System.out.println(object.toString();/objectisaURL.Iteratorite=configAttributes.iterator();while(ite.hasNext()ConfigAttributeca=ite.next();StringneedRole=(SecurityConfig)ca).getAttribute();for(GrantedAuthorityga:authentication.getAuthorities()if(needRole.equals(ga.getAuthority()/gaisusersrole.return;thrownewAccessDeniedException(noright);Overridepublicbooleansupports(ConfigAttributeattribute)/TODOAuto-generatedmethodstubreturntrue;Overridepublicbooleansupports(Classclazz)returntrue;在这个类中,最重要的是decide方法,如果不存在对该资源的定义,直接放行;否则,如果找到正确的角色,即认为拥有权限,并放行,否则throw new AccessDeniedException(no right);这样,就会进入上面提到的403.jsp页面。Spring Security3的使用方法有4种:一种是全部利用配置文件,将用户、权限、资源(url)硬编码在xml文件中。二种是用户和权限用数据库存储,而资源(url)和权限的对应采用硬编码配置。三种是细分角色和权限,并将用户、角色、权限和资源均采用数据库存储,并且自定义过滤器,代替原有的FilterSecurityInterceptor过滤器,并分别实现AccessDecisionManager、InvocationSecurityMetadataSourceService和UserDetailsService,并在配置文件中进行相应配置。四是修改spring security的源代码,主要是修改InvocationSecurityMetadataSourceService和UserDetailsService两个类。前者是将配置文件或数据库中存储的资源(url)提取出来加工成为url和权限列表的Map供Security使用,后者提取用户名和权限组成一个完整的 (UserDetails)User对象,该对象可以提供用户的详细信息供AuthentationManager进行认证与授权使用。该方法理论上可行,但是比较暴力,不推荐使用。本文有两个例子,我在简单例子章节实现了第一种方法。在复杂例子章节

温馨提示

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

评论

0/150

提交评论