收藏私塾在线
 

欢迎您来到私塾在线网!   

请登录! 

免费注册 


zhang的笔记
状态: 离线
人气:5023371
访问用户量:4221
笔记经验:
总积分:261656
级别:VIP5
搜索本笔记
ta的交流分类
ta的交流主题贴(544)
ta的所有交流贴(1049)
ta的全部笔记
全部笔记(255)
未分类笔记(1)
Java Web(9)
并发实践(1)
课程问题(0)
Java(22)
架构(1)
缓存(5)
JavaEE(0)
JVM(12)
跟我学spring3(68)
Spring Sec……(43)
Spring 3.x……(25)
Spring Sec……(20)
跟开涛学Spring……(17)
深入剖析Spring……(18)
性能调优(10)
前端(2)
Tomcat源码解读(1)
spring sec……(0)
存档
2014-01(7)
2013-12(10)
2012-10(4)
2012-09(2)
2012-08(31)
2012-07(10)
2012-06(5)
2012-05(41)
2012-04(3)
2012-03(41)
2012-02(54)
2011-11(17)
2011-10(30)

2012-05-10 15:26:04
SecurityContextHolderAwareRequestFilter分析——Spring Security3源码分析
浏览(7954)|评论(0)   交流分类:Java|笔记分类: Spring Sec……

SecurityContextHolderAwareRequestFilter过滤器对应的类路径为 
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter 

从类名称可以猜出这个过滤器主要是包装请求对象request的,看源码 

Java代码    收藏代码
  1. public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)  
  2.         throws IOException, ServletException {  
  3.     chain.doFilter(new SecurityContextHolderAwareRequestWrapper((HttpServletRequest) req, rolePrefix), res);  
  4. }  



SecurityContextHolderAwareRequestWrapper类对request包装的目的主要是实现servlet api的一些接口方法isUserInRole、getRemoteUser 

Java代码    收藏代码
  1. //从SecurityContext中获取认证实体Authentication  
  2. private Authentication getAuthentication() {  
  3.     Authentication auth = SecurityContextHolder.getContext().getAuthentication();  
  4.   
  5.     if (!authenticationTrustResolver.isAnonymous(auth)) {  
  6.         return auth;  
  7.     }  
  8.   
  9.     return null;  
  10. }  
  11.   
  12. //实现getRemoteUser方法。首先获取认证实体,再从认证实体中获取登录账号  
  13. @Override  
  14. public String getRemoteUser() {  
  15.     Authentication auth = getAuthentication();  
  16.   
  17.     if ((auth == null) || (auth.getPrincipal() == null)) {  
  18.         return null;  
  19.     }  
  20.   
  21.     if (auth.getPrincipal() instanceof UserDetails) {  
  22.         return ((UserDetails) auth.getPrincipal()).getUsername();  
  23.     }  
  24.   
  25.     return auth.getPrincipal().toString();  
  26. }  
  27.   
  28. //实现getUserPrincipal方法  
  29. @Override  
  30. public Principal getUserPrincipal() {  
  31.     Authentication auth = getAuthentication();  
  32.   
  33.     if ((auth == null) || (auth.getPrincipal() == null)) {  
  34.         return null;  
  35.     }  
  36.   
  37.     return auth;  
  38. }  
  39.   
  40. //判断是否授权。这里注意一下rolePrefix,就是角色的前缀  
  41. private boolean isGranted(String role) {  
  42.     Authentication auth = getAuthentication();  
  43.   
  44.     if( rolePrefix != null ) {  
  45.         role = rolePrefix + role;  
  46.     }  
  47.   
  48.     if ((auth == null) || (auth.getPrincipal() == null)) {  
  49.         return false;  
  50.     }  
  51.   
  52.     Collection<GrantedAuthority> authorities = auth.getAuthorities();  
  53.   
  54.     if (authorities == null) {  
  55.         return false;  
  56.     }  
  57.   
  58.   
  59.     for (GrantedAuthority grantedAuthority : authorities) {  
  60.         if (role.equals(grantedAuthority.getAuthority())) {  
  61.             return true;  
  62.         }  
  63.     }  
  64.   
  65.     return false;  
  66. }  
  67.   
  68. //实现isUserInRole  
  69. @Override  
  70. public boolean isUserInRole(String role) {  
  71.     return isGranted(role);  
  72. }  



这个过滤器看起来很简单。目的仅仅是实现java ee中servlet api一些接口方法。 
一些应用中直接使用getRemoteUser方法、isUserInRole方法,在使用spring security时其实就是通过这个过滤器来实现的。

 

 

http://sishuok.com/forum/blogPost/list/0/4303.html

 

转载自【http://dead-knight.iteye.com/blog/1513728

作者博客:http://dead-knight.iteye.com/

精品视频课程推荐

深入浅出学Shrio视频教程
内容概述:Shiro是目前最热门、最易用、功能超强大的Java权限管理框架,强烈推荐,每个项目都必备的权限管理技术!通过本课程,你将从零开始直到彻底掌握Shiro的相关开发知识,达到可以进行实际项目开发的能力。包括:权限管理基础、Shiro入门、配置、身份认证、授权、Realms、Session管理、和Spring的集成、Web、Cache等众多开发细节技术 技术要点:源码级分析Shiro的授权过程、自定义开发Realm、多个Realms的开发配置、自定义开发AuthenticationStrategy、自定义开发自定义SessionDAO、和Struts2+Spring3的集成(包括修正struts2的bug)、Shiro和SpringMVC+Spring3的集成、包装使用其他的Cache框架、缓存数据同步更新的解决方案等等实际开发中常用的内容

研磨设计模式——跟着cc学设计系列视频教程
本视频课程是北京Java私塾原创精品书籍《研磨设计模式》一书的配套学习视频,由《研磨设计模式》的第一作者CC录制 课程目标:全面、系统的掌握GoF设计模式的知识,达到可以在实际项目开发中运用的能力 技术要点:如何实现可配置、如何实现缓存以及缓存的管理、如何实现用缓存来控制多实例的创建、如何实现参数化工厂、 如何实现可扩展工厂、如何实现原型管理器、如何实现Java的静态代理和动态代理、如何实现多线程处理队列请求、 如何实现命令的参数化配置、可撤销的操作、宏命令、队列请求和日志请求、如何实现翻页迭代、如何检测环状结构、 如何实现通用的增删改查、如何模拟工作流来处理流程、如何实现简单又通用的XML读取、如何实现模拟AOP的功能......

Ajax+JSON基础实战视频教程
数据校验、Javascript模拟多线程、下拉列表联动、操作XML、AJAX结合JSON的操作、Json-lib的使用

高级软件架构师实战培训阶段一
内容概述:本课程专注于构建:高可扩展性、高性能、大数据量、高并发、分布式的系统架构。 从零开始、全面系统、成体系的软件架构课程,循序渐进的讲述构建上述系统架构所需要的各种技术知识和技能。
技术要点: 1:构建基本的业务功能块,基于Maven+Git+Spring mvc+spring+mybatis+ehcache+mysql+X-gen代码生成
 2:高扩展性的分布式体系架构(基于Nginx+Varnish+Memcache+ActiveMQ)
 3:NoSQL的合理使用和架构优化(基于MongoDB)
 4:分布式文件存储和架构优化(基于MogileFS)

深入浅出学Spring Web MVC视频教程
系统、完整的学习Spring Web MVC开发的知识。包括:Spring Web MVC入门;理解DispatcherServlet;注解式控制器开发详解;数据类型转换;数据格式化;数据验证; 拦截器;对Ajax的支持;文件上传下载;表单标签等内容;最后以一个综合的CRUD带翻页的应用示例来综合所学的知识

浏览(7954)|评论(0)   交流分类:Java|笔记分类: Spring Sec……

评论(0)
请登录后评论 登录

关于我们 | 联系我们 | 用户协议 | 私塾在线服务协议 | 版权声明 | 隐私保护

版权所有 Copyright(C)2009-2012 私塾在线学习网