您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > Spring_Security API解读
用户相关的信息是通过org.springframework.security.core.userdetails.UserDetailsService接口来加载的。该接口的唯一方法是loadUserByUsername(Stringusername),用来根据用户名加载相关的信息。这个方法的返回值是org.springframework.security.core.userdetails.UserDetails接口类型,其中包含了用户的信息,包括用户名、密码、权限。是否启用、是否锁定、是否过期等。其中最重要的是用户权限,由org.springframework.security.core.GrantedAuthority接口来表示。虽然SpringSecurity内部的设计和实现比较复杂,但是一般情况下,开发人员只需要使用它默认提供的实现就可以满足绝大多数情况的需求,而且只需要简单的配置声明即可。使用数据库加载用户信息的时候,所生成的实体类必须有一些基本的信息,这个是框架的约定,这个约定是通过定义UserDetails接口来实现的,也就是你要用我这个框架,那么你就必须给我提供这些信息。publicinterfaceUserDetailsextendsSerializableProvidescoreuserinformation.ImplementationsarenotuseddirectlybySpringSecurityforsecuritypurposes.TheysimplystoreuserinformationwhichislaterencapsulatedintoAuthenticationobjects.Thisallowsnon-securityrelateduserinformation(suchasemailaddresses,telephonenumbersetc)tobestoredinaconvenientlocation.Concreteimplementationsmusttakeparticularcaretoensurethenon-nullcontractdetailedforeachmethodisenforced.SeeUserforareferenceimplementation(whichyoumightliketoextend).Concreteimplementationsshouldbeimmutable(valueobjectsemantics,likeaString).ThisisbecausetheUserDetailswillbestoredincachesandassuchmultiplethreadsmayusethesameinstance.publicinterfaceUserDetailsServiceDefinesaninterfaceforimplementationsthatwishtoprovidedataaccessservicestotheDaoAuthenticationProvider.Theinterfacerequiresonlyoneread-onlymethod,whichsimplifiessupportofnewdataaccessstrategies.1、声明使用数据库来保存用户信息beanid=dataSourceclass=org.springframework.jdbc.datasource.DriverManagerDataSourcepropertyname=driverClassNamevalue=org.apache.derby.jdbc.ClientDriver/propertyname=urlvalue=jdbc:derby://localhost:1527/mycompany/propertyname=usernamevalue=app/propertyname=passwordvalue=admin//beanbeanid=userDetailsServiceclass=org.springframework.security.core.userdetails.jdbc.JdbcDaoImplpropertyname=dataSourceref=dataSource//beansec:authentication-managersec:authentication-provideruser-service-ref=userDetailsService//sec:authentication-manager首先定义了一个使用ApacheDerby数据库的数据源,SpringSecurity的org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl类使用该数据源来加载用户信息。最后配置认证管理器使用该UserDetailsService。3、publicinterfaceSecurityContextextendsSerializableInterfacedefiningtheminimumsecurityinformationassociatedwiththecurrentthreadofexecution.ThesecuritycontextisstoredinaSecurityContextHolder.org.springframework.security.core.context.SecurityContext接口表示的是当前应用的安全上下文。通过此接口可以获取和设置当前的认证对象。publicinterfaceAuthenticationextendsPrincipal,SerializableRepresentsanauthenticationrequest.AnAuthenticationobjectisnotconsideredauthenticateduntilitisprocessedbyanAuthenticationManager.StoredinarequestSecurityContext.org.springframework.security.core.Authentication接口用来表示认证对象。通过认证对象的方法可以判断当前用户是否已经通过认证,以及获取当前认证用户的相关信息,包括用户名、密码和权限等。要使用此认证对象,首先需要获取到SecurityContext对象。通过org.springframework.security.core.context.SecurityContextHolder类提供的静态方法getContext()就可以获取。再通过SecurityContext对象的getAuthentication()就可以得到认证对象。通过认证对象的getPrincipal()方法就可以获得当前的认证主体,通常是UserDetails接口的实现。处理过程:典型的认证过程就是当用户输入了用户名和密码之后,UserDetailService通过用户名找到对应的UserDetails对象,接着比较密码是否匹配。如果不匹配,则返回出错信息;如果匹配的话,说明用户认证成功,就创建一个Authentication的对象,如org.springframework.security.authentication.UsernamePasswordAuthenticationToken类的对象。再通过SecurityContext的setAuthentication()方法来设置此认证对象。publicclassFilterSecurityInterceptorextendsAbstractSecurityInterceptorimplementsFilter,OrderedPerformssecurityhandlingofHTTPresourcesviaafilterimplementation.TheObjectDefinitionSourcerequiredbythissecurityinterceptorisoftypeFilterInvocationDefinitionSource.RefertoAbstractSecurityInterceptorfordetailsontheworkflow.通过实现Filter接口来完成对HTTP资源的安全控制。FilterSecurityInterceptor要求有一个FilterInvocationDefinitionSource类型的ObjectDefinitonSource参数。参考AbstractSecurityInterceptor获得更多的工作流程细节。FilterSecurityInterceptor从名字来看好像是一个拦截器,但是从上面可以看出它实现了Filter接口。所以这个伪Interceptor可以直接处理request请求,它里面有这样的方法:doFilterpublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletExceptionMethodthatisactuallycalledbythefilterchain.Simplydelegatestotheinvoke(FilterInvocation)method.publicabstractclassAbstractSecurityInterceptorextendsObjectimplementsInitializingBean,ApplicationEventPublisherAware,MessageSourceAwareAbstractclassthatimplementssecurityinterceptionforsecureobjects.TheAbstractSecurityInterceptorwillensuretheproperstartupconfigurationofthesecurityinterceptor.Itwillalsoimplementtheproperhandlingofsecureobjectinvocations,namely:这一个实现对安全对象安全管理的抽象类。AbstractSecurityInterceptor将会保证安全拦截的正确启动配置。也会实现对安全对象调用的恰当管理,也就是:1.ObtaintheAuthenticationobjectfromtheSecurityContextHolder.从SecurityContextHolder中获得Authentication对象。2.DetermineiftherequestrelatestoasecuredorpublicinvocationbylookingupthesecureobjectrequestagainsttheObjectDefinitionSource.如果请求关系到一个安全的或者是公共的调用就通过去查找ObjectDefinitionSource确定是否一个安全的对象请求。3.Foraninvocationthatissecured(thereisaConfigAttributeDefinitionforthesecureobjectinvocation):a.IfeithertheAuthentication.isAuthenticated()returnsfalse,orthealwaysReauthenticateistrue,authenticatetherequestagainsttheconfiguredAuthentica
本文标题:Spring_Security API解读
链接地址:https://www.777doc.com/doc-1085114 .html