




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、spring security 原理使用众多的拦截器对 uri拦截,以此来管理权限,是spring security 核心思想。对一般来说,我们的Filter都是配置在 web.xml 中,但是spring security不一样,它在web.xml中配置的只是一个代理,而真正起作用的Filter是作为Bean配置在Spring中的。web.xml中的代理依次调用这些Bean,就实现了对 Web资源的保护,同时这些Filter作为Bean被Spring 管理,所以实现 AOP也很简单,真的是一举两得啊。spring security中提供的Filter不少,有十多个,一个一个学起来比较复杂。但
2、是对于我们Web开发者来说,常用的就那么几个,如下图中的被红圈圈标记出来的:Filter Class2 J.E工 口口目mConcurrentS5 a sianPiIter七m己仁七Pru以u七huntica七金dPrQE2字EngFEJ.七七工SubclassesSecuntyCoDteKtHcldeiAwaieRe quest Fil terAnonymoLisFrocessingFiLterExceptionTxanslationFilterNtlmFrocessingFilterEj.lterSecuritylEiterceptQr J三:二七二 serTr 3C2Bsr.gFzLer
3、 从上到下,它们实现的功能依次是1、制定必须为https连接;2、从Session中提取用户的认证信息;3、退出登录;4、登录;5、记住用户;6、所有的应用必须配置这个Filter。一般来说,我们写 Web应用只需要熟悉这几个 Filter就可以了,如果不需要 https连接, 连第一个也不用熟悉。但是有人肯定会想,这些Filter怎么和我的数据库联系起来呢?不用 着急,这些Filter并不直接处理用户的认证,也不直接处理用户的授权,而是把它们交给了认证管理器和决策管理器。如下图:对于这两种管理器,那也是不需要我们写代码的,spring security也提供了现成的类。那么大家又奇怪了:又是
4、现成的,那怎么和我的数据库关联起来呢?别着急,其实这两个管理器自己也不做事,认证管理器把任务交给了Provider,而决策管理器则把任务交给了Voter ,如下图:现在我要告诉你们,这里的Provider和Voter也是不需要我们写代码的。不要崩溃,快到目标了。spring security 提供了多个Provider的实现类,如果我们想用数据库来储存用户的认证数据,那么我们就选择DaoAuthenticationProvider 。对于Voter ,我们一般选择RoleVoter就够用了,它会根据我们配置文件中的设置来决定是否允许某一个用户访问 制定的Web资源。而DaoAuthentica
5、tionProvider也是不直接操作数据库的,它把任务委托给了UserDetailService ,如下图:认证管理器AuthenticatioManager而我们要做的,就是实现这个UserDetailService 。图画得不好,大家不要见笑,但是说了这么多总算是引出了我们开发中的关键,那就是我们要实现自己的UserDetailService ,它就是连接我们的数据库和spring security的桥梁。UserDetailService的要求也很简单,只需H|一一个返回 org.springframework.security.userdetails.User对象的loadUserB
6、yUsername(String userName)方法。因此,怎么设计数据库都可以,不管我们是用一个表还是两个表还是三个表,也不管我们是用户-授权,还是用户-角色-授权,还是用户-用户组-角色-授权,这些具体的东西spring security统统不关心,它只关心返回的那个User对象,至于怎么从数据库中读取数据,那就是我们自己的事了。反过来再看看上面的过程,我们发现,即使我们要做的只是实现自己的UserDetailService类,但是我们不得不在 Spring中配置那一大堆的 Bean,包括几个Filter ,几个Manager , 几个Provider和Voter ,而这些配置往往都是
7、重复的无谓的。好在 Acegi 2.0 也认识到了 这个问题,所以,它设计了一个 <http> 标签,让spring security的配置得到了简化。下面是spring security中的配置的截图,大家可以看看:卜图是官方文章中的传统Filter设置和<http>元素之间的对应关系:二二。nnuL 二二匚匚 u -日工 n 孑 SiJLtuukos3 n l工工二u 二HrTrpSe 3Jic ftCOTteKt I dt egratiaiaFi lee r75:?sjxe.二 1 andr rc 突学日LgFl 18fJLb£ ktrrwJi'
8、jtnaa.tic* td?£«««i i «-£ SlJbcllHB4it1a 3&二 U ;ES3 z'xL tAc±h.=-7it 工由 mt j. znFTOse-3 - izi gFz Ite-rHrt jl?Frrnf saingFi Itpr5v5ijfltj-CefiteHt!1olcitfE.AvirReqdiest.Fller豆EIE二tw二型型E工二二三三三工.-!. :_ E:c x m 筝工叫 E* Lt «£ExeepicnTraES1atienTilrerSl
9、tLMProcj&ssitigPilwrFl Lter.SaltyrntercptorSuit cW- P=二二= f BLikgFil w £ameipaw Oenent or Altribite二七 tp |' J-Et cr 二up二 - Lizl-ht tp/ gn :吐 工餐nt- mu与ninn-匚口 at cqLhrtphttp./loeput0t*/jcS(9NA阳小http/f orzn-1 口弓二 Hi叮 / htrp-feaai Gi v 1* t-Hpl-p re v 1 s ionZit tp.,二q工?H- e二-mshttp/htpN/A
10、0ttpW&下面的代码是 spring security 中实现 UserDetailService 的范例,在 spring security 的范例中,白衣使用了三个表User、Role、Authority 。但是spring security不关心你用了几个表,它只关心UserDetails 对象。而决定用户能否访问指定Web资源的,是RoleVoter类,无需任何修改它可以工作得很好,唯一的缺点是它只认 ROLE_前缀,所以 搞得白衣的Authority看起来都象角色,不伦不类。package personal.youxia.service.security;import ja
11、va.util.ArrayList;import java.util.List;import org.springframework.beans.factory.annotation.Required;import org.springframework.dao.DataAccessException;import org.springframework.security.GrantedAuthority;import org.springframework.security.GrantedAuthoritylmpl;import org.springframework.security.us
12、erdetails.UserDetails;import org.springframework.security.userdetails.UserDetailsService;import org.springframework.security.userdetails.UsernameNotFoundException;import personal.youxia.entity.user.Authority;import personal.youxia.entity.user.Role;import personal.youxia.entity.user.User;import perso
13、nal.youxia.service.user.UserManager;/* 实现 SpringSecurity 的 UserDetailsService 接口,获取用户 Detail 信息.* author calvin* /public class UserDetailServicelmpl implements UserDetailsService private UserManager userManager;public UserDetails loadUserByUsername(String userName)throwsUsernameNotFoundException, Da
14、taAccessException User user = userManager.getUserByLoginName(userName);if (user = null ) throw new UsernameNotFoundException(userName + "不存在)List<GrantedAuthority> authsList =new ArrayList<GrantedAuthority>();for (Role role : user.getRoles() for (Authority authority : role.getAuths(
15、) authsList.add(newGrantedAuthorityImpl(authority.getName(); / 目前在 MultiDatabaseExample 的 User 类中没有 enabled, accountNonExpired,credentialsNonExpired, accountNonLocked等属性/ 暂时全部设为true,在需要时才添加这些属性 .org.springframework.security.userdetails.User userdetail =neworg.springframework.security.userdetails.User(true , true , true , trueuser.getLoginName(), user.getPassword(),authsList.toArray(new GrantedAuthorityauthsList.size();return userdetail; Requiredpublic void setUserManager(UserManager userManager) this .userManager = userManager; |电 最后再来说说这个命名的问题,我对 Authentication 和Auth
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 无线资金管理办法
- 抚顺疫情管理办法
- 新疆林地管理办法
- 2024年四川省盐源县普通外科学(副高)考试题含答案
- 房票安置管理办法
- 房屋拆改管理办法
- 战略咨询管理办法
- 房产测给管理办法
- 收费退费管理办法
- 林业用水管理办法
- 叶酸发放知识培训课件
- 中小校长考试试题及答案
- 中国海运拼箱行业市场发展前瞻及投资战略研究报告2025-2028版
- 2024ODCC-02007数据中心电能路由器应用白皮书
- 医疗废物处理登记表
- 卷烟真伪鉴别知识
- 药理学绪论-课件
- JGJ106-2014 建筑基桩检测技术规范
- 2022年06月辽宁经济管理干部学院(辽宁经济职业技术学院)公开招聘高层次人才笔试题库含答案解析
- 电脑基础知识培训ppt课件-电脑基础知识培训课件
- 龙湖集团招标管理原则
评论
0/150
提交评论