SpringSecurity原理_第1页
SpringSecurity原理_第2页
SpringSecurity原理_第3页
SpringSecurity原理_第4页
SpringSecurity原理_第5页
已阅读5页,还剩3页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、spri ng security原理使用众多的拦截器对 uri拦截,以此来管理权限,是spring security 核心思想。对Web资源的保护,就是靠 Filter实现的。如下图:一般来说,我们的 Filter都是配置在 web.xml中,但是spring security 不一样,它在 web.xml中配置的只是一个代理,而真正起作用的Filter是作为Bean配置在Spring中的。web.xml中的代理依次调用这些Bean,就实现了对 Web资源的保护,同时这些Filter作为Bean被Spring 管理,所以实现 AOP也很简单,真的是一举两得啊。spring security中提

2、供的Filter不少,有十多个,一个一个学起来比较复杂。但是对于我们Web开发者来说,常用的就那么几个,如下图中的被红圈圈标记出来的:Filter ClasshannelExocessingFiltex匚 ancur rentes sisnFil terAithe nt-calcnfrocess zugFl IterHttpSessionCont巳xtintegratlanFzltezX509FreAuthenticatedFrace33igF3.1terAmtrac七PhuA口七hum七iun七曾dP=n匚昂土n号EJ.J.七w工 Subclasses匚dsFrocesBingFilter3

3、asieETac$ssz.ngFilt5rSecuntyCoDteKtHcldeiAwaieRe quest FilterAnonymoLisFrocessingFiLterNtlmFrocessingFilterEj.lterSecuritylEiterceptQr )二匸 u serTr 3C2Bsr.gFzLer从上到下,它们实现的功能依次是1、制定必须为https连接;2、从Session中提取用户的认证信息;3、退出登录;4、登录;5、记住用户;6、 所有的应用必须配置这个Filter。一般来说,我们写 Web应用只需要熟悉这几个Filter就可以了,如果不需要 https连接,连第

4、一个也不用熟悉。但是有人肯定会想,这些Filter怎么和我的数据库联系起来呢?不用 着急,这些Filter并不直接处理用户的认证,也不直接处理用户的授权,而是把它们交给了认证管理器和决策管理器。如下图:对于这两种管理器,那也是不需要我们写代码的,spri ng security 也提供了现成的类。那么大家又奇怪了:又是现成的,那怎么和我的数据库关联起来呢?别着急,其实这两个管理器自己也不做事,认证管理器把任务交给了Provider,而决策管理器则把任务交给了Voter如下图:现在我要告诉你们,这里的Provider和Voter也是不需要我们写代码的。不要崩溃,快到目标了。spring secu

5、rity 提供了多个Provider的实现类,如果我们想用数据库来储存用 户的认证数据,那么我们就选择DaoAuthentication Provider。对于Voter,我们一般选择RoleVoter就够用了,它会根据我们配置文件中的设置来决定是否允许某一个用户访问 制定的Web资源。而DaoAuthenticationProvider也是不直接操作数据库的,它把任务委托给了UserDetailService,如下图:而我们要做的,就是实现这个UserDetailService。图画得不好,大家不要见笑,但是说了这么多总算是引出了我们开发中的关键,那就是我们要实现自己的UserDetailS

6、ervice ,它就是连接我们的数据库和spring security 的桥梁。UserDetailService 的要求也很简单,只需要- 一个返回 org.spri ngframework.security.userdetails.User对象的loadUserByUsername(Stri ng userName)方法。因此,怎么设计数据库都可以,不管我们是用一个表还是两个表还是三个表,也不管我们是用户-授权,还是用户-角色-授权,还是用户-用户组-角色-授权,这些具体的东西spring security统统不关心,它只关心返回的那个User对象,至于怎么从数据库中读取数据,那就是我们自

7、己的事了。反过来再看看上面的过程,我们发现,即使我们要做的只是实现自己的UserDetailService类,但是我们不得不在 Spring中配置那一大堆的 Bean,包括几个Filter,几个Manager , 几个Provider和Voter,而这些配置往往都是重复的无谓的。好在Acegi 2.0 也认识到了这个问题,所以,它设计了一个 标签,让spring security的配置得到了简化。下面是spring security中的配置的截图,大家可以看看:F图是官方文章中的传统Filter设置和元素之间的对应关系:biterNiHesfiaK Dea nt wAnriHteCea匚 工右

8、哉居n n二亠】二ht tp/ gyy-coat xrcl3sicI n.? egratiasiFi leerhrtphttp-Zlogroutj3r.31rccemaLgFnttp/x5C9icaa?kJbcllHl4l碎Ja hh 启匸-esa 工丄二 t euz.i c.t j. znFTDrze-3 - 13L 孑H*二 Iterfittp i!,? orzi-1 oqm耳n 31 nFre r:f 邮粛 t nqF*iJLtP叮坏/http-fetfli c Lt-ap丄g rc#丄厲 ion芒匚匚 v Hh 亠吨Fz. Lt cchttp/ uGcywsu-?ExcepicnTrR

9、31atienTilwthttpfl IterSeaurltyrrit&rceptht&pSuitch口二 Pxsc*tffLcgFil卞尊 z昭下面的代码是 spring security中实现 UserDetailService 的范例,在 spring security的范例中,白衣使用了三个表User、Role、Authority 。但是spring security 不关心你用了几个表,它只关心UserDetails对象。而决定用户能否访问指定Web资源的,是RoleVoter类,无需任何修改它可以工作得很好,唯一的缺点是它只认ROLE_前缀,所以搞得白衣的Authority看起来都

10、象角色,不伦不类。package pers on al.youxia.service.security;import java.util.ArrayList;import java.util.List;import org.springframework.beans.factory.annotatio“.Required;import org.springframework.dao.DataAccessException;import org.springframework.security.GrantedAuthority;import org.springframework.securit

11、y.GrantedAuthoritylmpl;import org.springframework.security.userdetails.UserDetails;import org.springframework.security.userdetails.UserDetailsService;import org.springframework.security.userdetails.UsernameNotFoundException;import personal.youxia.entity.user.Authority;import personal.youxia.entity.u

12、ser.Role;import personal.youxia.entity.user.User;import personal.youxia.service.user.UserManager;/* 实现 SpringSecurity 的 UserDetailsService 接口 ,获取用户 Detail 信息.* author calv in*/public class UserDetailServicelmplimplements UserDetailsService privateUserMa nager userMa nager;public UserDetails loadUser

13、ByUsername(Str ing userName)throwsUsern ameNotFou ndExcepti on, DataAccessExcepti on User user = userMa nager.getUserByLogi nN ame(userName);if (user = null )throw new UsernameNotFoundException(userName + 不存在);ListGra ntedAuthorityauthsList =new ArrayList();for (Role role : user.getRoles() for (Auth

14、ority authority : role.getAuths() authsList.add(n ewGra ntedAuthoritylmpl(authority.getName();/ 目前在 MultiDatabaseExample 的 User 类中没有 enabled, accou ntNon Expired,crede ntialsN on Expired, accou ntNon Locked等属性/暂时全部设为true,在需要时才添加这些属性.org.spri ngframework.security.userdetails.User userdetail =newtrue

15、, true , true , trueorg.spri ngframework.security.userdetails.User(user.getLogi nN ame(), user.getPassword(),authsList.toArray(new Gran tedAuthorityauthsList.size();return userdetail;Requiredpublic void setUserManager(UserManager userManager) this .userManager = userManager;最后再来说说这个命名的问题,我对Authentication和Authority这两个单词比

温馨提示

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

评论

0/150

提交评论