ImageVerifierCode 换一换
格式:DOCX , 页数:32 ,大小:63.46KB ,
资源ID:3380202      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3380202.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(spring security讲解.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

spring security讲解.docx

1、spring security讲解论坛上看了不少Spring Security的相关文章。这些文章基本上都还是基于Acegi-1.X的配置方式,而主要的配置示例也来自于SpringSide的贡献。众所周知,Spring Security针对Acegi的一个重大的改进就在于其配置方式大大简化了。所以如果配置还是基于Acegi-1.X这样比较繁琐的配置方式的话,那么我们还不如直接使用Acegi而不要去升级了。所以在这里,我将结合一个示例,重点讨论一下Spring Security 2是如何进行配置简化的。搭建基础环境首先我们为示例搭建基本的开发环境,环境的搭建方式,可以参考我的另外一篇文章:整个环

2、境的搭建包括:创建合适的目录结构、加入了合适的Library,加入了基本的Jetty启动类、加入基本的配置文件等。最终的项目结构,可以参考我的附件。参考文档这里主要的参考文档是Spring Security的自带的Reference。网络上有一个它的中文翻译,地址如下:除此之外,springside有一个比较完整的例子,不过是基于Acegi的,我也参阅了其中的一些实现。Spring Security基本配置Spring Security是基于Spring的的权限认证框架,对于Spring和Acegi已经比较熟悉的同学对于之前的配置方式应该已经非常了解。接下来的例子,将向大家展示Spring S

3、ecurity基于schema的配置方式。最小化配置1. 在web.xml文件中加入Filter声明Xml代码1. 2. 3. springSecurityFilterChain4. org.springframework.web.filter.DelegatingFilterProxy5. 6. 7. springSecurityFilterChain8. /*9. 这个Filter会拦截所有的URL请求,并且对这些URL请求进行Spring Security的验证。注意,springSecurityFilterChain这个名称是由命名空间默认创建的用于处理web安全的一个内部的bean的

4、id。所以你在你的Spring配置文件中,不应该再使用这个id作为你的bean。与Acegi的配置不同,Acegi需要自行声明一个Spring的bean来作为Filter的实现,而使用Spring Security后,无需再额外定义bean,而是使用元素进行配置。2. 使用最小的配置Xml代码1. 2. 3. 这段配置表示:我们要保护应用程序中的所有URL,只有拥有ROLE_USER角色的用户才能访问。你可以使用多个元素为不同URL的集合定义不同的访问需求,它们会被归入一个有序队列中,每次取出最先匹配的一个元素使用。 所以你必须把期望使用的匹配条件放到最上边。3. 配置UserDetailsS

5、ervice来指定用户和权限接下来,我们来配置一个UserDetailsService来指定用户和权限:Xml代码1. 2. 3. 4. 5. 6. 7. 在这里,downpour拥有ROLE_USER和ROLE_ADMIN的权限,robbin拥有ROLE_USER权限,QuakeWang拥有ROLE_ADMIN的权限4. 小结有了以上的配置,你已经可以跑简单的Spring Security的应用了。只不过在这里,我们还缺乏很多基本的元素,所以我们尚不能对上面的代码进行完整性测试。如果你具备Acegi的知识,你会发现,有很多Acegi中的元素,在Spring Security中都没有了,这些元

6、素包括:表单和基本登录选项、密码编码器、Remember-Me认证等等。接下来,我们就来详细剖析一下Spring Security中的这些基本元素。剖析基本配置元素1. 有关auto-config属性在上面用到的auto-config属性,其实是下面这些配置的缩写:Xml代码1. 2. 3. 4. 5. 6. 7. 8. 这些元素分别与登录认证,匿名认证,基本认证,注销处理和remember-me对应。 他们拥有各自的属性,可以改变他们的具体行为。这样,我们在Acegi中所熟悉的元素又浮现在我们的面前。只是在这里,我们使用的是命名空间而已。2. 与Acegi的比较我们仔细观察一下没有auto-

7、config的那段XML配置,是不是熟悉多了?让我们来将基于命名空间的配置与传统的Acegi的bean的配置做一个比较,我们会发现以下的区别:1) 基于命名空间的配置更加简洁,可维护性更强例如,基于命名空间进行登录认证的配置代码,可能像这样:Xml代码1. 如果使用老的Acegi的Bean的定义方式,可能像这样:Xml代码1. 3. 5. 7. 8. 10. 11. 这样的例子很多,有兴趣的读者可以一一进行比较。2) 基于命名空间的配置,我们无需再担心由于过滤器链的顺序而导致的错误以前,Acegi在缺乏默认内置配置的情况下,你需要自己来定义所有的bean,并指定这些bean在过滤器链中的顺序。

8、一旦顺序错了,很容易发生错误。而现在,过滤器链的顺序被默认指定,你不需要在担心由于顺序的错误而导致的错误。3. 过滤器链在哪里到目前为止,我们都还没有讨论过整个Spring Security的核心部分:过滤器链。在原本Acegi的配置中,我们大概是这样配置我们的过滤器链的:Xml代码1. 3. 4. 5. CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON6. PATTERN_TYPE_APACHE_ANT7. /common/*=#NONE#8. /css/*=#NONE#9. /images/*=#NONE#10. /js/*=#NONE#11. /log

9、in.jsp=#NONE#12. /*=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter,exceptionTranslationFilter,filterSecurityInterceptor13. 14. 15. 其中,每个过滤器链都将对应于Spring配置文件中的bean的id。现在,在Spring Security中,我们将看不到这些配置,这些配置都被内置在节点中。让我们来看看这些默认的,已经被内置

10、的过滤器:这些过滤器已经被Spring容器默认内置注册,这也就是我们不再需要在配置文件中定义那么多bean的原因。同时,过滤器顺序在使用命名空间的时候是被严格执行的。它们在初始化的时候就预先被排好序。不仅如此,Spring Security规定,你不能替换那些元素自己使用而创建出的过滤器,比如HttpSessionContextIntegrationFilter, ExceptionTranslationFilter 或 FilterSecurityInterceptor。当然,这样的规定是否合理,有待进一步讨论。因为实际上在很多时候,我们希望覆盖过滤器链中的某个过滤器的默认行为。而Sprin

11、g Security的这种规定在一定程度上限制了我们的行为。不过Spring Security允许你把你自己的过滤器添加到队列中,使用custom-filter元素,并且指定你的过滤器应该出现的位置:Xml代码1. 2. 3. 不仅如此,你还可以使用after或before属性,如果你想把你的过滤器添加到队列中另一个过滤器的前面或后面。 可以分别在position属性使用FIRST或LAST来指定你想让你的过滤器出现在队列元素的前面或后面。这个特性或许能够在一定程度上弥补Spring Security的死板规定,而在之后的应用中,我也会把它作为切入点,对资源进行管理。另外,我需要补充一点的是,

12、对于在http/intercept-url中没有进行定义的URL,将会默认使用系统内置的过滤器链进行权限认证。所以,你并不需要在http/intercept-url中额外定义一个类似/*的匹配规则。使用数据库对用户和权限进行管理一般来说,我们都有使用数据库对用户和权限进行管理的需求,而不会把用户写死在配置文件里。所以,我们接下来就重点讨论使用数据库对用户和权限进行管理的方法。用户和权限的关系设计在此之前,我们首先需要讨论一下用户(User)和权限(Role)之间的关系。Spring Security在默认情况下,把这两者当作一对多的关系进行处理。所以,在Spring Security中对这两个

13、对象所采用的表结构关系大概像这样:Java代码1. CREATETABLEusers(2. usernameVARCHAR(50)NOTNULLPRIMARYKEY,3. passwordVARCHAR(50)NOTNULL,4. enabledBITNOTNULL5. );6. 7. CREATETABLEauthorities(8. usernameVARCHAR(50)NOTNULL,9. authorityVARCHAR(50)NOTNULL10. );不过这种设计方式在实际生产环境中基本上不会采用。一般来说,我们会使用逻辑主键ID来标示每个User和每个Authorities(Rol

14、e)。而且从典型意义上讲,他们之间是一个多对多的关系,我们会采用3张表来表示,下面是我在MySQL中建立的3张表的schema示例:Java代码1. CREATETABLEuser(2. idint(11)NOTNULLauto_increment,3. namevarchar(255)defaultNULL,4. passwordvarchar(255)defaultNULL,5. disabledint(1)NOTNULL,6. PRIMARYKEY(id)7. )ENGINE=InnoDBDEFAULTCHARSET=utf8;8. 9. CREATETABLErole(10. idin

15、t(11)NOTNULLauto_increment,11. namevarchar(255)defaultNULL,12. PRIMARYKEY(id)13. )ENGINE=InnoDBDEFAULTCHARSET=utf8;14. 15. CREATETABLEuser_role(16. user_idint(11)NOTNULL,17. role_idint(11)NOTNULL,18. PRIMARYKEY(user_id,role_id),19. UNIQUEKEYrole_id(role_id),20. KEYFK143BF46AF6AD4381(user_id),21. KEY

16、FK143BF46A51827FA1(role_id),22. CONSTRAINTFK143BF46A51827FA1FOREIGNKEY(role_id)REFERENCESrole(id),23. CONSTRAINTFK143BF46AF6AD4381FOREIGNKEY(user_id)REFERENCESuser(id)24. )ENGINE=InnoDBDEFAULTCHARSET=utf8;通过配置SQL来模拟用户和权限有了数据库的表设计,我们就可以在Spring Security中,通过配置SQL,来模拟用户和权限,这依然通过来完成:Xml代码1. 2. 5. 这里给出的是一

17、个使用SQL进行模拟用户和权限的示例。其中你需要为运行SQL准备相应的dataSource。这个dataSource应该对应于Spring中的某个bean的定义。从这段配置模拟用户和权限的情况来看,实际上Spring Security对于用户,需要username,password,accountEnabled三个字段。对于权限,它需要的是username和authority2个字段。也就是说,如果我们能够通过其他的方式,模拟上面的这些对象,并插入到Spring Security中去,我们同样能够实现用户和权限的认证。接下来,我们就来看看我们如何通过自己的实现,来完成这件事情。通过扩展Spri

18、ng Security的默认实现来进行用户和权限的管理事实上,Spring Security提供了2个认证的接口,分别用于模拟用户和权限,以及读取用户和权限的操作方法。这两个接口分别是:UserDetails和UserDetailsService。Java代码1. publicinterfaceUserDetailsextendsSerializable2. 3. GrantedAuthoritygetAuthorities();4. 5. StringgetPassword();6. 7. StringgetUsername();8. 9. booleanisAccountNonExpire

19、d();10. 11. booleanisAccountNonLocked();12. 13. booleanisCredentialsNonExpired();14. 15. booleanisEnabled();16. Java代码1. publicinterfaceUserDetailsService2. UserDetailsloadUserByUsername(Stringusername)3. throwsUsernameNotFoundException,DataAccessException;4. 非常清楚,一个接口用于模拟用户,另外一个用于模拟读取用户的过程。所以我们可以通过

20、实现这两个接口,来完成使用数据库对用户和权限进行管理的需求。在这里,我将给出一个使用Hibernate来定义用户和权限之间关系的示例。1. 定义User类和Role类,使他们之间形成多对多的关系Java代码1. Entity2. Proxy(lazy=false)3. Cache(usage=CacheConcurrencyStrategy.READ_WRITE)4. publicclassUser5. 6. privatestaticfinallongserialVersionUID=8026813053768023527L;7. 8. Id9. GeneratedValue10. privateIntegerid;11. 12. privateStringname;13. 14. privateStringpassword;15. 16. privatebooleandisabled;17. 18. ManyToMany(targetEntity=Role.class,fetch=FetchTy

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1